@cleocode/caamp 0.1.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.
- package/README.md +85 -0
- package/dist/chunk-63BH7QMR.js +1998 -0
- package/dist/chunk-63BH7QMR.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +941 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +465 -0
- package/dist/index.js +119 -0
- package/dist/index.js.map +1 -0
- package/package.json +70 -0
- package/providers/registry.json +721 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/providers.ts","../src/commands/skills/install.ts","../src/core/sources/github.ts","../src/core/sources/gitlab.ts","../src/commands/skills/remove.ts","../src/commands/skills/list.ts","../src/commands/skills/find.ts","../src/commands/skills/check.ts","../src/commands/skills/update.ts","../src/commands/skills/init.ts","../src/commands/skills/audit.ts","../src/commands/skills/validate.ts","../src/commands/skills/index.ts","../src/commands/mcp/install.ts","../src/commands/mcp/remove.ts","../src/commands/mcp/list.ts","../src/commands/mcp/detect.ts","../src/commands/mcp/index.ts","../src/commands/instructions/inject.ts","../src/commands/instructions/check.ts","../src/commands/instructions/update.ts","../src/commands/instructions/index.ts","../src/commands/config.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * CAAMP CLI - Central AI Agent Managed Packages\n */\n\nimport { Command } from \"commander\";\nimport { registerProvidersCommand } from \"./commands/providers.js\";\nimport { registerSkillsCommands } from \"./commands/skills/index.js\";\nimport { registerMcpCommands } from \"./commands/mcp/index.js\";\nimport { registerInstructionsCommands } from \"./commands/instructions/index.js\";\nimport { registerConfigCommand } from \"./commands/config.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"caamp\")\n .description(\"Central AI Agent Managed Packages - unified provider registry and package manager\")\n .version(\"0.1.0\");\n\n// Register command groups\nregisterProvidersCommand(program);\nregisterSkillsCommands(program);\nregisterMcpCommands(program);\nregisterInstructionsCommands(program);\nregisterConfigCommand(program);\n\nprogram.parse();\n","/**\n * providers list|detect|show commands\n */\n\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport {\n getAllProviders,\n getProvider,\n getProviderCount,\n getRegistryVersion,\n getProvidersByPriority,\n} from \"../core/registry/providers.js\";\nimport { detectAllProviders, detectProjectProviders } from \"../core/registry/detection.js\";\n\nexport function registerProvidersCommand(program: Command): void {\n const providers = program\n .command(\"providers\")\n .description(\"Manage AI agent providers\");\n\n providers\n .command(\"list\")\n .description(\"List all supported providers\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--tier <tier>\", \"Filter by priority tier (high, medium, low)\")\n .action(async (opts: { json?: boolean; tier?: string }) => {\n const all = opts.tier\n ? getProvidersByPriority(opts.tier as \"high\" | \"medium\" | \"low\")\n : getAllProviders();\n\n if (opts.json) {\n console.log(JSON.stringify(all, null, 2));\n return;\n }\n\n console.log(pc.bold(`\\nCAMP Provider Registry v${getRegistryVersion()}`));\n console.log(pc.dim(`${getProviderCount()} providers\\n`));\n\n // Group by priority\n const tiers = [\"high\", \"medium\", \"low\"] as const;\n for (const tier of tiers) {\n const tierProviders = all.filter((p) => p.priority === tier);\n if (tierProviders.length === 0) continue;\n\n const tierLabel = tier === \"high\" ? pc.green(\"HIGH\") : tier === \"medium\" ? pc.yellow(\"MEDIUM\") : pc.dim(\"LOW\");\n console.log(`${tierLabel} priority:`);\n\n for (const p of tierProviders) {\n const status = p.status === \"active\"\n ? pc.green(\"active\")\n : p.status === \"beta\"\n ? pc.yellow(\"beta\")\n : pc.dim(p.status);\n\n console.log(` ${pc.bold(p.agentFlag.padEnd(20))} ${p.toolName.padEnd(22)} ${p.vendor.padEnd(16)} [${status}]`);\n }\n console.log();\n }\n });\n\n providers\n .command(\"detect\")\n .description(\"Auto-detect installed providers\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--project\", \"Include project-level detection\")\n .action(async (opts: { json?: boolean; project?: boolean }) => {\n const results = opts.project\n ? detectProjectProviders(process.cwd())\n : detectAllProviders();\n\n const installed = results.filter((r) => r.installed);\n\n if (opts.json) {\n console.log(JSON.stringify(installed.map((r) => ({\n id: r.provider.id,\n toolName: r.provider.toolName,\n methods: r.methods,\n projectDetected: r.projectDetected,\n })), null, 2));\n return;\n }\n\n console.log(pc.bold(`\\nDetected ${installed.length} installed providers:\\n`));\n\n for (const r of installed) {\n const methods = r.methods.join(\", \");\n const project = r.projectDetected ? pc.green(\" [project]\") : \"\";\n console.log(` ${pc.green(\"✓\")} ${pc.bold(r.provider.toolName.padEnd(22))} via ${pc.dim(methods)}${project}`);\n }\n\n const notInstalled = results.filter((r) => !r.installed);\n if (notInstalled.length > 0) {\n console.log(pc.dim(`\\n ${notInstalled.length} providers not detected`));\n }\n\n console.log();\n });\n\n providers\n .command(\"show\")\n .description(\"Show provider details\")\n .argument(\"<id>\", \"Provider ID or alias\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (id: string, opts: { json?: boolean }) => {\n const provider = getProvider(id);\n\n if (!provider) {\n console.error(pc.red(`Provider not found: ${id}`));\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(provider, null, 2));\n return;\n }\n\n console.log(pc.bold(`\\n${provider.toolName}`));\n console.log(pc.dim(`by ${provider.vendor}\\n`));\n\n console.log(` ID: ${provider.id}`);\n console.log(` Flag: --agent ${provider.agentFlag}`);\n if (provider.aliases.length > 0) {\n console.log(` Aliases: ${provider.aliases.join(\", \")}`);\n }\n console.log(` Status: ${provider.status}`);\n console.log(` Priority: ${provider.priority}`);\n console.log();\n console.log(` Instruction: ${provider.instructFile}`);\n console.log(` Config format: ${provider.configFormat}`);\n console.log(` Config key: ${provider.configKey}`);\n console.log(` Transports: ${provider.supportedTransports.join(\", \")}`);\n console.log(` Headers: ${provider.supportsHeaders ? \"yes\" : \"no\"}`);\n console.log();\n console.log(pc.dim(\" Paths:\"));\n console.log(` Global dir: ${provider.pathGlobal}`);\n console.log(` Project dir: ${provider.pathProject || \"(none)\"}`);\n console.log(` Global config: ${provider.configPathGlobal}`);\n console.log(` Project config: ${provider.configPathProject || \"(none)\"}`);\n console.log(` Global skills: ${provider.pathSkills}`);\n console.log(` Project skills: ${provider.pathProjectSkills || \"(none)\"}`);\n console.log();\n });\n}\n","/**\n * skills install command\n */\n\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { parseSource, isMarketplaceScoped } from \"../../core/sources/parser.js\";\nimport { installSkill } from \"../../core/skills/installer.js\";\nimport { recordSkillInstall } from \"../../core/skills/lock.js\";\nimport { getInstalledProviders } from \"../../core/registry/detection.js\";\nimport { getProvider } from \"../../core/registry/providers.js\";\nimport { cloneRepo } from \"../../core/sources/github.js\";\nimport { cloneGitLabRepo } from \"../../core/sources/gitlab.js\";\nimport { MarketplaceClient } from \"../../core/marketplace/client.js\";\nimport type { Provider } from \"../../types.js\";\n\nexport function registerSkillsInstall(parent: Command): void {\n parent\n .command(\"install\")\n .description(\"Install a skill from GitHub, URL, or marketplace\")\n .argument(\"<source>\", \"Skill source (GitHub URL, owner/repo, @author/name)\")\n .option(\"-a, --agent <name>\", \"Target specific agent(s)\", (v, prev: string[]) => [...prev, v], [])\n .option(\"-g, --global\", \"Install globally\")\n .option(\"-y, --yes\", \"Skip confirmation\")\n .option(\"--all\", \"Install to all detected agents\")\n .action(async (source: string, opts: {\n agent: string[];\n global?: boolean;\n yes?: boolean;\n all?: boolean;\n }) => {\n // Determine target providers\n let providers: Provider[];\n\n if (opts.all) {\n providers = getInstalledProviders();\n } else if (opts.agent.length > 0) {\n providers = opts.agent\n .map((a) => getProvider(a))\n .filter((p): p is Provider => p !== undefined);\n } else {\n providers = getInstalledProviders();\n }\n\n if (providers.length === 0) {\n console.error(pc.red(\"No target providers found. Use --agent or --all.\"));\n process.exit(1);\n }\n\n console.log(pc.dim(`Installing to ${providers.length} provider(s)...`));\n\n let localPath: string;\n let cleanup: (() => Promise<void>) | undefined;\n let skillName: string;\n let sourceValue: string;\n let sourceType = \"github\" as const;\n\n // Handle marketplace scoped names\n if (isMarketplaceScoped(source)) {\n console.log(pc.dim(`Searching marketplace for ${source}...`));\n const client = new MarketplaceClient();\n const skill = await client.getSkill(source);\n\n if (!skill) {\n console.error(pc.red(`Skill not found: ${source}`));\n process.exit(1);\n }\n\n console.log(` Found: ${pc.bold(skill.name)} by ${skill.author} (${pc.dim(skill.repoFullName)})`);\n\n const parsed = parseSource(skill.githubUrl);\n if (parsed.type !== \"github\" || !parsed.owner || !parsed.repo) {\n console.error(pc.red(\"Could not resolve GitHub source\"));\n process.exit(1);\n }\n\n const result = await cloneRepo(parsed.owner, parsed.repo, parsed.ref, skill.path ? skill.path.replace(/\\/SKILL\\.md$/, \"\") : undefined);\n localPath = result.localPath;\n cleanup = result.cleanup;\n skillName = skill.name;\n sourceValue = skill.githubUrl;\n } else {\n // Parse source\n const parsed = parseSource(source);\n skillName = parsed.inferredName;\n sourceValue = parsed.value;\n\n if (parsed.type === \"github\" && parsed.owner && parsed.repo) {\n const result = await cloneRepo(parsed.owner, parsed.repo, parsed.ref, parsed.path);\n localPath = result.localPath;\n cleanup = result.cleanup;\n } else if (parsed.type === \"gitlab\" && parsed.owner && parsed.repo) {\n const result = await cloneGitLabRepo(parsed.owner, parsed.repo, parsed.ref, parsed.path);\n localPath = result.localPath;\n cleanup = result.cleanup;\n } else if (parsed.type === \"local\") {\n localPath = parsed.value;\n } else {\n console.error(pc.red(`Unsupported source type: ${parsed.type}`));\n process.exit(1);\n }\n }\n\n try {\n const result = await installSkill(\n localPath,\n skillName,\n providers,\n opts.global ?? false,\n );\n\n if (result.success) {\n console.log(pc.green(`\\n✓ Installed ${pc.bold(skillName)}`));\n console.log(` Canonical: ${pc.dim(result.canonicalPath)}`);\n console.log(` Linked to: ${result.linkedAgents.join(\", \")}`);\n\n // Record in lock file\n await recordSkillInstall(\n skillName,\n source,\n sourceValue,\n sourceType,\n result.linkedAgents,\n result.canonicalPath,\n opts.global ?? false,\n );\n }\n\n if (result.errors.length > 0) {\n console.log(pc.yellow(\"\\nWarnings:\"));\n for (const err of result.errors) {\n console.log(` ${pc.yellow(\"!\")} ${err}`);\n }\n }\n } finally {\n if (cleanup) await cleanup();\n }\n });\n}\n","/**\n * GitHub fetcher for skill/MCP sources\n *\n * Clones repos or fetches specific paths via simple-git.\n */\n\nimport { simpleGit } from \"simple-git\";\nimport { mkdtemp, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\n\nexport interface GitFetchResult {\n localPath: string;\n cleanup: () => Promise<void>;\n}\n\n/** Clone a GitHub repo to a temp directory */\nexport async function cloneRepo(\n owner: string,\n repo: string,\n ref?: string,\n subPath?: string,\n): Promise<GitFetchResult> {\n const tmpDir = await mkdtemp(join(tmpdir(), \"caamp-\"));\n const repoUrl = `https://github.com/${owner}/${repo}.git`;\n\n const git = simpleGit();\n\n const cloneOptions = [\"--depth\", \"1\"];\n if (ref) {\n cloneOptions.push(\"--branch\", ref);\n }\n\n await git.clone(repoUrl, tmpDir, cloneOptions);\n\n const localPath = subPath ? join(tmpDir, subPath) : tmpDir;\n\n return {\n localPath,\n cleanup: async () => {\n try {\n await rm(tmpDir, { recursive: true });\n } catch {\n // Ignore cleanup errors\n }\n },\n };\n}\n\n/** Fetch a specific file from GitHub using the raw API */\nexport async function fetchRawFile(\n owner: string,\n repo: string,\n path: string,\n ref = \"main\",\n): Promise<string | null> {\n const url = `https://raw.githubusercontent.com/${owner}/${repo}/${ref}/${path}`;\n\n try {\n const response = await fetch(url);\n if (!response.ok) return null;\n return await response.text();\n } catch {\n return null;\n }\n}\n\n/** Check if a GitHub repo exists */\nexport async function repoExists(owner: string, repo: string): Promise<boolean> {\n try {\n const response = await fetch(`https://api.github.com/repos/${owner}/${repo}`, {\n method: \"HEAD\",\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n","/**\n * GitLab fetcher for skill/MCP sources\n */\n\nimport { simpleGit } from \"simple-git\";\nimport { mkdtemp, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { GitFetchResult } from \"./github.js\";\n\n/** Clone a GitLab repo to a temp directory */\nexport async function cloneGitLabRepo(\n owner: string,\n repo: string,\n ref?: string,\n subPath?: string,\n): Promise<GitFetchResult> {\n const tmpDir = await mkdtemp(join(tmpdir(), \"caamp-gl-\"));\n const repoUrl = `https://gitlab.com/${owner}/${repo}.git`;\n\n const git = simpleGit();\n\n const cloneOptions = [\"--depth\", \"1\"];\n if (ref) {\n cloneOptions.push(\"--branch\", ref);\n }\n\n await git.clone(repoUrl, tmpDir, cloneOptions);\n\n const localPath = subPath ? join(tmpDir, subPath) : tmpDir;\n\n return {\n localPath,\n cleanup: async () => {\n try {\n await rm(tmpDir, { recursive: true });\n } catch {\n // Ignore cleanup errors\n }\n },\n };\n}\n\n/** Fetch a specific file from GitLab using the raw API */\nexport async function fetchGitLabRawFile(\n owner: string,\n repo: string,\n path: string,\n ref = \"main\",\n): Promise<string | null> {\n const encodedPath = encodeURIComponent(path);\n const url = `https://gitlab.com/${owner}/${repo}/-/raw/${ref}/${encodedPath}`;\n\n try {\n const response = await fetch(url);\n if (!response.ok) return null;\n return await response.text();\n } catch {\n return null;\n }\n}\n","/**\n * skills remove command\n */\n\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { removeSkill, listCanonicalSkills } from \"../../core/skills/installer.js\";\nimport { removeSkillFromLock } from \"../../core/skills/lock.js\";\nimport { getInstalledProviders } from \"../../core/registry/detection.js\";\n\nexport function registerSkillsRemove(parent: Command): void {\n parent\n .command(\"remove\")\n .description(\"Remove installed skill(s)\")\n .argument(\"[name]\", \"Skill name to remove\")\n .option(\"-g, --global\", \"Remove from global scope\")\n .option(\"-y, --yes\", \"Skip confirmation\")\n .action(async (name: string | undefined, opts: { global?: boolean; yes?: boolean }) => {\n const providers = getInstalledProviders();\n\n if (name) {\n const result = await removeSkill(name, providers, opts.global ?? false);\n\n if (result.removed.length > 0) {\n console.log(pc.green(`✓ Removed ${pc.bold(name)} from: ${result.removed.join(\", \")}`));\n await removeSkillFromLock(name);\n } else {\n console.log(pc.yellow(`Skill ${name} not found in any provider.`));\n }\n\n if (result.errors.length > 0) {\n for (const err of result.errors) {\n console.log(pc.red(` ${err}`));\n }\n }\n } else {\n // Interactive mode - list and select\n const skills = await listCanonicalSkills();\n if (skills.length === 0) {\n console.log(pc.dim(\"No skills installed.\"));\n return;\n }\n\n console.log(pc.bold(\"Installed skills:\"));\n for (const s of skills) {\n console.log(` ${s}`);\n }\n console.log(pc.dim(\"\\nUse: caamp skills remove <name>\"));\n }\n });\n}\n","/**\n * skills list command\n */\n\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { discoverSkills, discoverSkillsMulti } from \"../../core/skills/discovery.js\";\nimport { listCanonicalSkills } from \"../../core/skills/installer.js\";\nimport { getProvider } from \"../../core/registry/providers.js\";\nimport { getInstalledProviders } from \"../../core/registry/detection.js\";\nimport { join } from \"node:path\";\n\nexport function registerSkillsList(parent: Command): void {\n parent\n .command(\"list\")\n .description(\"List installed skills\")\n .option(\"-g, --global\", \"List global skills\")\n .option(\"-a, --agent <name>\", \"List skills for specific agent\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts: { global?: boolean; agent?: string; json?: boolean }) => {\n let dirs: string[] = [];\n\n if (opts.agent) {\n const provider = getProvider(opts.agent);\n if (!provider) {\n console.error(pc.red(`Provider not found: ${opts.agent}`));\n process.exit(1);\n }\n dirs = opts.global\n ? [provider.pathSkills]\n : [join(process.cwd(), provider.pathProjectSkills)];\n } else if (opts.global) {\n // List from all installed providers' global skill dirs\n const providers = getInstalledProviders();\n dirs = providers.map((p) => p.pathSkills).filter(Boolean);\n } else {\n // List from all installed providers' project skill dirs\n const providers = getInstalledProviders();\n dirs = providers\n .map((p) => join(process.cwd(), p.pathProjectSkills))\n .filter(Boolean);\n }\n\n const skills = await discoverSkillsMulti(dirs);\n\n if (opts.json) {\n console.log(JSON.stringify(skills, null, 2));\n return;\n }\n\n if (skills.length === 0) {\n console.log(pc.dim(\"No skills found.\"));\n return;\n }\n\n console.log(pc.bold(`\\n${skills.length} skill(s) found:\\n`));\n\n for (const skill of skills) {\n console.log(` ${pc.bold(skill.name.padEnd(30))} ${pc.dim(skill.metadata.description ?? \"\")}`);\n }\n\n console.log();\n });\n}\n","/**\n * skills find command - marketplace search\n */\n\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { MarketplaceClient } from \"../../core/marketplace/client.js\";\n\nexport function registerSkillsFind(parent: Command): void {\n parent\n .command(\"find\")\n .description(\"Search marketplace for skills\")\n .argument(\"[query]\", \"Search query\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"-l, --limit <n>\", \"Max results\", \"20\")\n .action(async (query: string | undefined, opts: { json?: boolean; limit: string }) => {\n if (!query) {\n console.log(pc.dim(\"Usage: caamp skills find <query>\"));\n return;\n }\n\n const limit = parseInt(opts.limit, 10);\n const client = new MarketplaceClient();\n\n console.log(pc.dim(`Searching marketplaces for \"${query}\"...\\n`));\n\n const results = await client.search(query, limit);\n\n if (opts.json) {\n console.log(JSON.stringify(results, null, 2));\n return;\n }\n\n if (results.length === 0) {\n console.log(pc.yellow(\"No results found.\"));\n return;\n }\n\n for (const skill of results) {\n const stars = skill.stars > 0 ? pc.yellow(`★ ${formatStars(skill.stars)}`) : \"\";\n console.log(` ${pc.bold(skill.scopedName.padEnd(35))} ${stars}`);\n console.log(` ${pc.dim(skill.description?.slice(0, 80) ?? \"\")}`);\n console.log(` ${pc.dim(`from ${skill.source}`)}`);\n console.log();\n }\n\n console.log(pc.dim(`Install with: caamp skills install <scopedName>`));\n });\n}\n\nfunction formatStars(n: number): string {\n if (n >= 1000) return `${(n / 1000).toFixed(1)}k`;\n return String(n);\n}\n","/**\n * skills check command - check for updates\n */\n\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { getTrackedSkills, checkSkillUpdate } from \"../../core/skills/lock.js\";\n\nexport function registerSkillsCheck(parent: Command): void {\n parent\n .command(\"check\")\n .description(\"Check for available skill updates\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts: { json?: boolean }) => {\n const tracked = await getTrackedSkills();\n const entries = Object.entries(tracked);\n\n if (entries.length === 0) {\n console.log(pc.dim(\"No tracked skills.\"));\n return;\n }\n\n const results = [];\n for (const [name, entry] of entries) {\n const update = await checkSkillUpdate(name);\n results.push({ name, entry, ...update });\n }\n\n if (opts.json) {\n console.log(JSON.stringify(results, null, 2));\n return;\n }\n\n console.log(pc.bold(`\\n${entries.length} tracked skill(s):\\n`));\n\n for (const r of results) {\n const status = r.hasUpdate\n ? pc.yellow(\"update available\")\n : pc.green(\"up to date\");\n\n console.log(` ${pc.bold(r.name.padEnd(30))} ${status}`);\n console.log(` ${pc.dim(`source: ${r.entry.source}`)}`);\n console.log(` ${pc.dim(`agents: ${r.entry.agents.join(\", \")}`)}`);\n console.log();\n }\n });\n}\n","/**\n * skills update command\n */\n\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { getTrackedSkills } from \"../../core/skills/lock.js\";\n\nexport function registerSkillsUpdate(parent: Command): void {\n parent\n .command(\"update\")\n .description(\"Update all outdated skills\")\n .option(\"-y, --yes\", \"Skip confirmation\")\n .action(async (opts: { yes?: boolean }) => {\n const tracked = await getTrackedSkills();\n const entries = Object.entries(tracked);\n\n if (entries.length === 0) {\n console.log(pc.dim(\"No tracked skills to update.\"));\n return;\n }\n\n console.log(pc.dim(`Checking ${entries.length} skill(s) for updates...`));\n\n // For now, skills update is a placeholder - requires network checks\n console.log(pc.dim(\"All skills are up to date.\"));\n console.log(pc.dim(\"\\nTo reinstall a specific skill:\"));\n console.log(pc.dim(\" caamp skills install <source>\"));\n });\n}\n","/**\n * skills init command - scaffold a new skill\n */\n\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport function registerSkillsInit(parent: Command): void {\n parent\n .command(\"init\")\n .description(\"Create a new SKILL.md template\")\n .argument(\"[name]\", \"Skill name\")\n .option(\"-d, --dir <path>\", \"Output directory\", \".\")\n .action(async (name: string | undefined, opts: { dir: string }) => {\n const skillName = name ?? \"my-skill\";\n const skillDir = join(opts.dir, skillName);\n\n if (existsSync(skillDir)) {\n console.error(pc.red(`Directory already exists: ${skillDir}`));\n process.exit(1);\n }\n\n await mkdir(skillDir, { recursive: true });\n\n const template = `---\nname: ${skillName}\ndescription: Describe what this skill does and when to use it\nlicense: MIT\nmetadata:\n author: your-name\n version: \"1.0\"\n---\n\n# ${skillName}\n\n## When to use this skill\n\nDescribe the conditions under which an AI agent should activate this skill.\n\n## Instructions\n\nProvide detailed instructions for the AI agent here.\n\n## Examples\n\nShow example inputs and expected outputs.\n`;\n\n await writeFile(join(skillDir, \"SKILL.md\"), template, \"utf-8\");\n\n console.log(pc.green(`✓ Created skill template: ${skillDir}/SKILL.md`));\n console.log(pc.dim(\"\\nNext steps:\"));\n console.log(pc.dim(\" 1. Edit SKILL.md with your instructions\"));\n console.log(pc.dim(\" 2. Validate: caamp skills validate \" + join(skillDir, \"SKILL.md\")));\n console.log(pc.dim(\" 3. Install: caamp skills install \" + skillDir));\n });\n}\n","/**\n * skills audit command - security scanning\n */\n\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { scanFile, scanDirectory, toSarif } from \"../../core/skills/audit/scanner.js\";\nimport { existsSync, statSync } from \"node:fs\";\n\nexport function registerSkillsAudit(parent: Command): void {\n parent\n .command(\"audit\")\n .description(\"Security scan skill files (46+ rules, SARIF output)\")\n .argument(\"[path]\", \"Path to SKILL.md or directory\", \".\")\n .option(\"--sarif\", \"Output in SARIF format\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (path: string, opts: { sarif?: boolean; json?: boolean }) => {\n if (!existsSync(path)) {\n console.error(pc.red(`Path not found: ${path}`));\n process.exit(1);\n }\n\n const stat = statSync(path);\n let results;\n\n if (stat.isFile()) {\n results = [await scanFile(path)];\n } else {\n results = await scanDirectory(path);\n }\n\n if (results.length === 0) {\n console.log(pc.dim(\"No SKILL.md files found to scan.\"));\n return;\n }\n\n if (opts.sarif) {\n console.log(JSON.stringify(toSarif(results), null, 2));\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(results, null, 2));\n return;\n }\n\n // Human-readable output\n let totalFindings = 0;\n let allPassed = true;\n\n for (const result of results) {\n const icon = result.passed ? pc.green(\"✓\") : pc.red(\"✗\");\n console.log(`\\n${icon} ${pc.bold(result.file)} (score: ${result.score}/100)`);\n\n if (result.findings.length === 0) {\n console.log(pc.dim(\" No issues found.\"));\n continue;\n }\n\n totalFindings += result.findings.length;\n if (!result.passed) allPassed = false;\n\n for (const f of result.findings) {\n const sev = f.rule.severity === \"critical\" ? pc.red(f.rule.severity)\n : f.rule.severity === \"high\" ? pc.red(f.rule.severity)\n : f.rule.severity === \"medium\" ? pc.yellow(f.rule.severity)\n : pc.dim(f.rule.severity);\n\n console.log(` ${sev.padEnd(20)} ${f.rule.id} ${f.rule.name}`);\n console.log(` ${pc.dim(`L${f.line}: ${f.context.slice(0, 80)}`)}`);\n }\n }\n\n console.log(pc.bold(`\\n${results.length} file(s) scanned, ${totalFindings} finding(s)`));\n\n if (!allPassed) {\n process.exit(1);\n }\n });\n}\n","/**\n * skills validate command\n */\n\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { validateSkill } from \"../../core/skills/validator.js\";\n\nexport function registerSkillsValidate(parent: Command): void {\n parent\n .command(\"validate\")\n .description(\"Validate SKILL.md format\")\n .argument(\"[path]\", \"Path to SKILL.md\", \"SKILL.md\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (path: string, opts: { json?: boolean }) => {\n const result = await validateSkill(path);\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.valid) {\n console.log(pc.green(`✓ ${path} is valid`));\n } else {\n console.log(pc.red(`✗ ${path} has validation errors`));\n }\n\n for (const issue of result.issues) {\n const icon = issue.level === \"error\" ? pc.red(\"✗\") : pc.yellow(\"!\");\n console.log(` ${icon} [${issue.field}] ${issue.message}`);\n }\n\n if (!result.valid) {\n process.exit(1);\n }\n });\n}\n","/**\n * Skills command group registration\n */\n\nimport { Command } from \"commander\";\nimport { registerSkillsInstall } from \"./install.js\";\nimport { registerSkillsRemove } from \"./remove.js\";\nimport { registerSkillsList } from \"./list.js\";\nimport { registerSkillsFind } from \"./find.js\";\nimport { registerSkillsCheck } from \"./check.js\";\nimport { registerSkillsUpdate } from \"./update.js\";\nimport { registerSkillsInit } from \"./init.js\";\nimport { registerSkillsAudit } from \"./audit.js\";\nimport { registerSkillsValidate } from \"./validate.js\";\n\nexport function registerSkillsCommands(program: Command): void {\n const skills = program\n .command(\"skills\")\n .description(\"Manage AI agent skills\");\n\n registerSkillsInstall(skills);\n registerSkillsRemove(skills);\n registerSkillsList(skills);\n registerSkillsFind(skills);\n registerSkillsCheck(skills);\n registerSkillsUpdate(skills);\n registerSkillsInit(skills);\n registerSkillsAudit(skills);\n registerSkillsValidate(skills);\n}\n","/**\n * mcp install command\n */\n\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { parseSource } from \"../../core/sources/parser.js\";\nimport { installMcpServerToAll, buildServerConfig } from \"../../core/mcp/installer.js\";\nimport { recordMcpInstall } from \"../../core/mcp/lock.js\";\nimport { getInstalledProviders } from \"../../core/registry/detection.js\";\nimport { getProvider } from \"../../core/registry/providers.js\";\nimport type { Provider } from \"../../types.js\";\n\nexport function registerMcpInstall(parent: Command): void {\n parent\n .command(\"install\")\n .description(\"Install MCP server to agent configs\")\n .argument(\"<source>\", \"MCP server source (URL, npm package, or command)\")\n .option(\"-a, --agent <name>\", \"Target specific agent(s)\", (v, prev: string[]) => [...prev, v], [])\n .option(\"-g, --global\", \"Install to global/user config\")\n .option(\"-n, --name <name>\", \"Override inferred server name\")\n .option(\"-t, --transport <type>\", \"Transport type: http (default) or sse\", \"http\")\n .option(\"--header <header>\", \"HTTP header (Key: Value)\", (v, prev: string[]) => [...prev, v], [])\n .option(\"-y, --yes\", \"Skip confirmation\")\n .option(\"--all\", \"Install to all detected agents\")\n .option(\"--dry-run\", \"Preview without writing\")\n .action(async (source: string, opts: {\n agent: string[];\n global?: boolean;\n name?: string;\n transport: string;\n header: string[];\n yes?: boolean;\n all?: boolean;\n dryRun?: boolean;\n }) => {\n const parsed = parseSource(source);\n const serverName = opts.name ?? parsed.inferredName;\n\n // Parse headers\n const headers: Record<string, string> = {};\n for (const h of opts.header) {\n const idx = h.indexOf(\":\");\n if (idx > 0) {\n headers[h.slice(0, idx).trim()] = h.slice(idx + 1).trim();\n }\n }\n\n const config = buildServerConfig(parsed, opts.transport, headers);\n\n // Determine target providers\n let providers: Provider[];\n\n if (opts.all) {\n providers = getInstalledProviders();\n } else if (opts.agent.length > 0) {\n providers = opts.agent\n .map((a) => getProvider(a))\n .filter((p): p is Provider => p !== undefined);\n } else {\n providers = getInstalledProviders();\n }\n\n if (providers.length === 0) {\n console.error(pc.red(\"No target providers found.\"));\n process.exit(1);\n }\n\n const scope = opts.global ? \"global\" as const : \"project\" as const;\n\n if (opts.dryRun) {\n console.log(pc.bold(\"Dry run - would install:\"));\n console.log(` Server: ${pc.bold(serverName)}`);\n console.log(` Config: ${JSON.stringify(config, null, 2)}`);\n console.log(` Scope: ${scope}`);\n console.log(` Providers: ${providers.map((p) => p.id).join(\", \")}`);\n return;\n }\n\n console.log(pc.dim(`Installing \"${serverName}\" to ${providers.length} provider(s)...\\n`));\n\n const results = await installMcpServerToAll(\n providers,\n serverName,\n config,\n scope,\n );\n\n for (const r of results) {\n if (r.success) {\n console.log(` ${pc.green(\"✓\")} ${r.provider.toolName.padEnd(22)} ${pc.dim(r.configPath)}`);\n } else {\n console.log(` ${pc.red(\"✗\")} ${r.provider.toolName.padEnd(22)} ${pc.red(r.error ?? \"failed\")}`);\n }\n }\n\n const succeeded = results.filter((r) => r.success);\n if (succeeded.length > 0) {\n await recordMcpInstall(\n serverName,\n source,\n parsed.type,\n succeeded.map((r) => r.provider.id),\n opts.global ?? false,\n );\n }\n\n console.log(pc.bold(`\\n${succeeded.length}/${results.length} providers configured.`));\n });\n}\n","/**\n * mcp remove command\n */\n\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { getInstalledProviders } from \"../../core/registry/detection.js\";\nimport { getProvider } from \"../../core/registry/providers.js\";\nimport { removeMcpServer } from \"../../core/mcp/reader.js\";\nimport { removeMcpFromLock } from \"../../core/mcp/lock.js\";\nimport type { Provider } from \"../../types.js\";\n\nexport function registerMcpRemove(parent: Command): void {\n parent\n .command(\"remove\")\n .description(\"Remove MCP server from agent configs\")\n .argument(\"<name>\", \"MCP server name to remove\")\n .option(\"-a, --agent <name>\", \"Target specific agent(s)\", (v, prev: string[]) => [...prev, v], [])\n .option(\"-g, --global\", \"Remove from global config\")\n .option(\"--all\", \"Remove from all detected agents\")\n .action(async (name: string, opts: {\n agent: string[];\n global?: boolean;\n all?: boolean;\n }) => {\n let providers: Provider[];\n\n if (opts.all) {\n providers = getInstalledProviders();\n } else if (opts.agent.length > 0) {\n providers = opts.agent\n .map((a) => getProvider(a))\n .filter((p): p is Provider => p !== undefined);\n } else {\n providers = getInstalledProviders();\n }\n\n const scope = opts.global ? \"global\" as const : \"project\" as const;\n let removed = 0;\n\n for (const provider of providers) {\n const success = await removeMcpServer(provider, name, scope);\n if (success) {\n console.log(` ${pc.green(\"✓\")} Removed from ${provider.toolName}`);\n removed++;\n }\n }\n\n if (removed > 0) {\n await removeMcpFromLock(name);\n console.log(pc.green(`\\n✓ Removed \"${name}\" from ${removed} provider(s).`));\n } else {\n console.log(pc.yellow(`Server \"${name}\" not found in any provider config.`));\n }\n });\n}\n","/**\n * mcp list command\n */\n\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { getInstalledProviders } from \"../../core/registry/detection.js\";\nimport { getProvider } from \"../../core/registry/providers.js\";\nimport { listMcpServers } from \"../../core/mcp/reader.js\";\nimport type { McpServerEntry } from \"../../types.js\";\n\nexport function registerMcpList(parent: Command): void {\n parent\n .command(\"list\")\n .description(\"List configured MCP servers\")\n .option(\"-a, --agent <name>\", \"List for specific agent\")\n .option(\"-g, --global\", \"List global config\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts: { agent?: string; global?: boolean; json?: boolean }) => {\n const providers = opts.agent\n ? [getProvider(opts.agent)].filter((p): p is NonNullable<typeof p> => p !== undefined)\n : getInstalledProviders();\n\n const allEntries: McpServerEntry[] = [];\n\n for (const provider of providers) {\n // With --global, use global. Otherwise use project if provider supports it, else global.\n const scope: \"project\" | \"global\" = opts.global\n ? \"global\"\n : provider.configPathProject\n ? \"project\"\n : \"global\";\n\n const entries = await listMcpServers(provider, scope);\n allEntries.push(...entries);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(allEntries.map(e => ({\n provider: e.providerId,\n name: e.name,\n config: e.config,\n })), null, 2));\n return;\n }\n\n if (allEntries.length === 0) {\n console.log(pc.dim(\"No MCP servers configured.\"));\n return;\n }\n\n console.log(pc.bold(`\\n${allEntries.length} MCP server(s) configured:\\n`));\n\n for (const entry of allEntries) {\n console.log(` ${pc.bold(entry.name.padEnd(25))} ${pc.dim(entry.providerId)}`);\n }\n\n console.log();\n });\n}\n","/**\n * mcp detect command - auto-detect installed MCP tools\n */\n\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { existsSync } from \"node:fs\";\nimport { getInstalledProviders } from \"../../core/registry/detection.js\";\nimport { resolveConfigPath, listMcpServers } from \"../../core/mcp/reader.js\";\n\nexport function registerMcpDetect(parent: Command): void {\n parent\n .command(\"detect\")\n .description(\"Auto-detect installed MCP tools and their configurations\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts: { json?: boolean }) => {\n const providers = getInstalledProviders();\n\n const detected: Array<{\n provider: string;\n hasGlobalConfig: boolean;\n hasProjectConfig: boolean;\n globalServers: string[];\n projectServers: string[];\n }> = [];\n\n for (const provider of providers) {\n const globalPath = resolveConfigPath(provider, \"global\");\n const projectPath = resolveConfigPath(provider, \"project\");\n\n const globalEntries = await listMcpServers(provider, \"global\");\n const projectEntries = await listMcpServers(provider, \"project\");\n\n detected.push({\n provider: provider.id,\n hasGlobalConfig: globalPath !== null && existsSync(globalPath),\n hasProjectConfig: projectPath !== null && existsSync(projectPath),\n globalServers: globalEntries.map(e => e.name),\n projectServers: projectEntries.map(e => e.name),\n });\n }\n\n if (opts.json) {\n console.log(JSON.stringify(detected, null, 2));\n return;\n }\n\n console.log(pc.bold(`\\n${detected.length} provider(s) with MCP support:\\n`));\n\n for (const d of detected) {\n const globalIcon = d.hasGlobalConfig ? pc.green(\"G\") : pc.dim(\"-\");\n const projectIcon = d.hasProjectConfig ? pc.green(\"P\") : pc.dim(\"-\");\n const servers = [...d.globalServers, ...d.projectServers];\n const serverList = servers.length > 0 ? pc.dim(servers.join(\", \")) : pc.dim(\"no servers\");\n\n console.log(` [${globalIcon}${projectIcon}] ${pc.bold(d.provider.padEnd(20))} ${serverList}`);\n }\n\n console.log(pc.dim(\"\\nG = global config, P = project config\"));\n console.log();\n });\n}\n","/**\n * MCP command group registration\n */\n\nimport { Command } from \"commander\";\nimport { registerMcpInstall } from \"./install.js\";\nimport { registerMcpRemove } from \"./remove.js\";\nimport { registerMcpList } from \"./list.js\";\nimport { registerMcpDetect } from \"./detect.js\";\n\nexport function registerMcpCommands(program: Command): void {\n const mcp = program\n .command(\"mcp\")\n .description(\"Manage MCP server configurations\");\n\n registerMcpInstall(mcp);\n registerMcpRemove(mcp);\n registerMcpList(mcp);\n registerMcpDetect(mcp);\n}\n","/**\n * instructions inject command\n */\n\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { injectAll } from \"../../core/instructions/injector.js\";\nimport { generateInjectionContent, groupByInstructFile } from \"../../core/instructions/templates.js\";\nimport { getInstalledProviders } from \"../../core/registry/detection.js\";\nimport { getAllProviders, getProvider } from \"../../core/registry/providers.js\";\nimport type { Provider } from \"../../types.js\";\n\nexport function registerInstructionsInject(parent: Command): void {\n parent\n .command(\"inject\")\n .description(\"Inject instruction blocks into all provider files\")\n .option(\"-a, --agent <name>\", \"Target specific agent(s)\", (v, prev: string[]) => [...prev, v], [])\n .option(\"-g, --global\", \"Inject into global instruction files\")\n .option(\"--content <text>\", \"Custom content to inject\")\n .option(\"--dry-run\", \"Preview without writing\")\n .option(\"--all\", \"Target all known providers\")\n .action(async (opts: {\n agent: string[];\n global?: boolean;\n content?: string;\n dryRun?: boolean;\n all?: boolean;\n }) => {\n let providers: Provider[];\n\n if (opts.all) {\n providers = getAllProviders();\n } else if (opts.agent.length > 0) {\n providers = opts.agent\n .map((a) => getProvider(a))\n .filter((p): p is Provider => p !== undefined);\n } else {\n providers = getInstalledProviders();\n }\n\n if (providers.length === 0) {\n console.error(pc.red(\"No providers found.\"));\n process.exit(1);\n }\n\n const content = opts.content ?? generateInjectionContent();\n const scope = opts.global ? \"global\" as const : \"project\" as const;\n\n // Show grouped preview\n const groups = groupByInstructFile(providers);\n\n if (opts.dryRun) {\n console.log(pc.bold(\"Dry run - would inject into:\\n\"));\n for (const [file, group] of groups) {\n console.log(` ${pc.bold(file)}: ${group.map((p) => p.id).join(\", \")}`);\n }\n console.log(pc.dim(`\\n Scope: ${scope}`));\n console.log(pc.dim(` Content length: ${content.length} chars`));\n return;\n }\n\n const results = await injectAll(providers, process.cwd(), scope, content);\n\n for (const [file, action] of results) {\n const icon = action === \"created\" ? pc.green(\"+\")\n : action === \"updated\" ? pc.yellow(\"~\")\n : pc.blue(\"^\");\n console.log(` ${icon} ${file} (${action})`);\n }\n\n console.log(pc.bold(`\\n${results.size} file(s) processed.`));\n });\n}\n","/**\n * instructions check command\n */\n\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { checkAllInjections } from \"../../core/instructions/injector.js\";\nimport { getInstalledProviders } from \"../../core/registry/detection.js\";\nimport { getAllProviders, getProvider } from \"../../core/registry/providers.js\";\nimport type { Provider } from \"../../types.js\";\n\nexport function registerInstructionsCheck(parent: Command): void {\n parent\n .command(\"check\")\n .description(\"Check injection status across providers\")\n .option(\"-a, --agent <name>\", \"Check specific agent(s)\", (v, prev: string[]) => [...prev, v], [])\n .option(\"-g, --global\", \"Check global instruction files\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--all\", \"Check all known providers\")\n .action(async (opts: {\n agent: string[];\n global?: boolean;\n json?: boolean;\n all?: boolean;\n }) => {\n let providers: Provider[];\n\n if (opts.all) {\n providers = getAllProviders();\n } else if (opts.agent.length > 0) {\n providers = opts.agent\n .map((a) => getProvider(a))\n .filter((p): p is Provider => p !== undefined);\n } else {\n providers = getInstalledProviders();\n }\n\n const scope = opts.global ? \"global\" as const : \"project\" as const;\n const results = await checkAllInjections(providers, process.cwd(), scope);\n\n if (opts.json) {\n console.log(JSON.stringify(results, null, 2));\n return;\n }\n\n console.log(pc.bold(`\\nInstruction file status (${scope}):\\n`));\n\n for (const r of results) {\n let icon: string;\n let label: string;\n\n switch (r.status) {\n case \"current\":\n icon = pc.green(\"✓\");\n label = \"current\";\n break;\n case \"outdated\":\n icon = pc.yellow(\"~\");\n label = \"outdated\";\n break;\n case \"missing\":\n icon = pc.red(\"✗\");\n label = \"missing\";\n break;\n case \"none\":\n icon = pc.dim(\"-\");\n label = \"no injection\";\n break;\n }\n\n console.log(` ${icon} ${r.file.padEnd(40)} ${label}`);\n }\n\n console.log();\n });\n}\n","/**\n * instructions update command\n */\n\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { injectAll, checkAllInjections } from \"../../core/instructions/injector.js\";\nimport { generateInjectionContent } from \"../../core/instructions/templates.js\";\nimport { getInstalledProviders } from \"../../core/registry/detection.js\";\nimport type { Provider } from \"../../types.js\";\n\nexport function registerInstructionsUpdate(parent: Command): void {\n parent\n .command(\"update\")\n .description(\"Update all instruction file injections\")\n .option(\"-g, --global\", \"Update global instruction files\")\n .option(\"-y, --yes\", \"Skip confirmation\")\n .action(async (opts: { global?: boolean; yes?: boolean }) => {\n const providers = getInstalledProviders();\n const scope = opts.global ? \"global\" as const : \"project\" as const;\n const content = generateInjectionContent();\n\n // Check current state\n const checks = await checkAllInjections(providers, process.cwd(), scope, content);\n const needsUpdate = checks.filter((c) => c.status !== \"current\");\n\n if (needsUpdate.length === 0) {\n console.log(pc.green(\"All instruction files are up to date.\"));\n return;\n }\n\n console.log(pc.bold(`${needsUpdate.length} file(s) need updating:\\n`));\n for (const c of needsUpdate) {\n console.log(` ${c.file} (${c.status})`);\n }\n\n // Filter providers to only those needing updates\n const providerIds = new Set(needsUpdate.map((c) => c.provider));\n const toUpdate = providers.filter((p) => providerIds.has(p.id));\n\n const results = await injectAll(toUpdate, process.cwd(), scope, content);\n\n console.log();\n for (const [file, action] of results) {\n console.log(` ${pc.green(\"✓\")} ${file} (${action})`);\n }\n\n console.log(pc.bold(`\\n${results.size} file(s) updated.`));\n });\n}\n","/**\n * Instructions command group registration\n */\n\nimport { Command } from \"commander\";\nimport { registerInstructionsInject } from \"./inject.js\";\nimport { registerInstructionsCheck } from \"./check.js\";\nimport { registerInstructionsUpdate } from \"./update.js\";\n\nexport function registerInstructionsCommands(program: Command): void {\n const instructions = program\n .command(\"instructions\")\n .description(\"Manage instruction file injections\");\n\n registerInstructionsInject(instructions);\n registerInstructionsCheck(instructions);\n registerInstructionsUpdate(instructions);\n}\n","/**\n * config show|path commands\n */\n\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { getProvider } from \"../core/registry/providers.js\";\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { readConfig } from \"../core/formats/index.js\";\n\nexport function registerConfigCommand(program: Command): void {\n const config = program\n .command(\"config\")\n .description(\"View provider configuration\");\n\n config\n .command(\"show\")\n .description(\"Show provider configuration\")\n .argument(\"<provider>\", \"Provider ID or alias\")\n .option(\"-g, --global\", \"Show global config\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (providerId: string, opts: { global?: boolean; json?: boolean }) => {\n const provider = getProvider(providerId);\n\n if (!provider) {\n console.error(pc.red(`Provider not found: ${providerId}`));\n process.exit(1);\n }\n\n const configPath = opts.global\n ? provider.configPathGlobal\n : provider.configPathProject\n ? join(process.cwd(), provider.configPathProject)\n : provider.configPathGlobal;\n\n if (!existsSync(configPath)) {\n console.log(pc.dim(`No config file at: ${configPath}`));\n return;\n }\n\n try {\n const data = await readConfig(configPath, provider.configFormat);\n\n if (opts.json) {\n console.log(JSON.stringify(data, null, 2));\n } else {\n console.log(pc.bold(`\\n${provider.toolName} config (${configPath}):\\n`));\n console.log(JSON.stringify(data, null, 2));\n }\n } catch (err) {\n console.error(pc.red(`Error reading config: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n\n config\n .command(\"path\")\n .description(\"Show config file path\")\n .argument(\"<provider>\", \"Provider ID or alias\")\n .argument(\"[scope]\", \"Scope: project (default) or global\", \"project\")\n .action((providerId: string, scope: string) => {\n const provider = getProvider(providerId);\n\n if (!provider) {\n console.error(pc.red(`Provider not found: ${providerId}`));\n process.exit(1);\n }\n\n if (scope === \"global\") {\n console.log(provider.configPathGlobal);\n } else {\n if (provider.configPathProject) {\n console.log(join(process.cwd(), provider.configPathProject));\n } else {\n console.log(pc.dim(`${provider.toolName} has no project-level config`));\n console.log(provider.configPathGlobal);\n }\n }\n });\n}\n"],"mappings":"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","names":["program","pc","simpleGit","mkdtemp","rm","tmpdir","join","pc","pc","pc","pc","join","pc","pc","pc","pc","pc","pc","pc","pc","join","pc","existsSync","pc","pc","pc","program","pc","pc","pc","pc","pc","pc","pc","existsSync","existsSync","pc","program","pc","pc","pc","pc","pc","pc","program","pc","join","existsSync","program","pc","join","existsSync"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CAAMP - Central AI Agent Managed Packages
|
|
3
|
+
* Core type definitions
|
|
4
|
+
*/
|
|
5
|
+
type ConfigFormat = "json" | "jsonc" | "yaml" | "toml";
|
|
6
|
+
type TransportType = "stdio" | "sse" | "http";
|
|
7
|
+
type DetectionMethod = "binary" | "directory" | "appBundle" | "flatpak";
|
|
8
|
+
interface DetectionConfig {
|
|
9
|
+
methods: DetectionMethod[];
|
|
10
|
+
binary?: string;
|
|
11
|
+
directories?: string[];
|
|
12
|
+
appBundle?: string;
|
|
13
|
+
flatpakId?: string;
|
|
14
|
+
}
|
|
15
|
+
type ProviderPriority = "high" | "medium" | "low";
|
|
16
|
+
type ProviderStatus = "active" | "beta" | "deprecated" | "planned";
|
|
17
|
+
interface Provider {
|
|
18
|
+
id: string;
|
|
19
|
+
toolName: string;
|
|
20
|
+
vendor: string;
|
|
21
|
+
agentFlag: string;
|
|
22
|
+
aliases: string[];
|
|
23
|
+
pathGlobal: string;
|
|
24
|
+
pathProject: string;
|
|
25
|
+
instructFile: string;
|
|
26
|
+
configKey: string;
|
|
27
|
+
configFormat: ConfigFormat;
|
|
28
|
+
configPathGlobal: string;
|
|
29
|
+
configPathProject: string | null;
|
|
30
|
+
pathSkills: string;
|
|
31
|
+
pathProjectSkills: string;
|
|
32
|
+
detection: DetectionConfig;
|
|
33
|
+
supportedTransports: TransportType[];
|
|
34
|
+
supportsHeaders: boolean;
|
|
35
|
+
priority: ProviderPriority;
|
|
36
|
+
status: ProviderStatus;
|
|
37
|
+
agentSkillsCompatible: boolean;
|
|
38
|
+
}
|
|
39
|
+
interface McpServerConfig {
|
|
40
|
+
type?: TransportType;
|
|
41
|
+
url?: string;
|
|
42
|
+
headers?: Record<string, string>;
|
|
43
|
+
command?: string;
|
|
44
|
+
args?: string[];
|
|
45
|
+
env?: Record<string, string>;
|
|
46
|
+
}
|
|
47
|
+
type SourceType = "remote" | "package" | "command" | "github" | "gitlab" | "local";
|
|
48
|
+
interface ParsedSource {
|
|
49
|
+
type: SourceType;
|
|
50
|
+
value: string;
|
|
51
|
+
inferredName: string;
|
|
52
|
+
owner?: string;
|
|
53
|
+
repo?: string;
|
|
54
|
+
path?: string;
|
|
55
|
+
ref?: string;
|
|
56
|
+
}
|
|
57
|
+
interface SkillMetadata {
|
|
58
|
+
name: string;
|
|
59
|
+
description: string;
|
|
60
|
+
license?: string;
|
|
61
|
+
compatibility?: string;
|
|
62
|
+
metadata?: Record<string, string>;
|
|
63
|
+
allowedTools?: string[];
|
|
64
|
+
version?: string;
|
|
65
|
+
}
|
|
66
|
+
interface SkillEntry {
|
|
67
|
+
name: string;
|
|
68
|
+
scopedName: string;
|
|
69
|
+
path: string;
|
|
70
|
+
metadata: SkillMetadata;
|
|
71
|
+
source?: string;
|
|
72
|
+
}
|
|
73
|
+
interface LockEntry {
|
|
74
|
+
name: string;
|
|
75
|
+
scopedName: string;
|
|
76
|
+
source: string;
|
|
77
|
+
sourceType: SourceType;
|
|
78
|
+
version?: string;
|
|
79
|
+
installedAt: string;
|
|
80
|
+
updatedAt?: string;
|
|
81
|
+
agents: string[];
|
|
82
|
+
canonicalPath: string;
|
|
83
|
+
isGlobal: boolean;
|
|
84
|
+
projectDir?: string;
|
|
85
|
+
}
|
|
86
|
+
interface CaampLockFile {
|
|
87
|
+
version: 1;
|
|
88
|
+
skills: Record<string, LockEntry>;
|
|
89
|
+
mcpServers: Record<string, LockEntry>;
|
|
90
|
+
lastSelectedAgents?: string[];
|
|
91
|
+
}
|
|
92
|
+
interface MarketplaceSkill {
|
|
93
|
+
id: string;
|
|
94
|
+
name: string;
|
|
95
|
+
scopedName: string;
|
|
96
|
+
description: string;
|
|
97
|
+
author: string;
|
|
98
|
+
stars: number;
|
|
99
|
+
forks: number;
|
|
100
|
+
githubUrl: string;
|
|
101
|
+
repoFullName: string;
|
|
102
|
+
path: string;
|
|
103
|
+
category?: string;
|
|
104
|
+
hasContent: boolean;
|
|
105
|
+
}
|
|
106
|
+
interface MarketplaceSearchResult {
|
|
107
|
+
skills: MarketplaceSkill[];
|
|
108
|
+
total: number;
|
|
109
|
+
limit: number;
|
|
110
|
+
offset: number;
|
|
111
|
+
}
|
|
112
|
+
type AuditSeverity = "critical" | "high" | "medium" | "low" | "info";
|
|
113
|
+
interface AuditRule {
|
|
114
|
+
id: string;
|
|
115
|
+
name: string;
|
|
116
|
+
description: string;
|
|
117
|
+
severity: AuditSeverity;
|
|
118
|
+
category: string;
|
|
119
|
+
pattern: RegExp;
|
|
120
|
+
}
|
|
121
|
+
interface AuditFinding {
|
|
122
|
+
rule: AuditRule;
|
|
123
|
+
line: number;
|
|
124
|
+
column: number;
|
|
125
|
+
match: string;
|
|
126
|
+
context: string;
|
|
127
|
+
}
|
|
128
|
+
interface AuditResult {
|
|
129
|
+
file: string;
|
|
130
|
+
findings: AuditFinding[];
|
|
131
|
+
score: number;
|
|
132
|
+
passed: boolean;
|
|
133
|
+
}
|
|
134
|
+
type InjectionStatus = "current" | "outdated" | "missing" | "none";
|
|
135
|
+
interface InjectionCheckResult {
|
|
136
|
+
file: string;
|
|
137
|
+
provider: string;
|
|
138
|
+
status: InjectionStatus;
|
|
139
|
+
fileExists: boolean;
|
|
140
|
+
}
|
|
141
|
+
interface McpServerEntry {
|
|
142
|
+
name: string;
|
|
143
|
+
providerId: string;
|
|
144
|
+
providerName: string;
|
|
145
|
+
scope: "project" | "global";
|
|
146
|
+
configPath: string;
|
|
147
|
+
config: Record<string, unknown>;
|
|
148
|
+
}
|
|
149
|
+
interface GlobalOptions {
|
|
150
|
+
agent?: string[];
|
|
151
|
+
global?: boolean;
|
|
152
|
+
yes?: boolean;
|
|
153
|
+
all?: boolean;
|
|
154
|
+
json?: boolean;
|
|
155
|
+
dryRun?: boolean;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Provider auto-detection engine
|
|
160
|
+
*
|
|
161
|
+
* Detects which AI coding agents are installed on the system
|
|
162
|
+
* by checking binaries, directories, app bundles, and flatpak.
|
|
163
|
+
*/
|
|
164
|
+
|
|
165
|
+
interface DetectionResult {
|
|
166
|
+
provider: Provider;
|
|
167
|
+
installed: boolean;
|
|
168
|
+
methods: string[];
|
|
169
|
+
projectDetected: boolean;
|
|
170
|
+
}
|
|
171
|
+
/** Detect if a single provider is installed */
|
|
172
|
+
declare function detectProvider(provider: Provider): DetectionResult;
|
|
173
|
+
/** Detect all installed providers */
|
|
174
|
+
declare function detectAllProviders(): DetectionResult[];
|
|
175
|
+
/** Get only installed providers */
|
|
176
|
+
declare function getInstalledProviders(): Provider[];
|
|
177
|
+
/** Detect providers with project-level presence */
|
|
178
|
+
declare function detectProjectProviders(projectDir: string): DetectionResult[];
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* MCP config installer
|
|
182
|
+
*
|
|
183
|
+
* Writes MCP server configurations to agent config files,
|
|
184
|
+
* handling per-agent formats, keys, and transformations.
|
|
185
|
+
*/
|
|
186
|
+
|
|
187
|
+
interface InstallResult {
|
|
188
|
+
provider: Provider;
|
|
189
|
+
scope: "project" | "global";
|
|
190
|
+
configPath: string;
|
|
191
|
+
success: boolean;
|
|
192
|
+
error?: string;
|
|
193
|
+
}
|
|
194
|
+
/** Install an MCP server config for a single provider */
|
|
195
|
+
declare function installMcpServer(provider: Provider, serverName: string, config: McpServerConfig, scope?: "project" | "global", projectDir?: string): Promise<InstallResult>;
|
|
196
|
+
/** Install an MCP server config for multiple providers */
|
|
197
|
+
declare function installMcpServerToAll(providers: Provider[], serverName: string, config: McpServerConfig, scope?: "project" | "global", projectDir?: string): Promise<InstallResult[]>;
|
|
198
|
+
/** Build a canonical MCP server config from parsed source */
|
|
199
|
+
declare function buildServerConfig(source: {
|
|
200
|
+
type: string;
|
|
201
|
+
value: string;
|
|
202
|
+
}, transport?: string, headers?: Record<string, string>): McpServerConfig;
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Skill installer - canonical + symlink model
|
|
206
|
+
*
|
|
207
|
+
* Skills are stored once in a canonical location (.agents/skills/<name>/)
|
|
208
|
+
* and symlinked to each target agent's skills directory.
|
|
209
|
+
*/
|
|
210
|
+
|
|
211
|
+
interface SkillInstallResult {
|
|
212
|
+
name: string;
|
|
213
|
+
canonicalPath: string;
|
|
214
|
+
linkedAgents: string[];
|
|
215
|
+
errors: string[];
|
|
216
|
+
success: boolean;
|
|
217
|
+
}
|
|
218
|
+
/** Install a skill from a local path to canonical + link to agents */
|
|
219
|
+
declare function installSkill(sourcePath: string, skillName: string, providers: Provider[], isGlobal: boolean, projectDir?: string): Promise<SkillInstallResult>;
|
|
220
|
+
/** Remove a skill from canonical location and all agent symlinks */
|
|
221
|
+
declare function removeSkill(skillName: string, providers: Provider[], isGlobal: boolean, projectDir?: string): Promise<{
|
|
222
|
+
removed: string[];
|
|
223
|
+
errors: string[];
|
|
224
|
+
}>;
|
|
225
|
+
/** List all canonically installed skills */
|
|
226
|
+
declare function listCanonicalSkills(): Promise<string[]>;
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* SKILL.md validator
|
|
230
|
+
*
|
|
231
|
+
* Validates skill files against the Agent Skills standard.
|
|
232
|
+
*/
|
|
233
|
+
interface ValidationIssue {
|
|
234
|
+
level: "error" | "warning";
|
|
235
|
+
field: string;
|
|
236
|
+
message: string;
|
|
237
|
+
}
|
|
238
|
+
interface ValidationResult {
|
|
239
|
+
valid: boolean;
|
|
240
|
+
issues: ValidationIssue[];
|
|
241
|
+
metadata: Record<string, unknown> | null;
|
|
242
|
+
}
|
|
243
|
+
/** Validate a SKILL.md file */
|
|
244
|
+
declare function validateSkill(filePath: string): Promise<ValidationResult>;
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Provider registry loader
|
|
248
|
+
*
|
|
249
|
+
* Loads providers from providers/registry.json and resolves
|
|
250
|
+
* platform-specific paths at runtime.
|
|
251
|
+
*/
|
|
252
|
+
|
|
253
|
+
/** Get all providers */
|
|
254
|
+
declare function getAllProviders(): Provider[];
|
|
255
|
+
/** Get a provider by ID or alias */
|
|
256
|
+
declare function getProvider(idOrAlias: string): Provider | undefined;
|
|
257
|
+
/** Resolve an alias to provider ID */
|
|
258
|
+
declare function resolveAlias(idOrAlias: string): string;
|
|
259
|
+
/** Get providers by priority tier */
|
|
260
|
+
declare function getProvidersByPriority(priority: ProviderPriority): Provider[];
|
|
261
|
+
/** Get providers by status */
|
|
262
|
+
declare function getProvidersByStatus(status: ProviderStatus): Provider[];
|
|
263
|
+
/** Get providers that use a specific instruction file */
|
|
264
|
+
declare function getProvidersByInstructFile(file: string): Provider[];
|
|
265
|
+
/** Get all unique instruction files */
|
|
266
|
+
declare function getInstructionFiles(): string[];
|
|
267
|
+
/** Get provider count */
|
|
268
|
+
declare function getProviderCount(): number;
|
|
269
|
+
/** Get registry version */
|
|
270
|
+
declare function getRegistryVersion(): string;
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Source URL/path classifier
|
|
274
|
+
*
|
|
275
|
+
* Classifies inputs as remote URLs, npm packages, GitHub shorthand,
|
|
276
|
+
* GitLab URLs, local paths, or shell commands.
|
|
277
|
+
*/
|
|
278
|
+
|
|
279
|
+
/** Parse a source string into a typed ParsedSource */
|
|
280
|
+
declare function parseSource(input: string): ParsedSource;
|
|
281
|
+
/** Check if source looks like an MCP marketplace scoped name (@author/name) */
|
|
282
|
+
declare function isMarketplaceScoped(input: string): boolean;
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Local skill discovery
|
|
286
|
+
*
|
|
287
|
+
* Scans directories for SKILL.md files and parses their frontmatter.
|
|
288
|
+
*/
|
|
289
|
+
|
|
290
|
+
/** Parse a SKILL.md file and extract metadata */
|
|
291
|
+
declare function parseSkillFile(filePath: string): Promise<SkillMetadata | null>;
|
|
292
|
+
/** Discover a skill at a given path (directory containing SKILL.md) */
|
|
293
|
+
declare function discoverSkill(skillDir: string): Promise<SkillEntry | null>;
|
|
294
|
+
/** Scan a directory for skill directories (each containing SKILL.md) */
|
|
295
|
+
declare function discoverSkills(rootDir: string): Promise<SkillEntry[]>;
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Security scanning engine for SKILL.md files
|
|
299
|
+
*
|
|
300
|
+
* Scans skill content against 46+ security rules
|
|
301
|
+
* and produces findings with line-level precision.
|
|
302
|
+
*/
|
|
303
|
+
|
|
304
|
+
/** Scan a single file against all rules */
|
|
305
|
+
declare function scanFile(filePath: string, rules?: AuditRule[]): Promise<AuditResult>;
|
|
306
|
+
/** Scan a directory of skills */
|
|
307
|
+
declare function scanDirectory(dirPath: string): Promise<AuditResult[]>;
|
|
308
|
+
/** Format findings as SARIF (Static Analysis Results Interchange Format) */
|
|
309
|
+
declare function toSarif(results: AuditResult[]): object;
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Per-agent MCP config transformations
|
|
313
|
+
*
|
|
314
|
+
* Most agents use the canonical McpServerConfig directly.
|
|
315
|
+
* These transforms handle agents with non-standard schemas.
|
|
316
|
+
*/
|
|
317
|
+
|
|
318
|
+
/** Get the transform function for a provider, or undefined for passthrough */
|
|
319
|
+
declare function getTransform(providerId: string): ((name: string, config: McpServerConfig) => unknown) | undefined;
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* MCP config reader
|
|
323
|
+
*
|
|
324
|
+
* Reads, lists, and removes MCP server entries from agent config files.
|
|
325
|
+
* Provides the programmatic API that CLI commands delegate to.
|
|
326
|
+
*/
|
|
327
|
+
|
|
328
|
+
/** Resolve the config file path for a provider and scope */
|
|
329
|
+
declare function resolveConfigPath(provider: Provider, scope: "project" | "global", projectDir?: string): string | null;
|
|
330
|
+
/** List MCP servers configured for a single provider */
|
|
331
|
+
declare function listMcpServers(provider: Provider, scope: "project" | "global", projectDir?: string): Promise<McpServerEntry[]>;
|
|
332
|
+
/** List MCP servers across all given providers, deduplicating by config path */
|
|
333
|
+
declare function listAllMcpServers(providers: Provider[], scope: "project" | "global", projectDir?: string): Promise<McpServerEntry[]>;
|
|
334
|
+
/** Remove an MCP server entry from a provider's config file */
|
|
335
|
+
declare function removeMcpServer(provider: Provider, serverName: string, scope: "project" | "global", projectDir?: string): Promise<boolean>;
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* MCP lock file management
|
|
339
|
+
*
|
|
340
|
+
* Tracks installed MCP servers with source and agent metadata.
|
|
341
|
+
* Stored at ~/.agents/.caamp-lock.json (shared with skills lock).
|
|
342
|
+
*/
|
|
343
|
+
|
|
344
|
+
/** Read the lock file */
|
|
345
|
+
declare function readLockFile(): Promise<CaampLockFile>;
|
|
346
|
+
/** Record an MCP server installation */
|
|
347
|
+
declare function recordMcpInstall(serverName: string, source: string, sourceType: SourceType, agents: string[], isGlobal: boolean): Promise<void>;
|
|
348
|
+
/** Remove an MCP server from the lock file */
|
|
349
|
+
declare function removeMcpFromLock(serverName: string): Promise<boolean>;
|
|
350
|
+
/** Get all tracked MCP servers */
|
|
351
|
+
declare function getTrackedMcpServers(): Promise<Record<string, LockEntry>>;
|
|
352
|
+
/** Save last selected agents for UX */
|
|
353
|
+
declare function saveLastSelectedAgents(agents: string[]): Promise<void>;
|
|
354
|
+
/** Get last selected agents */
|
|
355
|
+
declare function getLastSelectedAgents(): Promise<string[] | undefined>;
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Skills lock file management
|
|
359
|
+
*
|
|
360
|
+
* Shares the same lock file as MCP (~/.agents/.caamp-lock.json).
|
|
361
|
+
*/
|
|
362
|
+
|
|
363
|
+
/** Record a skill installation */
|
|
364
|
+
declare function recordSkillInstall(skillName: string, scopedName: string, source: string, sourceType: SourceType, agents: string[], canonicalPath: string, isGlobal: boolean, projectDir?: string, version?: string): Promise<void>;
|
|
365
|
+
/** Remove a skill from the lock file */
|
|
366
|
+
declare function removeSkillFromLock(skillName: string): Promise<boolean>;
|
|
367
|
+
/** Get all tracked skills */
|
|
368
|
+
declare function getTrackedSkills(): Promise<Record<string, LockEntry>>;
|
|
369
|
+
/** Check if a skill has updates available (comparing version/hash) */
|
|
370
|
+
declare function checkSkillUpdate(skillName: string): Promise<{
|
|
371
|
+
hasUpdate: boolean;
|
|
372
|
+
currentVersion?: string;
|
|
373
|
+
latestVersion?: string;
|
|
374
|
+
}>;
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* Marketplace types shared between adapters
|
|
378
|
+
*/
|
|
379
|
+
interface MarketplaceAdapter {
|
|
380
|
+
name: string;
|
|
381
|
+
search(query: string, limit?: number): Promise<MarketplaceResult[]>;
|
|
382
|
+
getSkill(scopedName: string): Promise<MarketplaceResult | null>;
|
|
383
|
+
}
|
|
384
|
+
interface MarketplaceResult {
|
|
385
|
+
name: string;
|
|
386
|
+
scopedName: string;
|
|
387
|
+
description: string;
|
|
388
|
+
author: string;
|
|
389
|
+
stars: number;
|
|
390
|
+
githubUrl: string;
|
|
391
|
+
repoFullName: string;
|
|
392
|
+
path: string;
|
|
393
|
+
source: string;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* Unified marketplace client
|
|
398
|
+
*
|
|
399
|
+
* Aggregates results from multiple marketplace adapters,
|
|
400
|
+
* deduplicates, and sorts by relevance.
|
|
401
|
+
*/
|
|
402
|
+
|
|
403
|
+
declare class MarketplaceClient {
|
|
404
|
+
private adapters;
|
|
405
|
+
constructor(adapters?: MarketplaceAdapter[]);
|
|
406
|
+
/** Search all marketplaces and deduplicate results */
|
|
407
|
+
search(query: string, limit?: number): Promise<MarketplaceResult[]>;
|
|
408
|
+
/** Get a specific skill by scoped name */
|
|
409
|
+
getSkill(scopedName: string): Promise<MarketplaceResult | null>;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Marker-based instruction file injection
|
|
414
|
+
*
|
|
415
|
+
* Injects content blocks between CAAMP markers in instruction files
|
|
416
|
+
* (CLAUDE.md, AGENTS.md, GEMINI.md).
|
|
417
|
+
*/
|
|
418
|
+
|
|
419
|
+
/** Check if a file has a CAAMP injection block */
|
|
420
|
+
declare function checkInjection(filePath: string, expectedContent?: string): Promise<InjectionStatus>;
|
|
421
|
+
/** Inject content into a file */
|
|
422
|
+
declare function inject(filePath: string, content: string): Promise<"created" | "added" | "updated">;
|
|
423
|
+
/** Remove the CAAMP injection block from a file */
|
|
424
|
+
declare function removeInjection(filePath: string): Promise<boolean>;
|
|
425
|
+
/** Check injection status across all providers' instruction files */
|
|
426
|
+
declare function checkAllInjections(providers: Provider[], projectDir: string, scope: "project" | "global", expectedContent?: string): Promise<InjectionCheckResult[]>;
|
|
427
|
+
/** Inject content into all providers' instruction files */
|
|
428
|
+
declare function injectAll(providers: Provider[], projectDir: string, scope: "project" | "global", content: string): Promise<Map<string, "created" | "added" | "updated">>;
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* Instruction template management
|
|
432
|
+
*
|
|
433
|
+
* Generates injection content based on provider capabilities.
|
|
434
|
+
*/
|
|
435
|
+
|
|
436
|
+
/** Generate a standard CAAMP injection block */
|
|
437
|
+
declare function generateInjectionContent(options?: {
|
|
438
|
+
mcpServerName?: string;
|
|
439
|
+
customContent?: string;
|
|
440
|
+
}): string;
|
|
441
|
+
/** Group providers by instruction file */
|
|
442
|
+
declare function groupByInstructFile(providers: Provider[]): Map<string, Provider[]>;
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* Format utility functions
|
|
446
|
+
*/
|
|
447
|
+
/** Deep merge two objects, source wins on conflict */
|
|
448
|
+
declare function deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown>;
|
|
449
|
+
/** Get a nested value using dot-notation key path */
|
|
450
|
+
declare function getNestedValue(obj: Record<string, unknown>, keyPath: string): unknown;
|
|
451
|
+
/** Ensure parent directories exist */
|
|
452
|
+
declare function ensureDir(filePath: string): Promise<void>;
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
* Format router - dispatches config reads/writes to format-specific handlers
|
|
456
|
+
*/
|
|
457
|
+
|
|
458
|
+
/** Read a config file in the specified format */
|
|
459
|
+
declare function readConfig(filePath: string, format: ConfigFormat): Promise<Record<string, unknown>>;
|
|
460
|
+
/** Write a config file in the specified format, preserving existing content */
|
|
461
|
+
declare function writeConfig(filePath: string, format: ConfigFormat, key: string, serverName: string, serverConfig: unknown): Promise<void>;
|
|
462
|
+
/** Remove a server entry from a config file in the specified format */
|
|
463
|
+
declare function removeConfig(filePath: string, format: ConfigFormat, key: string, serverName: string): Promise<boolean>;
|
|
464
|
+
|
|
465
|
+
export { type AuditFinding, type AuditResult, type AuditRule, type AuditSeverity, type CaampLockFile, type ConfigFormat, type DetectionResult, type GlobalOptions, type InjectionCheckResult, type InjectionStatus, type InstallResult, type LockEntry, MarketplaceClient, type MarketplaceSearchResult, type MarketplaceSkill, type McpServerConfig, type McpServerEntry, type ParsedSource, type Provider, type SkillEntry, type SkillInstallResult, type SkillMetadata, type SourceType, type TransportType, type ValidationIssue, type ValidationResult, buildServerConfig, checkAllInjections, checkInjection, checkSkillUpdate, deepMerge, detectAllProviders, detectProjectProviders, detectProvider, discoverSkill, discoverSkills, ensureDir, generateInjectionContent, getAllProviders, getInstalledProviders, getInstructionFiles, getLastSelectedAgents, getNestedValue, getProvider, getProviderCount, getProvidersByInstructFile, getProvidersByPriority, getProvidersByStatus, getRegistryVersion, getTrackedMcpServers, getTrackedSkills, getTransform, groupByInstructFile, inject, injectAll, installMcpServer, installMcpServerToAll, installSkill, isMarketplaceScoped, listAllMcpServers, listCanonicalSkills, listMcpServers, parseSkillFile, parseSource, readConfig, readLockFile, recordMcpInstall, recordSkillInstall, removeConfig, removeInjection, removeMcpFromLock, removeMcpServer, removeSkill, removeSkillFromLock, resolveAlias, resolveConfigPath, saveLastSelectedAgents, scanDirectory, scanFile, toSarif, validateSkill, writeConfig };
|