MCPcopy Create free account
hub / github.com/ChinaSiro/claude-code-sourcemap / g24

Function g24

package/cli.js:915–941  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

913Archive Details`),Y.log(`name: ${A.name}`),Y.log(`version: ${A.version}`),Y.log(`filename: ${E}`),Y.log(`package size: ${pi6(T.length)}`),Y.log(`unpacked size: ${pi6(W)}`),Y.log(`shasum: ${v}`),Y.log(`total files: ${P.length}`),Y.log(`ignored (.mcpbignore) files: ${X}`),Y.log(`
914Output: ${j}`),!0}catch(J){if(J instanceof Error)Y.error(`ERROR: Archive error: ${J.message}`);else Y.error("ERROR: Unknown archive error occurred");return!1}}var Mx1=y(()=>{pS1();zi6();kC1();Jx1();on6();lS1()});function ev8(q,K){if(typeof q==="string"){let _=q;for(let[z,Y]of Object.entries(K)){let $=new RegExp(`\\$\\{${z}\\}`,"g");if(_.match($))if(Array.isArray(Y))console.warn(`Cannot replace ${z} with array value in string context: "${q}"`,{key:z,replacement:Y});else _=_.replace($,Y)}return _}else if(Array.isArray(q)){let _=[];for(let z of q)if(typeof z==="string"&&z.match(/^\$\{user_config\.[^}]+\}$/)){let Y=z.match(/^\$\{([^}]+)\}$/)?.[1];if(Y&&K[Y]){let $=K[Y];if(Array.isArray($))_.push(...$);else _.push($)}else _.push(z)}else _.push(ev8(z,K));return _}else if(q&&typeof q==="object"){let _={};for(let[z,Y]of Object.entries(q))_[z]=ev8(Y,K);return _}return q}async function GQ_(q){let{manifest:K,extensionPath:_,systemDirs:z,userConfig:Y,pathSeparator:$,logger:A}=q,O=K.server?.mcp_config;if(!O)return;let w={...O};if(O.platform_overrides){if(process.platform in O.platform_overrides){let J=O.platform_overrides[process.platform];w.command=J.command||w.command,w.args=J.args||w.args,w.env=J.env||w.env}}if(k24({manifest:K,userConfig:Y})){A?.warn(`Extension ${K.name} has missing required configuration, skipping MCP config`);return}let j={__dirname:_,pathSeparator:$,"/":$,...z},H={};if(K.user_config){for(let[J,M]of Object.entries(K.user_config))if(M.default!==void 0)H[J]=M.default}if(Y)Object.assign(H,Y);for(let[J,M]of Object.entries(H)){let X=`user_config.${J}`;if(Array.isArray(M))j[X]=M.map(String);else if(typeof M==="boolean")j[X]=M?"true":"false";else j[X]=String(M)}return w=ev8(w,j),w}function v24(q){return q===void 0||q===null||q===""}function k24({manifest:q,userConfig:K}){if(!q.user_config)return!1;let _=K||{};for(let[z,Y]of Object.entries(q.user_config))if(Y.required){let $=_[z];if(v24($)||Array.isArray($)&&($.length===0||$.some(v24)))return!0}return!1}var V24=()=>{};var Px1={};T8(Px1,{verifyMcpbFile:()=>lU_,verifyCertificateChain:()=>w24,validateManifest:()=>Hx1,unsignMcpbFile:()=>iU_,unpackExtension:()=>Ax1,signMcpbFile:()=>cU_,shouldExclude:()=>Cx_,replaceVariables:()=>ev8,readPackageJson:()=>S94,readMcpbIgnorePatterns:()=>TC1,promptVisualAssets:()=>c94,promptUserConfig:()=>n94,promptUrls:()=>d94,promptTools:()=>g94,promptServerConfig:()=>B94,promptPrompts:()=>F94,promptOptionalFields:()=>U94,promptLongDescription:()=>Q94,promptCompatibility:()=>l94,promptBasicInfo:()=>m94,promptAuthorInfo:()=>p94,printNextSteps:()=>r94,packExtension:()=>T24,initExtension:()=>cS1,hasRequiredConfigMissing:()=>k24,getMcpConfigForManifest:()=>GQ_,getDefaultServerConfig:()=>I94,getDefaultRepositoryUrl:()=>C94,getDefaultOptionalFields:()=>u94,getDefaultEntryPoint:()=>dS1,getDefaultBasicInfo:()=>b94,getDefaultAuthorUrl:()=>US1,getDefaultAuthorName:()=>gS1,getDefaultAuthorInfo:()=>x94,getDefaultAuthorEmail:()=>FS1,getAllFilesWithCount:()=>aT8,getAllFiles:()=>I_4,extractSignatureBlock:()=>mi6,createMcpConfig:()=>QS1,cleanMcpb:()=>jQ_,buildManifest:()=>i94,McpbUserConfigurationOptionSchema:()=>E94,McpbUserConfigValuesSchema:()=>_x_,McpbSignatureInfoSchema:()=>zx_,McpbManifestToolSchema:()=>N94,McpbManifestServerSchema:()=>k94,McpbManifestSchema:()=>rn6,McpbManifestRepositorySchema:()=>G94,McpbManifestPromptSchema:()=>y94,McpbManifestPlatformOverrideSchema:()=>T94,McpbManifestMcpConfigSchema:()=>v94,McpbManifestCompatibilitySchema:()=>V94,McpbManifestAuthorSchema:()=>Z94,McpServerConfigSchema:()=>BS1,EXCLUDE_PATTERNS:()=>x_4,CURRENT_MANIFEST_VERSION:()=>zO6});var Wx1=y(()=>{lS1();Mx1();Ox1();kC1();Yx1();Jx1();on6();V24()});async function TQ_(q){let{McpbManifestSchema:K}=await Promise.resolve().then(() => (Wx1(),Px1)),_=K.safeParse(q);if(!_.success){let z=_.error.flatten(),Y=[...Object.entries(z.fieldErrors).map(([$,A])=>`${$}: ${A?.join(", ")}`),...z.formErrors||[]].filter(Boolean).join("; ");throw Error(`Invalid manifest: ${Y}`)}return _.data}async function vQ_(q){let K;try{K=r8(q)}catch(_){throw Error(`Invalid JSON in manifest.json: ${d6(_)}`)}return TQ_(K)}async function Dx1(q){let K=new TextDecoder().decode(q);return vQ_(K)}var N24=y(()=>{y8();l8()});import{isAbsolute as kQ_,normalize as VQ_}from"path";function NQ_(q){if(yB(q))return!1;let K=VQ_(q);if(kQ_(K))return!1;return!0}function yQ_(q,K){K.fileCount++;let _;if(K.fileCount>g76.MAX_FILE_COUNT)_=`Archive contains too many files: ${K.fileCount} (max: ${g76.MAX_FILE_COUNT})`;if(!NQ_(q.name))_=`Unsafe file path detected: "${q.name}". Path traversal or absolute paths are not allowed.`;let z=q.originalSize||0;if(z>g76.MAX_FILE_SIZE)_=`File "${q.name}" is too large: ${Math.round(z/1024/1024)}MB (max: ${Math.round(g76.MAX_FILE_SIZE/1024/1024)}MB)`;if(K.totalUncompressedSize+=z,K.totalUncompressedSize>g76.MAX_TOTAL_SIZE)_=`Archive total size is too large: ${Math.round(K.totalUncompressedSize/1024/1024)}MB (max: ${Math.round(g76.MAX_TOTAL_SIZE/1024/1024)}MB)`;let Y=K.totalUncompressedSize/K.compressedSize;if(Y>g76.MAX_COMPRESSION_RATIO)_=`Suspicious compression ratio detected: ${Y.toFixed(1)}:1 (max: ${g76.MAX_COMPRESSION_RATIO}:1). This may be a zip bomb.`;return _?{isValid:!1,error:_}:{isValid:!0}}async function Gk6(q){let{unzipSync:K}=await Promise.resolve().then(() => (zi6(),fC1)),z={fileCount:0,totalUncompressedSize:0,compressedSize:q.length,errors:[]},Y=K(new Uint8Array(q),{filter:($)=>{let A=yQ_($,z);if(!A.isValid)throw Error(A.error);return!0}});return N(`Zip extraction completed: ${z.fileCount} files, ${Math.round(z.totalUncompressedSize/1024)}KB uncompressed`),Y}function Tk6(q){let K=Buffer.from(q.buffer,q.byteOffset,q.byteLength),_={},z=Math.max(0,K.length-22-65535),Y=-1;for(let O=K.length-22;O>=z;O--)if(K.readUInt32LE(O)===101010256){Y=O;break}if(Y<0)return _;let $=K.readUInt16LE(Y+10),A=K.readUInt32LE(Y+16);for(let O=0;O<$;O++){if(A+46>K.length||K.readUInt32LE(A)!==33639248)break;let w=K.readUInt16LE(A+4),j=K.readUInt16LE(A+28),H=K.readUInt16LE(A+30),J=K.readUInt16LE(A+32),M=K.readUInt32LE(A+38),X=K.toString("utf8",A+46,A+46+j);if(w>>8===3){let P=M>>>16&65535;if(P)_[X]=P}A+=46+j+H+J}return _}var g76;var qk8=y(()=>{_8();y8();e7();dz();g76={MAX_FILE_SIZE:536870912,MAX_TOTAL_SIZE:1073741824,MAX_FILE_COUNT:1e5,MAX_COMPRESSION_RATIO:50,MIN_COMPRESSION_RATIO:0.5}});import{homedir as EQ_}from"os";import{join as vk6}from"path";function y24(q){let K=q?.platform??Z1(),_=q?.homedir??EQ_(),z=q?.env??process.env,Y={HOME:_,DESKTOP:vk6(_,"Desktop"),DOCUMENTS:vk6(_,"Documents"),DOWNLOADS:vk6(_,"Downloads")};switch(K){case"windows":{let $=z.USERPROFILE||_;return{HOME:_,DESKTOP:vk6($,"Desktop"),DOCUMENTS:vk6($,"Documents"),DOWNLOADS:vk6($,"Downloads")}}case"linux":case"wsl":return{HOME:_,DESKTOP:z.XDG_DESKTOP_DIR||Y.DESKTOP,DOCUMENTS:z.XDG_DOCUMENTS_DIR||Y.DOCUMENTS,DOWNLOADS:z.XDG_DOWNLOAD_DIR||Y.DOWNLOADS};case"macos":default:{if(K==="unknown")N("Unknown platform detected, using default paths");return Y}}}var E24=y(()=>{_8();vK()});import{createHash as Zx1}from"crypto";import{chmod as LQ_,writeFile as _k8}from"fs/promises";import{dirname as RQ_,join as F76}from"path";function kC(q){return q.endsWith(".mcpb")||q.endsWith(".dxt")}function L24(q){return q.startsWith("http://")||q.startsWith("https://")}function hQ_(q){return Zx1("sha256").update(q).digest("hex").substring(0,16)}function R24(q){return F76(q,".mcpb-cache")}function h24(q,K){let _=Zx1("md5").update(K).digest("hex").substring(0,8);return F76(q,`${_}.metadata.json`)}function S24(q,K){return`${q}/${K}`}function TO6(q,K){try{let z=Z7().pluginConfigs?.[q]?.mcpServers?.[K],Y=c3().read()?.pluginSecrets?.[S24(q,K)];if(!z&&!Y)return null;return N(`Loaded user config for ${q}/${K} (settings + secureStorage)`),{...z,...Y}}catch(_){let z=x1(_);return H6(z),N(`Failed to load user config for ${q}/${K}: ${_}`,{level:"error"}),null}}function zk8(q,K,_,z){try{let Y={},$={};for(let[D,f]of Object.entries(_))if(z[D]?.sensitive===!0)$[D]=String(f);else Y[D]=f;let A=new Set(Object.keys($)),O=new Set(Object.keys(Y)),w=c3(),j=S24(q,K),H=w.read()?.pluginSecrets?.[j]??void 0,J=H?Object.fromEntries(Object.entries(H).filter(([D])=>!O.has(D))):void 0,M=J&&H&&Object.keys(J).length!==Object.keys(H).length;if(Object.keys($).length>0||M){let D=w.read()??{};if(!D.pluginSecrets)D.pluginSecrets={};D.pluginSecrets[j]={...J,...$};let f=w.update(D);if(!f.success)throw Error(`Failed to save sensitive config to secure storage for ${j}`);if(f.warning)N(`Server secrets save warning: ${f.warning}`,{level:"warn"});if(M)N(`saveMcpServerUserConfig: scrubbed ${Object.keys(H).length-Object.keys(J).length} stale non-sensitive key(s) from secureStorage for ${j}`)}let X=Z7(),P=X.pluginConfigs?.[q]?.mcpServers?.[K]??{},W=Object.keys(P).filter((D)=>A.has(D));if(Object.keys(Y).length>0||W.length>0){if(!X.pluginConfigs)X.pluginConfigs={};if(!X.pluginConfigs[q])X.pluginConfigs[q]={};if(!X.pluginConfigs[q].mcpServers)X.pluginConfigs[q].mcpServers={};let D=Object.fromEntries(W.map((G)=>[G,void 0]));X.pluginConfigs[q].mcpServers[K]={...Y,...D};let f=W7("userSettings",X);if(f.error)throw f.error;if(W.length>0)N(`saveMcpServerUserConfig: scrubbed ${W.length} plaintext sensitive key(s) from settings.json for ${q}/${K}`)}N(`Saved user config for ${q}/${K} (${Object.keys(Y).length} non-sensitive, ${Object.keys($).length} sensitive)`)}catch(Y){let $=x1(Y);throw H6($),Error(`Failed to save user configuration for ${q}/${K}: ${$.message}`)}}function vO6(q,K){let _=[];for(let[z,Y]of Object.entries(K)){let $=q[z];if(Y.required&&($===void 0||$==="")){_.push(`${Y.title||z} is required but not provided`);continue}if($===void 0||$==="")continue;if(Y.type==="string"){if(Array.isArray($)){if(!Y.multiple)_.push(`${Y.title||z} must be a string, not an array`);else if(!$.every((A)=>typeof A==="string"))_.push(`${Y.title||z} must be an array of strings`)}else if(typeof $!=="string")_.push(`${Y.title||z} must be a string`)}else if(Y.type==="number"&&typeof $!=="number")_.push(`${Y.title||z} must be a number`);else if(Y.type==="boolean"&&typeof $!=="boolean")_.push(`${Y.title||z} must be a boolean`);else if((Y.type==="file"||Y.type==="directory")&&typeof $!=="string")_.push(`${Y.title||z} must be a path string`);if(Y.type==="number"&&typeof $==="number"){if(Y.min!==void 0&&$<Y.min)_.push(`${Y.title||z} must be at least ${Y.min}`);if(Y.max!==void 0&&$>Y.max)_.push(`${Y.title||z} must be at most ${Y.max}`)}}return{valid:_.length===0,errors:_}}async function Kk8(q,K,_={}){let{getMcpConfigForManifest:z}=await Promise.resolve().then(() => (Wx1(),Px1)),Y=await z({manifest:q,extensionPath:K,systemDirs:y24(),userConfig:_,pathSeparator:"/"});if(!Y){let $=Error(`Failed to generate MCP server configuration from manifest "${q.name}"`);throw H6($),$}return Y}async function C24(q,K){let _=X8(),z=h24(q,K);try{let Y=await _.readFile(z,{encoding:"utf-8"});return r8(Y)}catch(Y){if(s1(Y)==="ENOENT")return null;let A=x1(Y);return H6(A),N(`Failed to load MCPB cache metadata: ${Y}`,{level:"error"}),null}}async function fx1(q,K,_){let z=h24(q,K);await X8().mkdir(q),await _k8(z,g6(_,null,2),"utf-8")}async function SQ_(q,K,_){if(N(`Downloading MCPB from ${q}`),_)_(`Downloading ${q}...`);let z=performance.now(),Y=!1;try{let $=await $1.get(q,{timeout:120000,responseType:"arraybuffer",maxRedirects:5,onDownloadProgress:(O)=>{if(O.total&&_){let w=Math.round(O.loaded/O.total*100);_(`Downloading... ${w}%`)}}}),A=new Uint8Array($.data);if(KD("mcpb",q,"success",performance.now()-z),Y=!0,await _k8(K,Buffer.from(A)),N(`Downloaded ${A.length} bytes to ${K}`),_)_("Download complete");return A}catch($){if(!Y)KD("mcpb",q,"failure",performance.now()-z,zC($));let A=d6($),O=Error(`Failed to download MCPB file from ${q}: ${A}`);throw H6(O),O}}async function CQ_(q,K,_,z){if(z)z("Extracting files...");await X8().mkdir(K);let Y=0,$=Object.entries(q).filter(([O])=>!O.endsWith("/")),A=$.length;for(let[O,w]of $){let j=F76(K,O),H=RQ_(j);if(H!==K)await X8().mkdir(H);if(O.endsWith(".json")||O.endsWith(".js")||O.endsWith(".ts")||O.endsWith(".txt")||O.endsWith(".md")||O.endsWith(".yml")||O.endsWith(".yaml")){let X=new TextDecoder().decode(w);await _k8(j,X,"utf-8")}else await _k8(j,Buffer.from(w));let M=_[O];if(M&&M&73)await LQ_(j,M&511).catch(()=>{});if(Y++,z&&Y%10===0)z(`Extracted ${Y}/${A} files`)}if(N(`Extracted ${Y} files to ${K}`),z)z(`Extraction complete (${Y} files)`)}async function bQ_(q,K){let _=X8(),z=R24(K),Y=await C24(z,q);if(!Y)return!0;try{await _.stat(Y.extractedPath)}catch($){if(s1($)==="ENOENT")N(`MCPB extraction path missing: ${Y.extractedPath}`);else N(`MCPB extraction path inaccessible: ${Y.extractedPath}: ${$}`,{level:"error"});return!0}if(!L24(q)){let $=F76(K,q),A;try{A=await _.stat($)}catch(j){if(s1(j)==="ENOENT")N(`MCPB source file missing: ${$}`);else N(`MCPB source file inaccessible: ${$}: ${j}`,{level:"error"});return!0}let O=new Date(Y.cachedAt).getTime(),w=Math.floor(A.mtimeMs);if(w>O)return N(`MCPB file modified: ${new Date(w)} > ${new Date(O)}`),!0}return!1}async function Bi6(q,K,_,z,Y,$){let A=X8(),O=R24(K);await A.mkdir(O),N(`Loading MCPB from source: ${q}`);let w=await C24(O,q);if(w&&!await bQ_(q,K)){N(`Using cached MCPB from ${w.extractedPath} (hash: ${w.contentHash})`);let Z=F76(w.extractedPath,"manifest.json"),T;try{T=await A.readFile(Z,{encoding:"utf-8"})}catch(S){if(_7(S)){let R=Error(`Cached manifest not found: ${Z}`);throw H6(R),R}throw S}let v=new TextEncoder().encode(T),V=await Dx1(v);if(V.user_config&&Object.keys(V.user_config).length>0){let S=V.name,R=TO6(_,S),x=Y||R||{},I=vO6(x,V.user_config);if($||!I.valid)return{status:"needs-config",manifest:V,extractedPath:w.extractedPath,contentHash:w.contentHash,configSchema:V.user_config,existingConfig:R||{},validationErrors:I.valid?[]:I.errors};if(Y)zk8(_,S,Y,V.user_config??{});let B=await Kk8(V,w.extractedPath,x);return{manifest:V,mcpConfig:B,extractedPath:w.extractedPath,contentHash:w.contentHash}}let E=await Kk8(V,w.extractedPath);return{manifest:V,mcpConfig:E,extractedPath:w.extractedPath,contentHash:w.contentHash}}let j,H;if(L24(q)){let Z=Zx1("md5").update(q).digest("hex").substring(0,8);H=F76(O,`${Z}.mcpb`),j=await SQ_(q,H,z)}else{let Z=F76(K,q);if(z)z(`Loading ${q}...`);try{j=await A.readFileBytes(Z),H=Z}catch(T){if(_7(T)){let v=Error(`MCPB file not found: ${Z}`);throw H6(v),v}throw T}}let J=hQ_(j);if(N(`MCPB content hash: ${J}`),z)z("Extracting MCPB archive...");let M=await Gk6(Buffer.from(j)),X=Tk6(j),P=M["manifest.json"];if(!P){let Z=Error("No manifest.json found in MCPB file");throw H6(Z),Z}let W=await Dx1(P);if(N(`MCPB manifest: ${W.name} v${W.version} by ${W.author.name}`),!W.server){let Z=Error(`MCPB manifest for "${W.name}" does not define a server configuration`);throw H6(Z),Z}let D=F76(O,J);if(await CQ_(M,D,X,z),W.user_config&&Object.keys(W.user_config).length>0){let Z=W.name,T=TO6(_,Z),v=Y||T||{},V=vO6(v,W.user_config);if(!V.valid){let R={source:q,contentHash:J,extractedPath:D,cachedAt:new Date().toISOString(),lastChecked:new Date().toISOString()};return await fx1(O,q,R),{status:"needs-config",manifest:W,extractedPath:D,contentHash:J,configSchema:W.user_config,existingConfig:T||{},validationErrors:V.errors}}if(Y)zk8(_,Z,Y,W.user_config??{});if(z)z("Generating MCP server configuration...");let E=await Kk8(W,D,v),S={source:q,contentHash:J,extractedPath:D,cachedAt:new Date().toISOString(),lastChecked:new Date().toISOString()};return await fx1(O,q,S),{manifest:W,mcpConfig:E,extractedPath:D,contentHash:J}}if(z)z("Generating MCP server configuration...");let f=await Kk8(W,D),G={source:q,contentHash:J,extractedPath:D,cachedAt:new Date().toISOString(),lastChecked:new Date().toISOString()};return await fx1(O,q,G),N(`Successfully loaded MCPB: ${W.name} (extracted to ${D})`),{manifest:W,mcpConfig:f,extractedPath:D,contentHash:J}}var gi6=y(()=>{CK();_8();N24();qk8();y8();e7();E8();$16();U1();l8();E24();kn6()});function Fi6(q){return q.source}function Yk8(){VG.cache?.clear?.()}function $k8(q,K,_){let z={},Y={};for(let[P,W]of Object.entries(K))if(_[P]?.sensitive===!0)Y[P]=String(W);else z[P]=W;let $=new Set(Object.keys(Y)),A=new Set(Object.keys(z)),O=c3(),w=O.read()?.pluginSecrets?.[q]??void 0,j=w?Object.fromEntries(Object.entries(w).filter(([P])=>!A.has(P))):void 0,H=j&&w&&Object.keys(j).length!==Object.keys(w).length;if(Object.keys(Y).length>0||H){let P=O.read()??{};if(!P.pluginSecrets)P.pluginSecrets={};P.pluginSecrets[q]={...j,...Y};let W=O.update(P);if(!W.success){let D=Error(`Failed to save sensitive plugin options for ${q} to secure storage`);throw H6(D),D}if(W.warning)N(`Plugin secrets save warning: ${W.warning}`,{level:"warn"})}let J=Z7(),M=J.pluginConfigs?.[q]?.options??{},X=Object.keys(M).filter((P)=>$.has(P));if(Object.keys(z).length>0||X.length>0){if(!J.pluginConfigs)J.pluginConfigs={};if(!J.pluginConfigs[q])J.pluginConfigs[q]={};let P=Object.fromEntries(X.map((D)=>[D,void 0]));J.pluginConfigs[q].options={...z,...P};let W=W7("userSettings",J);if(W.error)throw H6(W.error),Error(`Failed to save plugin options for ${q}: ${W.error.message}`)}Yk8()}function Ak8(q){if(Z7().pluginConfigs?.[q]){let Y={[q]:void 0},{error:$}=W7("userSettings",{pluginConfigs:Y});if($)N(`deletePluginOptions: failed to clear settings.pluginConfigs[${q}]: ${$.message}`,{level:"warn"})}let _=c3(),z=_.read();if(z?.pluginSecrets){let Y=`${q}/`,$=Object.entries(z.pluginSecrets).filter(([A])=>A!==q&&!A.startsWith(Y));if($.length!==Object.keys(z.pluginSecrets).length){if(!_.update({...z,pluginSecrets:$.length>0?Object.fromEntries($):void 0}).success)N(`deletePluginOptions: failed to clear pluginSecrets for ${q} from keychain`,{level:"warn"})}}Yk8()}function b24(q){let K=q.manifest.userConfig;if(!K||Object.keys(K).length===0)return{};let _=VG(Fi6(q));if(vO6(_,K).valid)return{};let Y={};for(let[$,A]of Object.entries(K))if(!vO6({[$]:_[$]},{[$]:A}).valid)Y[$]=A;return Y}function dF(q,K){let _=(Y)=>process.platform==="win32"?Y.replace(/\\/g,"/"):Y,z=q.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g,()=>_(K.path));if(K.source){let Y=K.source;z=z.replace(/\$\{CLAUDE_PLUGIN_DATA\}/g,()=>_(ei(Y)))}return z}function kk6(q,K){return q.replace(/\$\{user_config\.([^}]+)\}/g,(_,z)=>{let Y=K[z];if(Y===void 0)throw Error(`Missing required user configuration value: ${z}. This should have been validated before variable substitution.`);return String(Y)})}function Ok8(q,K,_){return q.replace(/\$\{user_config\.([^}]+)\}/g,(z,Y)=>{if(_[Y]?.sensitive===!0)return`[sensitive option '${Y}' not available in skill content]`;let $=K[Y];if($===void 0)return z;return String($)})}var VG;var mu=y(()=>{F4();_8();E8();$16();U1();gi6();aV();VG=_1((q)=>{let _=Z7().pluginConfigs?.[q]?.options??{},Y=c3().read()?.pluginSecrets?.[q]??{};return{..._,...Y}})});import{join as x24}from"path";async function Vk6(q,K,_={}){let z=X8(),Y=_.logLabel??"plugin";async function $(A,O){try{let w=await z.readdir(A);if(_.stopAtSkillDir&&w.some((j)=>j.isFile()&&xQ_.test(j.name))){await Promise.all(w.map((j)=>j.isFile()&&j.name.toLowerCase().endsWith(".md")?K(x24(A,j.name),O):void 0));return}await Promise.all(w.map((j)=>{let H=x24(A,j.name);if(j.isDirectory())return $(H,[...O,j.name]);if(j.isFile()&&j.name.toLowerCase().endsWith(".md"))return K(H,O);return}))}catch(w){N(`Failed to scan ${Y} directory ${A}: ${w}`,{level:"error"})}}await $(q,[])}var xQ_;var wk8=y(()=>{_8();e7();xQ_=/^skill\.md$/i});import{basename as IQ_}from"path";async function u24(q,K,_,z,Y,$){let A=[];return await Vk6(q,async(O,w)=>{let j=await m24(O,K,w,_,z,Y,$);if(j)A.push(j)},{logLabel:"agents"}),A}async function m24(q,K,_,z,Y,$,A){let O=X8();if(Cc(O,q,A))return null;try{let w=await O.readFile(q,{encoding:"utf-8"}),{frontmatter:j,content:H}=kH(w,q),J=j.name||IQ_(q).replace(/\.md$/,""),X=[K,..._,J].join(":"),P=Lu(j.description,X)??Lu(j["when-to-use"],X)??`Agent from ${K} plugin`,W=Y76(j.tools),D=RF(j.skills),f=j.color,G=j.model,Z;if(typeof G==="string"&&G.trim().length>0){let F=G.trim();Z=F.toLowerCase()==="inherit"?"inherit":F}let T=j.background,v=T==="true"||T===!0?!0:void 0,V=dF(H.trim(),{path:Y,source:z});if($.userConfig)V=Ok8(V,VG(z),$.userConfig);let E=j.memory,S;if(E!==void 0)if(I24.includes(E))S=E;else N(`Plugin agent file ${q} has invalid memory value '${E}'. Valid options: ${I24.join(", ")}`);let x=j.isolation==="worktree"?"worktree":void 0,I=j.effort,B=I!==void 0?OC(I):void 0;if(I!==void 0&&B===void 0)N(`Plugin agent file ${q} has invalid effort '${I}'. Valid options: ${DL.join(", ")} or an integer`);for(let F of["permissionMode","hooks","mcpServers"])if(j[F]!==void 0)N(`Plugin agent file ${q} sets ${F}, which is ignored for plugin agents. Use .claude/agents/ for this level of control.`,{level:"warn"});let p=j.maxTurns,C=mG8(p);if(p!==void 0&&C===void 0)N(`Plugin agent file ${q} has invalid maxTurns '${p}'. Must be a positive integer.`);let g=j.disallowedTools!==void 0?Y76(j.disallowedTools):void 0;if(l3()&&S&&W!==void 0){let F=new Set(W);for(let U of[tK,X4,Cq])if(!F.has(U))W=[...W,U]}return{agentType:X,whenToUse:P,tools:W,...g!==void 0?{disallowedTools:g}:{},...D!==void 0?{skills:D}:{},getSystemPrompt:()=>{if(l3()&&S){let F=kO6(X,S);return V+`
915
916`+F}return V},source:"plugin",color:f,model:Z,filename:J,plugin:z,...v?{background:v}:{},...S?{memory:S}:{},...x?{isolation:x}:{},...B!==void 0?{effort:B}:{},...C!==void 0?{maxTurns:C}:{}}}catch(w){return N(`Failed to load agent from ${q}: ${w}`,{level:"error"}),null}}function jk8(){Ui6.cache?.clear?.()}var I24,Ui6;var Hk8=y(()=>{F4();rw();pu();IY();E2();_8();q0();rV();e7();ri();bj();mu();wk8();I24=["user","project","local"];Ui6=_1(async()=>{let{enabled:q,errors:K}=await ZJ();if(K.length>0)N(`Plugin loading errors: ${K.map((Y)=>$M(Y)).join(", ")}`);let z=(await Promise.all(q.map(async(Y)=>{let $=new Set,A=[];if(Y.agentsPath)try{let O=await u24(Y.agentsPath,Y.name,Y.source,Y.path,Y.manifest,$);if(A.push(...O),O.length>0)N(`Loaded ${O.length} agents from plugin ${Y.name} default directory`)}catch(O){N(`Failed to load agents from plugin ${Y.name} default directory: ${O}`,{level:"error"})}if(Y.agentsPaths){let O=await Promise.all(Y.agentsPaths.map(async(w)=>{try{let H=await X8().stat(w);if(H.isDirectory()){let J=await u24(w,Y.name,Y.source,Y.path,Y.manifest,$);if(J.length>0)N(`Loaded ${J.length} agents from plugin ${Y.name} custom path: ${w}`);return J}else if(H.isFile()&&w.endsWith(".md")){let J=await m24(w,Y.name,[],Y.source,Y.path,Y.manifest,$);if(J)return N(`Loaded agent from plugin ${Y.name} custom file: ${w}`),[J]}return[]}catch(j){return N(`Failed to load agents from plugin ${Y.name} custom path ${w}: ${j}`,{level:"error"}),[]}}));for(let w of O)A.push(...w)}return A}))).flat();return N(`Total plugin agents loaded: ${z.length}`),z})});function wr(q){if(q==="general-purpose")return;let _=w38().get(q);if(_&&GJ.includes(_))return vX[_];return}function VO6(q,K){let _=w38();if(!K){_.delete(q);return}if(GJ.includes(K))_.set(q,K)}var GJ,vX;var $0=y(()=>{v8();GJ=["red","blue","green","yellow","purple","orange","pink","cyan"],vX={red:"red_FOR_SUBAGENTS_ONLY",blue:"blue_FOR_SUBAGENTS_ONLY",green:"green_FOR_SUBAGENTS_ONLY",yellow:"yellow_FOR_SUBAGENTS_ONLY",purple:"purple_FOR_SUBAGENTS_ONLY",orange:"orange_FOR_SUBAGENTS_ONLY",pink:"pink_FOR_SUBAGENTS_ONLY",cyan:"cyan_FOR_SUBAGENTS_ONLY"}});var IiA,uiA;var p24=y(()=>{x7();I7();_8();l8();pu();IiA=B6(()=>L.object({updatedAt:L.string().min(1)})),uiA=B6(()=>L.object({syncedFrom:L.string().min(1)}))});var wD="SendMessage";function Qi6(){let q=new Date,K=q.getFullYear(),_=String(q.getMonth()+1).padStart(2,"0"),z=String(q.getDate()).padStart(2,"0");return`${K}-${_}-${z}`}function B24(){return new Date().toLocaleString("en-US",{month:"long",year:"numeric"})}var Jk8;var yk6=y(()=>{F4();Jk8=_1(Qi6)});function g24(){return`
917- Allows Claude to search the web and use the results to inform responses
918- Provides up-to-date information for current events and recent data
919- Returns search result information formatted as search result blocks, including links as markdown hyperlinks
920- Use this tool for accessing information beyond Claude's knowledge cutoff
921- Searches are performed automatically within a single API call
922
923CRITICAL REQUIREMENT - You MUST follow this:
924 - After answering the user's question, you MUST include a "Sources:" section at the end of your response
925 - In the Sources section, list all relevant URLs from the search results as markdown hyperlinks: [Title](URL)
926 - This is MANDATORY - never skip including sources in your response
927 - Example format:
928
929 [Your answer here]
930
931 Sources:
932 - [Source Title 1](https://example.com/1)
933 - [Source Title 2](https://example.com/2)
934
935Usage notes:
936 - Domain filtering is supported to include or block specific websites
937 - Web search is only available in the US
938
939IMPORTANT - Use the correct year in search queries:
940 - The current month is ${B24()}. You MUST use this year when searching for recent information, documentation, or current events.
941 - Example: If the user asks for "latest React docs", search for "React documentation" with the current year, NOT last year
942`}var $N="WebSearch";var NO6=y(()=>{yk6()});function mQ_(){let q=Nj()?`${Cq}, \`find\`, and \`grep\``:`${Cq}, ${i9}, and ${n3}`;return`You are the Claude guide agent. Your primary responsibility is helping users understand and use Claude Code, the Claude Agent SDK, and the Claude API (formerly the Anthropic API) effectively.
943
944**Your expertise spans three domains:**

Callers 1

promptFunction · 0.85

Calls 1

B24Function · 0.85

Tested by

no test coverage detected