@402md/skillmd 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 +279 -0
- package/dist/index.cjs +771 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +331 -0
- package/dist/index.d.ts +331 -0
- package/dist/index.js +723 -0
- package/dist/index.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/parse.ts","../src/constants.ts","../src/validate.ts","../src/generate.ts","../src/mcp.ts","../src/schema.ts"],"sourcesContent":["import YAML from 'yaml'\nimport type {\n EndpointSpec,\n HttpMethod,\n LegacyFrontmatter,\n PaymentConfig,\n PaymentNetwork,\n SkillManifest,\n SkillType\n} from './types'\nimport {\n FRONTMATTER_RE,\n SKILL_TYPES_SET,\n HTTP_METHODS_SET,\n PAYMENT_NETWORKS_SET\n} from './constants'\n\n// ── Public API ──────────────────────────────────────────\n\n/**\n * Parse a SKILL.md string into a SkillManifest.\n * Supports both v2 (with payment block) and v1 (legacy) formats.\n */\nexport function parseSkillMd(content: string): SkillManifest {\n const { data, body } = extractFrontmatter(content)\n return buildManifest(data, body)\n}\n\n/**\n * Extract raw frontmatter data and body from a SKILL.md string.\n * Lower-level than parseSkillMd — returns unprocessed YAML data.\n */\nexport function parseFrontmatter(md: string): {\n data: LegacyFrontmatter\n body: string\n} {\n const match = md.match(FRONTMATTER_RE)\n if (!match) {\n return { data: { name: 'unknown' }, body: md }\n }\n const data = YAML.parse(match[1]) as LegacyFrontmatter\n return { data, body: match[2] }\n}\n\n// ── Internal ────────────────────────────────────────────\n\nfunction extractFrontmatter(content: string): {\n data: Record<string, unknown>\n body: string\n} {\n const match = content.match(FRONTMATTER_RE)\n if (!match) {\n throw new Error('Invalid SKILL.md: missing frontmatter delimiters (---)')\n }\n const data = YAML.parse(match[1]) as Record<string, unknown>\n return { data, body: match[2].trim() }\n}\n\nfunction buildManifest(\n data: Record<string, unknown>,\n body: string\n): SkillManifest {\n const name = requireString(data, 'name')\n const description = requireString(data, 'description')\n const base_url = requireString(data, 'base_url')\n\n const rawType = getString(data, 'type') ?? 'API'\n const type = SKILL_TYPES_SET.has(rawType) ? (rawType as SkillType) : 'API'\n\n const payment = parsePayment(data)\n const endpoints = parseEndpoints(data)\n\n return {\n name,\n displayName: getString(data, 'displayName'),\n description,\n version: getString(data, 'version'),\n author: getString(data, 'author'),\n base_url,\n type,\n payment,\n endpoints,\n tags: getStringArray(data, 'tags'),\n category: getString(data, 'category'),\n sla: getString(data, 'sla'),\n rateLimit: getString(data, 'rateLimit'),\n sandbox: getString(data, 'sandbox'),\n body\n }\n}\n\nfunction parsePayment(data: Record<string, unknown>): PaymentConfig {\n const raw = data.payment\n\n // v2 format: payment block\n if (raw && typeof raw === 'object' && !Array.isArray(raw)) {\n const payment = raw as Record<string, unknown>\n const networks = parseNetworks(payment.networks)\n return {\n networks,\n asset: getString(payment, 'asset') ?? 'USDC',\n payTo: requireString(payment, 'payTo'),\n payToEvm: getString(payment, 'payToEvm'),\n facilitator: getString(payment, 'facilitator')\n }\n }\n\n // v1 fallback: no payment block — return defaults\n return {\n networks: ['base'],\n asset: 'USDC',\n payTo: ''\n }\n}\n\nfunction parseNetworks(raw: unknown): PaymentNetwork[] {\n if (!Array.isArray(raw)) return ['base']\n return raw\n .filter(n => typeof n === 'string' && PAYMENT_NETWORKS_SET.has(n))\n .map(n => n as PaymentNetwork)\n}\n\nfunction parseEndpoints(data: Record<string, unknown>): EndpointSpec[] {\n const raw = data.endpoints\n if (!Array.isArray(raw)) return []\n\n return raw\n .filter(e => e && typeof e === 'object')\n .map(e => {\n const ep = e as Record<string, unknown>\n const method = (getString(ep, 'method') ?? 'POST').toUpperCase()\n\n return {\n path: getString(ep, 'path') ?? '/',\n method: (HTTP_METHODS_SET.has(method) ? method : 'POST') as HttpMethod,\n description: getString(ep, 'description') ?? '',\n priceUsdc: getString(ep, 'priceUsdc') ?? getString(ep, 'price') ?? '0',\n inputSchema: getObject(ep, 'inputSchema'),\n outputSchema: getObject(ep, 'outputSchema')\n }\n })\n}\n\n// ── Helpers ─────────────────────────────────────────────\n\nfunction requireString(obj: Record<string, unknown>, key: string): string {\n const val = obj[key]\n if (typeof val === 'string') return val\n if (typeof val === 'number' || typeof val === 'boolean') return String(val)\n throw new Error(`Missing required field: ${key}`)\n}\n\nfunction getString(\n obj: Record<string, unknown>,\n key: string\n): string | undefined {\n const val = obj[key]\n if (typeof val === 'string') return val\n if (typeof val === 'number' || typeof val === 'boolean') return String(val)\n return undefined\n}\n\nfunction getStringArray(\n obj: Record<string, unknown>,\n key: string\n): string[] | undefined {\n const val = obj[key]\n if (!Array.isArray(val)) return undefined\n return val.filter(v => typeof v === 'string')\n}\n\nfunction getObject(\n obj: Record<string, unknown>,\n key: string\n): Record<string, unknown> | undefined {\n const val = obj[key]\n if (val && typeof val === 'object' && !Array.isArray(val)) {\n return val as Record<string, unknown>\n }\n return undefined\n}\n","import type { HttpMethod, PaymentNetwork, SkillType } from './types'\n\nexport const SKILL_TYPES: readonly SkillType[] = [\n 'API',\n 'SAAS',\n 'PRODUCT',\n 'SERVICE',\n 'SUBSCRIPTION',\n 'CONTENT'\n] as const\n\nexport const HTTP_METHODS: readonly HttpMethod[] = [\n 'GET',\n 'POST',\n 'PUT',\n 'DELETE',\n 'PATCH'\n] as const\n\nexport const PAYMENT_NETWORKS: readonly PaymentNetwork[] = [\n 'stellar',\n 'base',\n 'base-sepolia',\n 'stellar-testnet'\n] as const\n\nexport const SKILL_TYPES_SET = new Set<string>(SKILL_TYPES)\nexport const HTTP_METHODS_SET = new Set<string>(HTTP_METHODS)\nexport const PAYMENT_NETWORKS_SET = new Set<string>(PAYMENT_NETWORKS)\n\nexport const FRONTMATTER_RE = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/\n","import type {\n EndpointSpec,\n SkillManifest,\n ValidationError,\n ValidationResult,\n ValidationWarning\n} from './types'\nimport { parseSkillMd } from './parse'\nimport {\n SKILL_TYPES_SET,\n HTTP_METHODS_SET,\n PAYMENT_NETWORKS_SET\n} from './constants'\n\nconst NAME_RE = /^[a-z0-9][a-z0-9_-]*$/\nconst SEMVER_RE = /^\\d+\\.\\d+\\.\\d+/\nconst PRICE_RE = /^\\d+(\\.\\d+)?$/\nconst EVM_ADDRESS_RE = /^0x[a-fA-F0-9]{40}$/\nconst STELLAR_ADDRESS_RE = /^G[A-Z2-7]{55}$/\n\n// ── Public API ──────────────────────────────────────────\n\n/**\n * Validate a SkillManifest (already parsed).\n */\nexport function validateSkill(manifest: SkillManifest): ValidationResult {\n const errors: ValidationError[] = []\n const warnings: ValidationWarning[] = []\n\n validateName(manifest.name, errors)\n validateDescription(manifest.description, errors)\n validateBaseUrl(manifest.base_url, errors)\n validateType(manifest.type, errors)\n validatePayment(manifest.payment, errors, warnings)\n validateEndpoints(manifest.endpoints, errors, warnings)\n validateVersion(manifest.version, warnings)\n validateTags(manifest.tags, warnings)\n\n return {\n valid: errors.length === 0,\n errors,\n warnings\n }\n}\n\n/**\n * Validate a raw SKILL.md string (parse + validate).\n */\nexport function validateSkillMd(content: string): ValidationResult {\n try {\n const manifest = parseSkillMd(content)\n return validateSkill(manifest)\n } catch (err) {\n return {\n valid: false,\n errors: [\n {\n field: 'frontmatter',\n message:\n err instanceof Error ? err.message : 'Failed to parse SKILL.md',\n code: 'PARSE_ERROR'\n }\n ],\n warnings: []\n }\n }\n}\n\n// ── Validators ──────────────────────────────────────────\n\nfunction validateName(name: string, errors: ValidationError[]) {\n if (!name) {\n errors.push({\n field: 'name',\n message: 'Name is required',\n code: 'REQUIRED'\n })\n return\n }\n if (!NAME_RE.test(name)) {\n errors.push({\n field: 'name',\n message:\n 'Name must be kebab-case (lowercase letters, numbers, hyphens, underscores)',\n code: 'INVALID_FORMAT'\n })\n }\n if (name.length > 100) {\n errors.push({\n field: 'name',\n message: 'Name must be 100 characters or fewer',\n code: 'TOO_LONG'\n })\n }\n}\n\nfunction validateDescription(description: string, errors: ValidationError[]) {\n if (!description) {\n errors.push({\n field: 'description',\n message: 'Description is required',\n code: 'REQUIRED'\n })\n }\n if (description && description.length > 2000) {\n errors.push({\n field: 'description',\n message: 'Description must be 2000 characters or fewer',\n code: 'TOO_LONG'\n })\n }\n}\n\nfunction validateBaseUrl(base_url: string, errors: ValidationError[]) {\n if (!base_url) {\n errors.push({\n field: 'base_url',\n message: 'base_url is required',\n code: 'REQUIRED'\n })\n return\n }\n try {\n new URL(base_url)\n } catch {\n errors.push({\n field: 'base_url',\n message: 'base_url must be a valid URL',\n code: 'INVALID_URL'\n })\n }\n}\n\nfunction validateType(type: string, errors: ValidationError[]) {\n if (!SKILL_TYPES_SET.has(type)) {\n errors.push({\n field: 'type',\n message: `Invalid type \"${type}\". Must be one of: ${[...SKILL_TYPES_SET].join(', ')}`,\n code: 'INVALID_ENUM'\n })\n }\n}\n\nfunction validatePayment(\n payment: SkillManifest['payment'],\n errors: ValidationError[],\n warnings: ValidationWarning[]\n) {\n if (!payment.networks || payment.networks.length === 0) {\n errors.push({\n field: 'payment.networks',\n message: 'At least one payment network is required',\n code: 'REQUIRED'\n })\n } else {\n for (const network of payment.networks) {\n if (!PAYMENT_NETWORKS_SET.has(network)) {\n errors.push({\n field: 'payment.networks',\n message: `Invalid network \"${network}\". Must be one of: ${[...PAYMENT_NETWORKS_SET].join(', ')}`,\n code: 'INVALID_ENUM'\n })\n }\n }\n }\n\n if (!payment.payTo) {\n errors.push({\n field: 'payment.payTo',\n message: 'payTo address is required',\n code: 'REQUIRED'\n })\n } else {\n const isEvm = EVM_ADDRESS_RE.test(payment.payTo)\n const isStellar = STELLAR_ADDRESS_RE.test(payment.payTo)\n if (!isEvm && !isStellar) {\n warnings.push({\n field: 'payment.payTo',\n message: 'payTo does not look like a valid Stellar or EVM address',\n code: 'SUSPICIOUS_ADDRESS'\n })\n }\n }\n\n if (payment.payToEvm && !EVM_ADDRESS_RE.test(payment.payToEvm)) {\n errors.push({\n field: 'payment.payToEvm',\n message: 'payToEvm must be a valid EVM address (0x...)',\n code: 'INVALID_FORMAT'\n })\n }\n\n if (payment.facilitator) {\n try {\n new URL(payment.facilitator)\n } catch {\n errors.push({\n field: 'payment.facilitator',\n message: 'facilitator must be a valid URL',\n code: 'INVALID_URL'\n })\n }\n }\n\n if (!payment.asset) {\n warnings.push({\n field: 'payment.asset',\n message: 'No asset specified, defaulting to USDC',\n code: 'MISSING_OPTIONAL'\n })\n }\n}\n\nfunction validateEndpoints(\n endpoints: EndpointSpec[],\n errors: ValidationError[],\n warnings: ValidationWarning[]\n) {\n if (!endpoints || endpoints.length === 0) {\n errors.push({\n field: 'endpoints',\n message: 'At least one endpoint is required',\n code: 'REQUIRED'\n })\n return\n }\n\n const seen = new Set<string>()\n\n for (let i = 0; i < endpoints.length; i++) {\n const ep = endpoints[i]\n const prefix = `endpoints[${i}]`\n\n if (!ep.path || !ep.path.startsWith('/')) {\n errors.push({\n field: `${prefix}.path`,\n message: 'Endpoint path must start with /',\n code: 'INVALID_FORMAT'\n })\n }\n\n if (!HTTP_METHODS_SET.has(ep.method)) {\n errors.push({\n field: `${prefix}.method`,\n message: `Invalid method \"${ep.method}\"`,\n code: 'INVALID_ENUM'\n })\n }\n\n if (!ep.description) {\n warnings.push({\n field: `${prefix}.description`,\n message: 'Endpoint is missing a description',\n code: 'MISSING_OPTIONAL'\n })\n }\n\n if (!PRICE_RE.test(ep.priceUsdc)) {\n errors.push({\n field: `${prefix}.priceUsdc`,\n message: `Invalid price \"${ep.priceUsdc}\". Must be a decimal string (e.g. \"0.001\")`,\n code: 'INVALID_FORMAT'\n })\n }\n\n const key = `${ep.method} ${ep.path}`\n if (seen.has(key)) {\n errors.push({\n field: `${prefix}`,\n message: `Duplicate endpoint: ${key}`,\n code: 'DUPLICATE'\n })\n }\n seen.add(key)\n }\n}\n\nfunction validateVersion(\n version: string | undefined,\n warnings: ValidationWarning[]\n) {\n if (!version) {\n warnings.push({\n field: 'version',\n message: 'No version specified',\n code: 'MISSING_OPTIONAL'\n })\n return\n }\n if (!SEMVER_RE.test(version)) {\n warnings.push({\n field: 'version',\n message: 'Version should follow semver (e.g. \"1.0.0\")',\n code: 'INVALID_FORMAT'\n })\n }\n}\n\nfunction validateTags(\n tags: string[] | undefined,\n warnings: ValidationWarning[]\n) {\n if (tags && tags.length > 20) {\n warnings.push({\n field: 'tags',\n message: 'Too many tags (max 20)',\n code: 'TOO_MANY'\n })\n }\n}\n","import YAML from 'yaml'\nimport type {\n EndpointSpec,\n HttpMethod,\n OpenAPIOperation,\n OpenAPISpec,\n PaymentConfig,\n SkillConfig,\n SkillManifest\n} from './types'\n\n// ── Public API ──────────────────────────────────────────\n\n/**\n * Generate a SKILL.md string from a SkillConfig.\n */\nexport function generateSkillMd(config: SkillConfig): string {\n const frontmatter = buildFrontmatter(config)\n const yaml = YAML.stringify(frontmatter, {\n lineWidth: 0,\n defaultStringType: 'PLAIN',\n defaultKeyType: 'PLAIN'\n }).trimEnd()\n\n const body =\n config.body ??\n generateDefaultBody(config.displayName ?? config.name, config.description)\n\n return `---\\n${yaml}\\n---\\n\\n${body}\\n`\n}\n\n/**\n * Convert an OpenAPI spec into a SkillManifest.\n * Each path+method becomes an endpoint in the manifest.\n */\nexport function generateFromOpenAPI(\n spec: OpenAPISpec,\n payment: PaymentConfig,\n options?: {\n defaultPrice?: string\n baseUrlOverride?: string\n /** Per-endpoint pricing. Keys: 'METHOD /path' or '*' for fallback. */\n pricing?: Record<string, string>\n }\n): SkillManifest {\n const baseUrl =\n options?.baseUrlOverride ??\n spec.servers?.[0]?.url ??\n 'https://api.example.com'\n const defaultPrice = options?.defaultPrice ?? '0.001'\n const pricing = options?.pricing\n\n const endpoints: EndpointSpec[] = []\n\n for (const [path, methods] of Object.entries(spec.paths)) {\n const methodEntries: [string, OpenAPIOperation | undefined][] = [\n ['GET', methods.get],\n ['POST', methods.post],\n ['PUT', methods.put],\n ['DELETE', methods.delete],\n ['PATCH', methods.patch]\n ]\n\n for (const [method, operation] of methodEntries) {\n if (!operation) continue\n\n const inputSchema = extractInputSchema(operation)\n const outputSchema = extractOutputSchema(operation)\n\n endpoints.push({\n path,\n method: method as HttpMethod,\n description:\n operation.summary ?? operation.description ?? `${method} ${path}`,\n priceUsdc: resolvePrice(method, path, pricing, defaultPrice),\n ...(inputSchema && { inputSchema }),\n ...(outputSchema && { outputSchema })\n })\n }\n }\n\n return {\n name: slugify(spec.info.title),\n displayName: spec.info.title,\n description: spec.info.description ?? spec.info.title,\n version: spec.info.version,\n base_url: baseUrl,\n type: 'API',\n payment,\n endpoints,\n body: ''\n }\n}\n\n/**\n * Convert a SkillManifest into an OpenAPI 3.0 spec.\n * Reverse of generateFromOpenAPI.\n */\nexport function toOpenAPI(manifest: SkillManifest): OpenAPISpec {\n const paths: Record<string, Record<string, OpenAPIOperation>> = {}\n\n for (const ep of manifest.endpoints) {\n const method = ep.method.toLowerCase()\n\n if (!paths[ep.path]) paths[ep.path] = {}\n\n const operation: OpenAPIOperation = {\n summary: ep.description,\n operationId: `${manifest.name}_${method}_${ep.path.replace(/\\//g, '_').replace(/^_/, '')}`\n }\n\n if (ep.inputSchema && ['post', 'put', 'patch'].includes(method)) {\n operation.requestBody = {\n content: {\n 'application/json': { schema: ep.inputSchema }\n }\n }\n }\n\n operation.responses = {\n '200': {\n description: 'Successful response',\n ...(ep.outputSchema && {\n content: {\n 'application/json': { schema: ep.outputSchema }\n }\n })\n },\n '402': {\n description: `Payment Required — ${ep.priceUsdc} USDC`\n }\n }\n\n paths[ep.path][method] = operation\n }\n\n return {\n openapi: '3.0.3',\n info: {\n title: manifest.displayName ?? manifest.name,\n description: manifest.description,\n version: manifest.version ?? '1.0.0'\n },\n servers: [{ url: manifest.base_url }],\n paths: paths as OpenAPISpec['paths']\n }\n}\n\n// ── Internal ────────────────────────────────────────────\n\nfunction buildFrontmatter(config: SkillConfig): Record<string, unknown> {\n const fm: Record<string, unknown> = {\n name: config.name\n }\n\n if (config.displayName) fm.displayName = config.displayName\n fm.description = config.description\n if (config.version) fm.version = config.version\n if (config.author) fm.author = config.author\n fm.base_url = config.base_url\n fm.type = config.type ?? 'API'\n\n fm.payment = {\n networks: config.payment.networks,\n asset: config.payment.asset || 'USDC',\n payTo: config.payment.payTo,\n ...(config.payment.payToEvm && {\n payToEvm: config.payment.payToEvm\n }),\n ...(config.payment.facilitator && {\n facilitator: config.payment.facilitator\n })\n }\n\n fm.endpoints = config.endpoints.map(ep => {\n const entry: Record<string, unknown> = {\n path: ep.path,\n method: ep.method,\n description: ep.description,\n priceUsdc: ep.priceUsdc\n }\n if (ep.inputSchema) entry.inputSchema = ep.inputSchema\n if (ep.outputSchema) entry.outputSchema = ep.outputSchema\n return entry\n })\n\n if (config.tags?.length) fm.tags = config.tags\n if (config.category) fm.category = config.category\n if (config.sla) fm.sla = config.sla\n if (config.rateLimit) fm.rateLimit = config.rateLimit\n if (config.sandbox) fm.sandbox = config.sandbox\n\n return fm\n}\n\nfunction generateDefaultBody(name: string, description: string): string {\n return `# ${name}\\n\\n${description}`\n}\n\nfunction extractInputSchema(\n op: OpenAPIOperation\n): Record<string, unknown> | undefined {\n const content = op.requestBody?.content\n if (!content) return undefined\n\n const json = content['application/json'] ?? Object.values(content)[0]\n return json?.schema as Record<string, unknown> | undefined\n}\n\nfunction extractOutputSchema(\n op: OpenAPIOperation\n): Record<string, unknown> | undefined {\n if (!op.responses) return undefined\n\n const successResponse =\n op.responses['200'] ?? op.responses['201'] ?? op.responses['2xx']\n if (!successResponse?.content) return undefined\n\n const json =\n successResponse.content['application/json'] ??\n Object.values(successResponse.content)[0]\n return json?.schema as Record<string, unknown> | undefined\n}\n\nfunction resolvePrice(\n method: string,\n path: string,\n pricing: Record<string, string> | undefined,\n defaultPrice: string\n): string {\n if (!pricing) return defaultPrice\n return pricing[`${method} ${path}`] ?? pricing['*'] ?? defaultPrice\n}\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n}\n","import type { SkillManifest } from './types'\n\n/**\n * MCP tool definition shape.\n * Defined inline to avoid depending on @modelcontextprotocol/sdk.\n */\nexport interface McpToolDefinition {\n name: string\n description: string\n inputSchema: Record<string, unknown>\n}\n\n/**\n * Convert a SkillManifest into MCP tool definitions.\n * Each endpoint becomes one tool.\n */\nexport function toMcpToolDefinitions(\n manifest: SkillManifest\n): McpToolDefinition[] {\n return manifest.endpoints.map(ep => {\n const slug = ep.path\n .replace(/^\\//, '')\n .replace(/\\//g, '_')\n .replace(/[^a-zA-Z0-9_-]/g, '')\n\n const network = manifest.payment.networks[0] ?? 'unknown'\n\n return {\n name: `${manifest.name}_${slug}`,\n description: `${ep.description} (${ep.priceUsdc} USDC via ${network})`,\n inputSchema: ep.inputSchema ?? { type: 'object', properties: {} }\n }\n })\n}\n","import { SKILL_TYPES, HTTP_METHODS, PAYMENT_NETWORKS } from './constants'\n\n/**\n * JSON Schema for SKILL.md v2 frontmatter validation.\n * Can be used with any JSON Schema validator (ajv, zod, etc).\n *\n * Enums are derived from the shared constants in constants.ts\n * so they stay in sync with the parser and validator.\n */\nexport const SKILLMD_JSON_SCHEMA = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n title: 'SKILL.md Frontmatter',\n description: 'Schema for the YAML frontmatter in a SKILL.md file',\n type: 'object',\n required: ['name', 'description', 'base_url', 'payment', 'endpoints'],\n properties: {\n name: {\n type: 'string',\n pattern: '^[a-z0-9][a-z0-9_-]*$',\n minLength: 1,\n maxLength: 100,\n description: 'Unique skill identifier (kebab-case)'\n },\n displayName: {\n type: 'string',\n maxLength: 200,\n description: 'Human-readable name'\n },\n description: {\n type: 'string',\n minLength: 1,\n maxLength: 2000,\n description: 'What this skill does'\n },\n version: {\n type: 'string',\n pattern: '^\\\\d+\\\\.\\\\d+\\\\.\\\\d+',\n description: 'Semantic version'\n },\n author: {\n type: 'string',\n maxLength: 100\n },\n base_url: {\n type: 'string',\n format: 'uri',\n description: 'Base URL of the API'\n },\n type: {\n type: 'string',\n enum: [...SKILL_TYPES],\n default: 'API'\n },\n payment: {\n type: 'object',\n required: ['networks', 'payTo'],\n properties: {\n networks: {\n type: 'array',\n items: {\n type: 'string',\n enum: [...PAYMENT_NETWORKS]\n },\n minItems: 1,\n description: 'Supported payment networks'\n },\n asset: {\n type: 'string',\n default: 'USDC',\n description: 'Payment asset'\n },\n payTo: {\n type: 'string',\n minLength: 1,\n description: 'Recipient address (Stellar or EVM)'\n },\n payToEvm: {\n type: 'string',\n pattern: '^0x[a-fA-F0-9]{40}$',\n description: 'EVM address (fallback)'\n },\n facilitator: {\n type: 'string',\n format: 'uri',\n description: 'Facilitator URL'\n }\n },\n additionalProperties: false\n },\n endpoints: {\n type: 'array',\n items: {\n type: 'object',\n required: ['path', 'method', 'description', 'priceUsdc'],\n properties: {\n path: {\n type: 'string',\n pattern: '^/',\n description: 'Endpoint path (must start with /)'\n },\n method: {\n type: 'string',\n enum: [...HTTP_METHODS]\n },\n description: {\n type: 'string',\n minLength: 1\n },\n priceUsdc: {\n type: 'string',\n pattern: '^\\\\d+(\\\\.\\\\d+)?$',\n description: 'Price in USDC (e.g. \"0.001\")'\n },\n inputSchema: {\n type: 'object',\n description: 'JSON Schema for request body'\n },\n outputSchema: {\n type: 'object',\n description: 'JSON Schema for response body'\n }\n },\n additionalProperties: false\n },\n minItems: 1\n },\n tags: {\n type: 'array',\n items: { type: 'string' },\n maxItems: 20\n },\n category: {\n type: 'string'\n },\n sla: {\n type: 'string',\n description: 'Uptime guarantee (e.g. \"99.9%\")'\n },\n rateLimit: {\n type: 'string',\n description: 'Rate limit (e.g. \"1000/hour\")'\n },\n sandbox: {\n type: 'string',\n format: 'uri',\n description: 'Free test endpoint URL'\n }\n },\n additionalProperties: true\n} as const\n"],"mappings":";AAAA,OAAO,UAAU;;;ACEV,IAAM,cAAoC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,eAAsC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,mBAA8C;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,kBAAkB,IAAI,IAAY,WAAW;AACnD,IAAM,mBAAmB,IAAI,IAAY,YAAY;AACrD,IAAM,uBAAuB,IAAI,IAAY,gBAAgB;AAE7D,IAAM,iBAAiB;;;ADPvB,SAAS,aAAa,SAAgC;AAC3D,QAAM,EAAE,MAAM,KAAK,IAAI,mBAAmB,OAAO;AACjD,SAAO,cAAc,MAAM,IAAI;AACjC;AAMO,SAAS,iBAAiB,IAG/B;AACA,QAAM,QAAQ,GAAG,MAAM,cAAc;AACrC,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,MAAM,EAAE,MAAM,UAAU,GAAG,MAAM,GAAG;AAAA,EAC/C;AACA,QAAM,OAAO,KAAK,MAAM,MAAM,CAAC,CAAC;AAChC,SAAO,EAAE,MAAM,MAAM,MAAM,CAAC,EAAE;AAChC;AAIA,SAAS,mBAAmB,SAG1B;AACA,QAAM,QAAQ,QAAQ,MAAM,cAAc;AAC1C,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACA,QAAM,OAAO,KAAK,MAAM,MAAM,CAAC,CAAC;AAChC,SAAO,EAAE,MAAM,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE;AACvC;AAEA,SAAS,cACP,MACA,MACe;AACf,QAAM,OAAO,cAAc,MAAM,MAAM;AACvC,QAAM,cAAc,cAAc,MAAM,aAAa;AACrD,QAAM,WAAW,cAAc,MAAM,UAAU;AAE/C,QAAM,UAAU,UAAU,MAAM,MAAM,KAAK;AAC3C,QAAM,OAAO,gBAAgB,IAAI,OAAO,IAAK,UAAwB;AAErE,QAAM,UAAU,aAAa,IAAI;AACjC,QAAM,YAAY,eAAe,IAAI;AAErC,SAAO;AAAA,IACL;AAAA,IACA,aAAa,UAAU,MAAM,aAAa;AAAA,IAC1C;AAAA,IACA,SAAS,UAAU,MAAM,SAAS;AAAA,IAClC,QAAQ,UAAU,MAAM,QAAQ;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,eAAe,MAAM,MAAM;AAAA,IACjC,UAAU,UAAU,MAAM,UAAU;AAAA,IACpC,KAAK,UAAU,MAAM,KAAK;AAAA,IAC1B,WAAW,UAAU,MAAM,WAAW;AAAA,IACtC,SAAS,UAAU,MAAM,SAAS;AAAA,IAClC;AAAA,EACF;AACF;AAEA,SAAS,aAAa,MAA8C;AAClE,QAAM,MAAM,KAAK;AAGjB,MAAI,OAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,GAAG,GAAG;AACzD,UAAM,UAAU;AAChB,UAAM,WAAW,cAAc,QAAQ,QAAQ;AAC/C,WAAO;AAAA,MACL;AAAA,MACA,OAAO,UAAU,SAAS,OAAO,KAAK;AAAA,MACtC,OAAO,cAAc,SAAS,OAAO;AAAA,MACrC,UAAU,UAAU,SAAS,UAAU;AAAA,MACvC,aAAa,UAAU,SAAS,aAAa;AAAA,IAC/C;AAAA,EACF;AAGA,SAAO;AAAA,IACL,UAAU,CAAC,MAAM;AAAA,IACjB,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,KAAgC;AACrD,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO,CAAC,MAAM;AACvC,SAAO,IACJ,OAAO,OAAK,OAAO,MAAM,YAAY,qBAAqB,IAAI,CAAC,CAAC,EAChE,IAAI,OAAK,CAAmB;AACjC;AAEA,SAAS,eAAe,MAA+C;AACrE,QAAM,MAAM,KAAK;AACjB,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO,CAAC;AAEjC,SAAO,IACJ,OAAO,OAAK,KAAK,OAAO,MAAM,QAAQ,EACtC,IAAI,OAAK;AACR,UAAM,KAAK;AACX,UAAM,UAAU,UAAU,IAAI,QAAQ,KAAK,QAAQ,YAAY;AAE/D,WAAO;AAAA,MACL,MAAM,UAAU,IAAI,MAAM,KAAK;AAAA,MAC/B,QAAS,iBAAiB,IAAI,MAAM,IAAI,SAAS;AAAA,MACjD,aAAa,UAAU,IAAI,aAAa,KAAK;AAAA,MAC7C,WAAW,UAAU,IAAI,WAAW,KAAK,UAAU,IAAI,OAAO,KAAK;AAAA,MACnE,aAAa,UAAU,IAAI,aAAa;AAAA,MACxC,cAAc,UAAU,IAAI,cAAc;AAAA,IAC5C;AAAA,EACF,CAAC;AACL;AAIA,SAAS,cAAc,KAA8B,KAAqB;AACxE,QAAM,MAAM,IAAI,GAAG;AACnB,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,MAAI,OAAO,QAAQ,YAAY,OAAO,QAAQ,UAAW,QAAO,OAAO,GAAG;AAC1E,QAAM,IAAI,MAAM,2BAA2B,GAAG,EAAE;AAClD;AAEA,SAAS,UACP,KACA,KACoB;AACpB,QAAM,MAAM,IAAI,GAAG;AACnB,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,MAAI,OAAO,QAAQ,YAAY,OAAO,QAAQ,UAAW,QAAO,OAAO,GAAG;AAC1E,SAAO;AACT;AAEA,SAAS,eACP,KACA,KACsB;AACtB,QAAM,MAAM,IAAI,GAAG;AACnB,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO;AAChC,SAAO,IAAI,OAAO,OAAK,OAAO,MAAM,QAAQ;AAC9C;AAEA,SAAS,UACP,KACA,KACqC;AACrC,QAAM,MAAM,IAAI,GAAG;AACnB,MAAI,OAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,GAAG,GAAG;AACzD,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AEtKA,IAAM,UAAU;AAChB,IAAM,YAAY;AAClB,IAAM,WAAW;AACjB,IAAM,iBAAiB;AACvB,IAAM,qBAAqB;AAOpB,SAAS,cAAc,UAA2C;AACvE,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAgC,CAAC;AAEvC,eAAa,SAAS,MAAM,MAAM;AAClC,sBAAoB,SAAS,aAAa,MAAM;AAChD,kBAAgB,SAAS,UAAU,MAAM;AACzC,eAAa,SAAS,MAAM,MAAM;AAClC,kBAAgB,SAAS,SAAS,QAAQ,QAAQ;AAClD,oBAAkB,SAAS,WAAW,QAAQ,QAAQ;AACtD,kBAAgB,SAAS,SAAS,QAAQ;AAC1C,eAAa,SAAS,MAAM,QAAQ;AAEpC,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,gBAAgB,SAAmC;AACjE,MAAI;AACF,UAAM,WAAW,aAAa,OAAO;AACrC,WAAO,cAAc,QAAQ;AAAA,EAC/B,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,QACN;AAAA,UACE,OAAO;AAAA,UACP,SACE,eAAe,QAAQ,IAAI,UAAU;AAAA,UACvC,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AACF;AAIA,SAAS,aAAa,MAAc,QAA2B;AAC7D,MAAI,CAAC,MAAM;AACT,WAAO,KAAK;AAAA,MACV,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AACD;AAAA,EACF;AACA,MAAI,CAAC,QAAQ,KAAK,IAAI,GAAG;AACvB,WAAO,KAAK;AAAA,MACV,OAAO;AAAA,MACP,SACE;AAAA,MACF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACA,MAAI,KAAK,SAAS,KAAK;AACrB,WAAO,KAAK;AAAA,MACV,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;AAEA,SAAS,oBAAoB,aAAqB,QAA2B;AAC3E,MAAI,CAAC,aAAa;AAChB,WAAO,KAAK;AAAA,MACV,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACA,MAAI,eAAe,YAAY,SAAS,KAAM;AAC5C,WAAO,KAAK;AAAA,MACV,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;AAEA,SAAS,gBAAgB,UAAkB,QAA2B;AACpE,MAAI,CAAC,UAAU;AACb,WAAO,KAAK;AAAA,MACV,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AACD;AAAA,EACF;AACA,MAAI;AACF,QAAI,IAAI,QAAQ;AAAA,EAClB,QAAQ;AACN,WAAO,KAAK;AAAA,MACV,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;AAEA,SAAS,aAAa,MAAc,QAA2B;AAC7D,MAAI,CAAC,gBAAgB,IAAI,IAAI,GAAG;AAC9B,WAAO,KAAK;AAAA,MACV,OAAO;AAAA,MACP,SAAS,iBAAiB,IAAI,sBAAsB,CAAC,GAAG,eAAe,EAAE,KAAK,IAAI,CAAC;AAAA,MACnF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;AAEA,SAAS,gBACP,SACA,QACA,UACA;AACA,MAAI,CAAC,QAAQ,YAAY,QAAQ,SAAS,WAAW,GAAG;AACtD,WAAO,KAAK;AAAA,MACV,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH,OAAO;AACL,eAAW,WAAW,QAAQ,UAAU;AACtC,UAAI,CAAC,qBAAqB,IAAI,OAAO,GAAG;AACtC,eAAO,KAAK;AAAA,UACV,OAAO;AAAA,UACP,SAAS,oBAAoB,OAAO,sBAAsB,CAAC,GAAG,oBAAoB,EAAE,KAAK,IAAI,CAAC;AAAA,UAC9F,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,OAAO;AAClB,WAAO,KAAK;AAAA,MACV,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH,OAAO;AACL,UAAM,QAAQ,eAAe,KAAK,QAAQ,KAAK;AAC/C,UAAM,YAAY,mBAAmB,KAAK,QAAQ,KAAK;AACvD,QAAI,CAAC,SAAS,CAAC,WAAW;AACxB,eAAS,KAAK;AAAA,QACZ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,QAAQ,YAAY,CAAC,eAAe,KAAK,QAAQ,QAAQ,GAAG;AAC9D,WAAO,KAAK;AAAA,MACV,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,aAAa;AACvB,QAAI;AACF,UAAI,IAAI,QAAQ,WAAW;AAAA,IAC7B,QAAQ;AACN,aAAO,KAAK;AAAA,QACV,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,OAAO;AAClB,aAAS,KAAK;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;AAEA,SAAS,kBACP,WACA,QACA,UACA;AACA,MAAI,CAAC,aAAa,UAAU,WAAW,GAAG;AACxC,WAAO,KAAK;AAAA,MACV,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AACD;AAAA,EACF;AAEA,QAAM,OAAO,oBAAI,IAAY;AAE7B,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,UAAM,KAAK,UAAU,CAAC;AACtB,UAAM,SAAS,aAAa,CAAC;AAE7B,QAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,KAAK,WAAW,GAAG,GAAG;AACxC,aAAO,KAAK;AAAA,QACV,OAAO,GAAG,MAAM;AAAA,QAChB,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,iBAAiB,IAAI,GAAG,MAAM,GAAG;AACpC,aAAO,KAAK;AAAA,QACV,OAAO,GAAG,MAAM;AAAA,QAChB,SAAS,mBAAmB,GAAG,MAAM;AAAA,QACrC,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,GAAG,aAAa;AACnB,eAAS,KAAK;AAAA,QACZ,OAAO,GAAG,MAAM;AAAA,QAChB,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,SAAS,KAAK,GAAG,SAAS,GAAG;AAChC,aAAO,KAAK;AAAA,QACV,OAAO,GAAG,MAAM;AAAA,QAChB,SAAS,kBAAkB,GAAG,SAAS;AAAA,QACvC,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,UAAM,MAAM,GAAG,GAAG,MAAM,IAAI,GAAG,IAAI;AACnC,QAAI,KAAK,IAAI,GAAG,GAAG;AACjB,aAAO,KAAK;AAAA,QACV,OAAO,GAAG,MAAM;AAAA,QAChB,SAAS,uBAAuB,GAAG;AAAA,QACnC,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AACA,SAAK,IAAI,GAAG;AAAA,EACd;AACF;AAEA,SAAS,gBACP,SACA,UACA;AACA,MAAI,CAAC,SAAS;AACZ,aAAS,KAAK;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AACD;AAAA,EACF;AACA,MAAI,CAAC,UAAU,KAAK,OAAO,GAAG;AAC5B,aAAS,KAAK;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;AAEA,SAAS,aACP,MACA,UACA;AACA,MAAI,QAAQ,KAAK,SAAS,IAAI;AAC5B,aAAS,KAAK;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;;;ACrTA,OAAOA,WAAU;AAgBV,SAAS,gBAAgB,QAA6B;AAC3D,QAAM,cAAc,iBAAiB,MAAM;AAC3C,QAAM,OAAOA,MAAK,UAAU,aAAa;AAAA,IACvC,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,EAClB,CAAC,EAAE,QAAQ;AAEX,QAAM,OACJ,OAAO,QACP,oBAAoB,OAAO,eAAe,OAAO,MAAM,OAAO,WAAW;AAE3E,SAAO;AAAA,EAAQ,IAAI;AAAA;AAAA;AAAA,EAAY,IAAI;AAAA;AACrC;AAMO,SAAS,oBACd,MACA,SACA,SAMe;AACf,QAAM,UACJ,SAAS,mBACT,KAAK,UAAU,CAAC,GAAG,OACnB;AACF,QAAM,eAAe,SAAS,gBAAgB;AAC9C,QAAM,UAAU,SAAS;AAEzB,QAAM,YAA4B,CAAC;AAEnC,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,KAAK,KAAK,GAAG;AACxD,UAAM,gBAA0D;AAAA,MAC9D,CAAC,OAAO,QAAQ,GAAG;AAAA,MACnB,CAAC,QAAQ,QAAQ,IAAI;AAAA,MACrB,CAAC,OAAO,QAAQ,GAAG;AAAA,MACnB,CAAC,UAAU,QAAQ,MAAM;AAAA,MACzB,CAAC,SAAS,QAAQ,KAAK;AAAA,IACzB;AAEA,eAAW,CAAC,QAAQ,SAAS,KAAK,eAAe;AAC/C,UAAI,CAAC,UAAW;AAEhB,YAAM,cAAc,mBAAmB,SAAS;AAChD,YAAM,eAAe,oBAAoB,SAAS;AAElD,gBAAU,KAAK;AAAA,QACb;AAAA,QACA;AAAA,QACA,aACE,UAAU,WAAW,UAAU,eAAe,GAAG,MAAM,IAAI,IAAI;AAAA,QACjE,WAAW,aAAa,QAAQ,MAAM,SAAS,YAAY;AAAA,QAC3D,GAAI,eAAe,EAAE,YAAY;AAAA,QACjC,GAAI,gBAAgB,EAAE,aAAa;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM,QAAQ,KAAK,KAAK,KAAK;AAAA,IAC7B,aAAa,KAAK,KAAK;AAAA,IACvB,aAAa,KAAK,KAAK,eAAe,KAAK,KAAK;AAAA,IAChD,SAAS,KAAK,KAAK;AAAA,IACnB,UAAU;AAAA,IACV,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR;AACF;AAMO,SAAS,UAAU,UAAsC;AAC9D,QAAM,QAA0D,CAAC;AAEjE,aAAW,MAAM,SAAS,WAAW;AACnC,UAAM,SAAS,GAAG,OAAO,YAAY;AAErC,QAAI,CAAC,MAAM,GAAG,IAAI,EAAG,OAAM,GAAG,IAAI,IAAI,CAAC;AAEvC,UAAM,YAA8B;AAAA,MAClC,SAAS,GAAG;AAAA,MACZ,aAAa,GAAG,SAAS,IAAI,IAAI,MAAM,IAAI,GAAG,KAAK,QAAQ,OAAO,GAAG,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,IAC1F;AAEA,QAAI,GAAG,eAAe,CAAC,QAAQ,OAAO,OAAO,EAAE,SAAS,MAAM,GAAG;AAC/D,gBAAU,cAAc;AAAA,QACtB,SAAS;AAAA,UACP,oBAAoB,EAAE,QAAQ,GAAG,YAAY;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AAEA,cAAU,YAAY;AAAA,MACpB,OAAO;AAAA,QACL,aAAa;AAAA,QACb,GAAI,GAAG,gBAAgB;AAAA,UACrB,SAAS;AAAA,YACP,oBAAoB,EAAE,QAAQ,GAAG,aAAa;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,aAAa,2BAAsB,GAAG,SAAS;AAAA,MACjD;AAAA,IACF;AAEA,UAAM,GAAG,IAAI,EAAE,MAAM,IAAI;AAAA,EAC3B;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,MACJ,OAAO,SAAS,eAAe,SAAS;AAAA,MACxC,aAAa,SAAS;AAAA,MACtB,SAAS,SAAS,WAAW;AAAA,IAC/B;AAAA,IACA,SAAS,CAAC,EAAE,KAAK,SAAS,SAAS,CAAC;AAAA,IACpC;AAAA,EACF;AACF;AAIA,SAAS,iBAAiB,QAA8C;AACtE,QAAM,KAA8B;AAAA,IAClC,MAAM,OAAO;AAAA,EACf;AAEA,MAAI,OAAO,YAAa,IAAG,cAAc,OAAO;AAChD,KAAG,cAAc,OAAO;AACxB,MAAI,OAAO,QAAS,IAAG,UAAU,OAAO;AACxC,MAAI,OAAO,OAAQ,IAAG,SAAS,OAAO;AACtC,KAAG,WAAW,OAAO;AACrB,KAAG,OAAO,OAAO,QAAQ;AAEzB,KAAG,UAAU;AAAA,IACX,UAAU,OAAO,QAAQ;AAAA,IACzB,OAAO,OAAO,QAAQ,SAAS;AAAA,IAC/B,OAAO,OAAO,QAAQ;AAAA,IACtB,GAAI,OAAO,QAAQ,YAAY;AAAA,MAC7B,UAAU,OAAO,QAAQ;AAAA,IAC3B;AAAA,IACA,GAAI,OAAO,QAAQ,eAAe;AAAA,MAChC,aAAa,OAAO,QAAQ;AAAA,IAC9B;AAAA,EACF;AAEA,KAAG,YAAY,OAAO,UAAU,IAAI,QAAM;AACxC,UAAM,QAAiC;AAAA,MACrC,MAAM,GAAG;AAAA,MACT,QAAQ,GAAG;AAAA,MACX,aAAa,GAAG;AAAA,MAChB,WAAW,GAAG;AAAA,IAChB;AACA,QAAI,GAAG,YAAa,OAAM,cAAc,GAAG;AAC3C,QAAI,GAAG,aAAc,OAAM,eAAe,GAAG;AAC7C,WAAO;AAAA,EACT,CAAC;AAED,MAAI,OAAO,MAAM,OAAQ,IAAG,OAAO,OAAO;AAC1C,MAAI,OAAO,SAAU,IAAG,WAAW,OAAO;AAC1C,MAAI,OAAO,IAAK,IAAG,MAAM,OAAO;AAChC,MAAI,OAAO,UAAW,IAAG,YAAY,OAAO;AAC5C,MAAI,OAAO,QAAS,IAAG,UAAU,OAAO;AAExC,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAc,aAA6B;AACtE,SAAO,KAAK,IAAI;AAAA;AAAA,EAAO,WAAW;AACpC;AAEA,SAAS,mBACP,IACqC;AACrC,QAAM,UAAU,GAAG,aAAa;AAChC,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,OAAO,QAAQ,kBAAkB,KAAK,OAAO,OAAO,OAAO,EAAE,CAAC;AACpE,SAAO,MAAM;AACf;AAEA,SAAS,oBACP,IACqC;AACrC,MAAI,CAAC,GAAG,UAAW,QAAO;AAE1B,QAAM,kBACJ,GAAG,UAAU,KAAK,KAAK,GAAG,UAAU,KAAK,KAAK,GAAG,UAAU,KAAK;AAClE,MAAI,CAAC,iBAAiB,QAAS,QAAO;AAEtC,QAAM,OACJ,gBAAgB,QAAQ,kBAAkB,KAC1C,OAAO,OAAO,gBAAgB,OAAO,EAAE,CAAC;AAC1C,SAAO,MAAM;AACf;AAEA,SAAS,aACP,QACA,MACA,SACA,cACQ;AACR,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,QAAQ,GAAG,MAAM,IAAI,IAAI,EAAE,KAAK,QAAQ,GAAG,KAAK;AACzD;AAEA,SAAS,QAAQ,MAAsB;AACrC,SAAO,KACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,UAAU,EAAE;AACzB;;;AC/NO,SAAS,qBACd,UACqB;AACrB,SAAO,SAAS,UAAU,IAAI,QAAM;AAClC,UAAM,OAAO,GAAG,KACb,QAAQ,OAAO,EAAE,EACjB,QAAQ,OAAO,GAAG,EAClB,QAAQ,mBAAmB,EAAE;AAEhC,UAAM,UAAU,SAAS,QAAQ,SAAS,CAAC,KAAK;AAEhD,WAAO;AAAA,MACL,MAAM,GAAG,SAAS,IAAI,IAAI,IAAI;AAAA,MAC9B,aAAa,GAAG,GAAG,WAAW,KAAK,GAAG,SAAS,aAAa,OAAO;AAAA,MACnE,aAAa,GAAG,eAAe,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,IAClE;AAAA,EACF,CAAC;AACH;;;ACxBO,IAAM,sBAAsB;AAAA,EACjC,SAAS;AAAA,EACT,OAAO;AAAA,EACP,aAAa;AAAA,EACb,MAAM;AAAA,EACN,UAAU,CAAC,QAAQ,eAAe,YAAY,WAAW,WAAW;AAAA,EACpE,YAAY;AAAA,IACV,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW;AAAA,MACX,WAAW;AAAA,MACX,aAAa;AAAA,IACf;AAAA,IACA,aAAa;AAAA,MACX,MAAM;AAAA,MACN,WAAW;AAAA,MACX,aAAa;AAAA,IACf;AAAA,IACA,aAAa;AAAA,MACX,MAAM;AAAA,MACN,WAAW;AAAA,MACX,WAAW;AAAA,MACX,aAAa;AAAA,IACf;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aAAa;AAAA,IACf;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,MAAM,CAAC,GAAG,WAAW;AAAA,MACrB,SAAS;AAAA,IACX;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,UAAU,CAAC,YAAY,OAAO;AAAA,MAC9B,YAAY;AAAA,QACV,UAAU;AAAA,UACR,MAAM;AAAA,UACN,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,CAAC,GAAG,gBAAgB;AAAA,UAC5B;AAAA,UACA,UAAU;AAAA,UACV,aAAa;AAAA,QACf;AAAA,QACA,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,aAAa;AAAA,QACf;AAAA,QACA,OAAO;AAAA,UACL,MAAM;AAAA,UACN,WAAW;AAAA,UACX,aAAa;AAAA,QACf;AAAA,QACA,UAAU;AAAA,UACR,MAAM;AAAA,UACN,SAAS;AAAA,UACT,aAAa;AAAA,QACf;AAAA,QACA,aAAa;AAAA,UACX,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,sBAAsB;AAAA,IACxB;AAAA,IACA,WAAW;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU,CAAC,QAAQ,UAAU,eAAe,WAAW;AAAA,QACvD,YAAY;AAAA,UACV,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS;AAAA,YACT,aAAa;AAAA,UACf;AAAA,UACA,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,MAAM,CAAC,GAAG,YAAY;AAAA,UACxB;AAAA,UACA,aAAa;AAAA,YACX,MAAM;AAAA,YACN,WAAW;AAAA,UACb;AAAA,UACA,WAAW;AAAA,YACT,MAAM;AAAA,YACN,SAAS;AAAA,YACT,aAAa;AAAA,UACf;AAAA,UACA,aAAa;AAAA,YACX,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,UACA,cAAc;AAAA,YACZ,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,QACF;AAAA,QACA,sBAAsB;AAAA,MACxB;AAAA,MACA,UAAU;AAAA,IACZ;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO,EAAE,MAAM,SAAS;AAAA,MACxB,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,IACR;AAAA,IACA,KAAK;AAAA,MACH,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,sBAAsB;AACxB;","names":["YAML"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@402md/skillmd",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Parser, validator, and generator for SKILL.md — the spec-as-code for paid AI agent skills",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"require": {
|
|
16
|
+
"types": "./dist/index.d.cts",
|
|
17
|
+
"default": "./dist/index.cjs"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"README.md"
|
|
24
|
+
],
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsup",
|
|
27
|
+
"dev": "tsup --watch",
|
|
28
|
+
"lint": "eslint src/",
|
|
29
|
+
"lint:fix": "eslint src/ --fix",
|
|
30
|
+
"format": "prettier --write 'src/**/*.ts' '__tests__/**/*.ts'",
|
|
31
|
+
"format:check": "prettier --check 'src/**/*.ts' '__tests__/**/*.ts'",
|
|
32
|
+
"typecheck": "tsc --noEmit",
|
|
33
|
+
"test": "vitest run",
|
|
34
|
+
"test:watch": "vitest",
|
|
35
|
+
"test:cov": "vitest run --coverage",
|
|
36
|
+
"prepublishOnly": "npm run build",
|
|
37
|
+
"prepare": "husky"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"yaml": "^2.7.1"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@eslint/js": "^9.28.0",
|
|
44
|
+
"@types/node": "^22.15.21",
|
|
45
|
+
"eslint": "^9.28.0",
|
|
46
|
+
"eslint-config-prettier": "^10.1.5",
|
|
47
|
+
"eslint-plugin-prettier": "^5.4.0",
|
|
48
|
+
"globals": "^16.1.0",
|
|
49
|
+
"husky": "^9.1.7",
|
|
50
|
+
"lint-staged": "^16.1.0",
|
|
51
|
+
"prettier": "^3.5.3",
|
|
52
|
+
"tsup": "^8.5.0",
|
|
53
|
+
"typescript": "^5.8.3",
|
|
54
|
+
"typescript-eslint": "^8.34.0",
|
|
55
|
+
"vitest": "^3.2.1"
|
|
56
|
+
},
|
|
57
|
+
"lint-staged": {
|
|
58
|
+
"*.ts": [
|
|
59
|
+
"eslint --fix",
|
|
60
|
+
"prettier --write"
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
"keywords": [
|
|
64
|
+
"skillmd",
|
|
65
|
+
"skill.md",
|
|
66
|
+
"x402",
|
|
67
|
+
"402",
|
|
68
|
+
"ai-agents",
|
|
69
|
+
"payment",
|
|
70
|
+
"protocol",
|
|
71
|
+
"parser",
|
|
72
|
+
"validator"
|
|
73
|
+
],
|
|
74
|
+
"license": "MIT",
|
|
75
|
+
"repository": {
|
|
76
|
+
"type": "git",
|
|
77
|
+
"url": "https://github.com/402md/skillmd"
|
|
78
|
+
},
|
|
79
|
+
"engines": {
|
|
80
|
+
"node": ">=18"
|
|
81
|
+
}
|
|
82
|
+
}
|