+7
-5
@@ -39,3 +39,4 @@ #!/usr/bin/env node | ||
| name: "aigentify", | ||
| version: "0.1.0", | ||
| version: "0.1.1", | ||
| mcpName: "io.github.pooriaarab/aigentify", | ||
| description: "Audit and generate agent-native product surfaces", | ||
@@ -79,3 +80,3 @@ type: "module", | ||
| // src/constants.ts | ||
| var PKG_NAME, VERSION, CONFIG_FILENAME, SERVER_SCHEMA_URL; | ||
| var PKG_NAME, VERSION, CONFIG_FILENAME, SERVER_SCHEMA_URL, SERVER_SCHEMA_RE; | ||
| var init_constants = __esm({ | ||
@@ -88,3 +89,4 @@ "src/constants.ts"() { | ||
| CONFIG_FILENAME = `${PKG_NAME}.config.ts`; | ||
| SERVER_SCHEMA_URL = "https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json"; | ||
| SERVER_SCHEMA_URL = "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json"; | ||
| SERVER_SCHEMA_RE = /^https:\/\/static\.modelcontextprotocol\.io\/schemas\/\d{4}-\d{2}-\d{2}\/server\.schema\.json$/; | ||
| } | ||
@@ -138,3 +140,3 @@ }); | ||
| if (!value) return { valid: false, reason: "server.json is not valid JSON." }; | ||
| if (value.$schema !== SERVER_SCHEMA_URL) return { valid: false, reason: `server.json must use the exact schema URL ${SERVER_SCHEMA_URL}.` }; | ||
| if (typeof value.$schema !== "string" || !SERVER_SCHEMA_RE.test(value.$schema)) return { valid: false, reason: `server.json "$schema" must be a dated MCP registry schema like ${SERVER_SCHEMA_URL} (the bare .../server.json 404s).` }; | ||
| const missing = ["name", "description", "repository", "version"].filter((key) => !value[key]); | ||
@@ -420,3 +422,3 @@ if (missing.length) return { valid: false, reason: `server.json is missing: ${missing.join(", ")}.` }; | ||
| if (config.mcpUrl) server.remotes = [{ type: "streamable-http", url: config.mcpUrl }]; | ||
| else server.packages = [{ registry_type: "npm", identifier: config.npmPackage ?? "aigentify", version: config.version ?? "0.1.0", runtime_hint: "npx", transport: { type: "stdio" } }]; | ||
| else server.packages = [{ registryType: "npm", registryBaseUrl: "https://registry.npmjs.org", identifier: config.npmPackage ?? "aigentify", version: config.version ?? "0.1.0", transport: { type: "stdio" }, runtimeHint: "npx", packageArguments: [{ type: "positional", valueHint: "subcommand", value: "mcp" }] }]; | ||
| return `${JSON.stringify(server, null, 2)} | ||
@@ -423,0 +425,0 @@ `; |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../package.json","../src/constants.ts","../src/audit.ts","../src/config.ts","../src/generators/agents.ts","../src/generators/agents-route.ts","../src/generators/offer.ts","../src/generators/server.ts","../src/generators/index.ts","../src/mcp.ts","../src/cli.ts","../src/commands/init.ts","../src/commands/gen.ts","../src/commands/load-config.ts"],"sourcesContent":["{\n \"name\": \"aigentify\",\n \"version\": \"0.1.0\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\"aigentify\": \"dist/cli.js\", \"aigentify-mcp\": \"dist/mcp.js\"},\n \"exports\": {\".\": {\"types\": \"./dist/index.d.ts\", \"import\": \"./dist/index.js\", \"require\": \"./dist/index.cjs\"}},\n \"files\": [\"dist\"],\n \"repository\": {\"type\": \"git\", \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"},\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\"agents\", \"agentification\", \"mcp\", \"ai\", \"json-ld\"],\n \"publishConfig\": {\"access\": \"public\"},\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"lint\": \"tsc --noEmit --pretty false\",\n \"typecheck\": \"tsc --noEmit\",\n \"verify\": \"npm run typecheck && npm run build && npm run test\",\n \"prepublishOnly\": \"npm run verify\"\n },\n \"engines\": {\"node\": \">=20\"},\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.17.5\",\n \"cheerio\": \"^1.1.2\",\n \"commander\": \"^14.0.0\",\n \"jiti\": \"^2.5.1\",\n \"zod\": \"^4.0.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.15.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.2.4\"\n }\n}\n","import pkg from '../package.json';\n\nexport const PKG_NAME = pkg.name;\nexport const VERSION = pkg.version;\nexport const CONFIG_FILENAME = `${PKG_NAME}.config.ts`;\nexport const SERVER_SCHEMA_URL = 'https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json';\n","import { readFile, readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { SERVER_SCHEMA_URL } from './constants.js';\n\nexport type AuditStatus = 'pass' | 'fail' | 'warn' | 'na';\nexport interface AuditCheck { id: string; status: AuditStatus; note: string; weight: number }\nexport interface AuditGap { id: string; note: string; fix: string }\nexport interface AuditReport { target: string; score: number; checks: AuditCheck[]; gaps: AuditGap[] }\nexport interface AuditOptions { fetch?: typeof globalThis.fetch }\n\ninterface Endpoint { status: number; contentType: string; text: string }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n honestText: string; hasMcp: boolean; networkFailure: boolean;\n}\n\nconst SKIPPED = new Set(['.git', 'node_modules', 'dist', 'coverage', '.next', '_reference_geoaeo']);\nconst WEIGHTS: Record<string, number> = {\n 'agents-md': 15, 'agents-md-public-safe': 10, 'server-json': 15, mcp: 15,\n 'offer-jsonld': 15, 'honest-offer': 10, 'llms-txt': 10, sitemap: 10,\n};\nconst FIXES: Record<string, string> = {\n 'agents-md': 'Add a public AGENTS.md at the target root or serve /agents.md as text/markdown.',\n 'agents-md-public-safe': 'Rewrite AGENTS.md as product guidance. Remove repository paths and contributor instructions.',\n 'server-json': `Add server.json and set \"$schema\" to \"${SERVER_SCHEMA_URL}\". Include a repository and a remotes or packages entry.`,\n mcp: 'Publish server.json, .mcp.json, or an MCP entry point.',\n 'offer-jsonld': 'Publish JSON-LD with @type Offer, or a SoftwareApplication with an offers property.',\n 'honest-offer': 'State the real price plainly. Remove scarcity, countdown, and urgency language.',\n 'llms-txt': 'Publish /llms.txt with a concise product description.',\n sitemap: 'Publish /sitemap.xml for URL discovery.',\n};\n\nfunction check(id: string, status: AuditStatus, note: string): AuditCheck { return { id, status, note, weight: WEIGHTS[id] }; }\n\nexport function scoreAuditChecks(checks: AuditCheck[]): number {\n const relevant = checks.filter(item => item.status !== 'na');\n const total = relevant.reduce((sum, item) => sum + item.weight, 0);\n if (!total) return 0;\n const earned = relevant.reduce((sum, item) => sum + (item.status === 'pass' ? item.weight : item.status === 'warn' ? item.weight / 2 : 0), 0);\n return Math.round((earned / total) * 100);\n}\n\nasync function walkFiles(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n if (entry.isDirectory() && !SKIPPED.has(entry.name)) files.push(...await walkFiles(path.join(directory, entry.name)));\n else if (entry.isFile()) files.push(path.join(directory, entry.name));\n }\n return files;\n}\n\nasync function readText(file: string | undefined): Promise<string> {\n if (!file) return '';\n try { return await readFile(file, 'utf8'); } catch { return ''; }\n}\n\nfunction findFile(files: string[], name: string): string | undefined {\n return files.find(file => {\n const normalized = file.replaceAll('\\\\', '/');\n return path.basename(normalized) === name || normalized.endsWith(`/${name}/route.ts`);\n });\n}\n\nfunction parseJson(text: string): Record<string, unknown> | undefined {\n try {\n const value: unknown = JSON.parse(text);\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n } catch { return undefined; }\n}\n\nfunction validServer(text: string): { valid: boolean; reason: string } {\n const value = parseJson(text);\n if (!value) return { valid: false, reason: 'server.json is not valid JSON.' };\n if (value.$schema !== SERVER_SCHEMA_URL) return { valid: false, reason: `server.json must use the exact schema URL ${SERVER_SCHEMA_URL}.` };\n const missing = ['name', 'description', 'repository', 'version'].filter(key => !value[key]);\n if (missing.length) return { valid: false, reason: `server.json is missing: ${missing.join(', ')}.` };\n if (!Array.isArray(value.remotes) && !Array.isArray(value.packages)) return { valid: false, reason: 'server.json needs a remotes or packages entry.' };\n return { valid: true, reason: 'server.json has the required MCP registry fields.' };\n}\n\nfunction hasOffer(texts: string[]): boolean {\n return texts.some(text => /\"@type\"\\s*:\\s*\"Offer\"/i.test(text) || /\"@type\"\\s*:\\s*\"SoftwareApplication\"/i.test(text) && /\"offers\"\\s*:/.test(text));\n}\n\nfunction hasUrgency(text: string): boolean {\n return /limited time|act now|hurry|expires|only\\s+\\d+\\s+left|ends in|sign up now|countdown/i.test(text);\n}\n\nfunction publicSafe(text: string): boolean {\n return !(/\\bsrc\\//i.test(text) || /\\bapps\\//i.test(text) || /\\bpackages\\//i.test(text) || /\\b[\\w.-]+\\.ts\\b/i.test(text) || /npm run build/i.test(text) || /\\btsconfig\\b/i.test(text) || /\\bcontributors?\\b/i.test(text) || /^#+\\s*layout\\b/im.test(text));\n}\n\nfunction offerBlock(text: string): string {\n const match = /^#+\\s*Offer\\b/im.exec(text);\n if (!match || match.index === undefined) return '';\n const rest = text.slice(match.index);\n const nextHeading = /^#+\\s+/m.exec(rest.slice(match[0].length));\n return nextHeading?.index === undefined ? rest : rest.slice(0, match[0].length + nextHeading.index);\n}\n\nasync function directorySnapshot(directory: string): Promise<Snapshot> {\n const files = await walkFiles(directory);\n const agentsFile = findFile(files, 'AGENTS.md');\n const serverFile = findFile(files, 'server.json');\n const mcpFile = files.find(file => /(?:^|\\/)\\.mcp\\.json$/.test(file.replaceAll('\\\\', '/')));\n const packageFile = findFile(files, 'package.json');\n const packageText = await readText(packageFile);\n const hasMcpBin = /\"(?:aigentify|[^\"\\n]*mcp[^\"\\n]*)\"\\s*:/i.test(packageText);\n const agentsText = await readText(agentsFile);\n const offerTexts = [agentsText, ...await Promise.all(files.filter(file => /\\.(html?|json|jsonld|md|mdx|tsx|jsx|js|mjs|ts)$/.test(file)).map(readText))];\n const llmsFile = findFile(files, 'llms.txt');\n const sitemapFile = findFile(files, 'sitemap.xml');\n const offerFiles = files.filter(file => /\\.jsonld$|(?:^|\\/)offer[^/]*\\.(?:json|html?)$/i.test(file));\n const honestText = [offerBlock(agentsText), ...await Promise.all(offerFiles.map(readText))].join('\\n');\n return {\n agents: { status: agentsFile ? 200 : 404, contentType: 'text/markdown', text: agentsText },\n server: { status: serverFile ? 200 : 404, contentType: 'application/json', text: await readText(serverFile) },\n mcp: { status: mcpFile || serverFile || hasMcpBin ? 200 : 404, contentType: '', text: '' },\n home: { status: 200, contentType: 'text/plain', text: offerTexts.join('\\n') },\n llms: { status: llmsFile ? 200 : 404, contentType: 'text/plain', text: await readText(llmsFile) },\n sitemap: { status: sitemapFile ? 200 : 404, contentType: 'application/xml', text: await readText(sitemapFile) },\n honestText, hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), networkFailure: false,\n };\n}\n\nasync function fetchText(fetcher: typeof globalThis.fetch, url: string): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000) });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text() };\n } catch { return { status: 0, contentType: '', text: '' }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n const [agents, server, mcp, home, llms, sitemap] = await Promise.all([\n fetchText(fetcher, `${base}/agents.md`), fetchText(fetcher, `${base}/server.json`), fetchText(fetcher, `${base}/.well-known/mcp`),\n fetchText(fetcher, base), fetchText(fetcher, `${base}/llms.txt`), fetchText(fetcher, `${base}/sitemap.xml`),\n ]);\n const endpoints = [agents, server, mcp, home, llms, sitemap];\n return { agents, server, mcp, home, llms, sitemap, honestText: [home.text, offerBlock(agents.text)].join('\\n'), hasMcp: server.status >= 200 && server.status < 400 || mcp.status >= 200 && mcp.status < 400, networkFailure: endpoints.every(item => item.status === 0) };\n}\n\nfunction buildChecks(snapshot: Snapshot): AuditCheck[] {\n const agentsPresent = snapshot.agents.status === 200 && snapshot.agents.text.trim().length > 0 && /(?:text\\/(?:markdown|plain)|application\\/markdown)/i.test(snapshot.agents.contentType);\n const agentsStatus: AuditStatus = snapshot.agents.status === 0 ? 'warn' : agentsPresent ? 'pass' : 'fail';\n const publicStatus: AuditStatus = !agentsPresent ? (snapshot.agents.status === 0 ? 'warn' : 'na') : publicSafe(snapshot.agents.text) ? 'pass' : 'warn';\n const serverInfo = snapshot.server.status === 200 ? validServer(snapshot.server.text) : undefined;\n const serverStatus: AuditStatus = snapshot.server.status === 0 ? 'warn' : !snapshot.hasMcp ? 'na' : serverInfo?.valid ? 'pass' : 'fail';\n const mcpStatus: AuditStatus = snapshot.networkFailure ? 'warn' : snapshot.hasMcp ? 'pass' : 'fail';\n const offerTexts = [snapshot.home.text, snapshot.agents.text];\n const offerStatus: AuditStatus = snapshot.home.status === 0 ? 'warn' : hasOffer(offerTexts) ? 'pass' : 'fail';\n const honestStatus: AuditStatus = !hasOffer(offerTexts) && !agentsPresent ? (snapshot.home.status === 0 ? 'warn' : 'na') : hasUrgency(snapshot.honestText) ? 'warn' : 'pass';\n const llmsStatus: AuditStatus = snapshot.llms.status === 0 ? 'warn' : snapshot.llms.status >= 200 && snapshot.llms.status < 400 && snapshot.llms.text.trim() ? 'pass' : 'fail';\n const sitemapStatus: AuditStatus = snapshot.sitemap.status === 0 ? 'warn' : snapshot.sitemap.status >= 200 && snapshot.sitemap.status < 400 && snapshot.sitemap.text.trim() ? 'pass' : 'fail';\n return [\n check('agents-md', agentsStatus, agentsPresent ? 'AGENTS.md is available.' : snapshot.agents.status === 0 ? 'The AGENTS.md request failed.' : 'AGENTS.md is missing.'),\n check('agents-md-public-safe', publicStatus, publicStatus === 'pass' ? 'AGENTS.md describes the product as a public surface.' : publicStatus === 'na' ? 'No AGENTS.md is available to inspect.' : 'AGENTS.md contains repository-internal guidance.'),\n check('server-json', serverStatus, serverInfo?.valid ? serverInfo.reason : serverInfo?.reason ?? (!snapshot.hasMcp ? 'No MCP surface was detected.' : 'server.json is missing.')),\n check('mcp', mcpStatus, snapshot.networkFailure ? 'The MCP discovery request failed.' : snapshot.hasMcp ? 'An MCP surface is available.' : 'No MCP surface was found.'),\n check('offer-jsonld', offerStatus, offerStatus === 'pass' ? 'Offer JSON-LD is available.' : offerStatus === 'warn' ? 'The offer could not be checked.' : 'No Offer JSON-LD was found.'),\n check('honest-offer', honestStatus, honestStatus === 'pass' ? 'Offer language states the price without pressure.' : honestStatus === 'na' ? 'No offer or Offer block was found.' : 'Offer language contains scarcity, countdown, or urgency copy.'),\n check('llms-txt', llmsStatus, llmsStatus === 'pass' ? 'llms.txt is available.' : llmsStatus === 'warn' ? 'The llms.txt request failed.' : 'llms.txt is missing.'),\n check('sitemap', sitemapStatus, sitemapStatus === 'pass' ? 'sitemap.xml is available.' : sitemapStatus === 'warn' ? 'The sitemap request failed.' : 'sitemap.xml is missing.'),\n ];\n}\n\nexport async function auditTarget(target: string, options: AuditOptions = {}): Promise<AuditReport> {\n const targetStat = await stat(target).catch(() => undefined);\n const snapshot = targetStat?.isDirectory() ? await directorySnapshot(target) : await urlSnapshot(target, options.fetch ?? globalThis.fetch);\n const checks = buildChecks(snapshot);\n const gaps = checks.filter(item => item.status === 'fail' || item.status === 'warn').map(item => ({ id: item.id, note: item.note, fix: FIXES[item.id] }));\n return { target, score: scoreAuditChecks(checks), checks, gaps };\n}\n\nexport function formatAuditReport(report: AuditReport): string {\n const lines = [`${report.target}: ${report.score}/100`, ''];\n for (const item of report.checks) lines.push(`${item.status.toUpperCase().padEnd(4)} ${item.id}: ${item.note}`);\n lines.push('', 'Gaps:');\n if (!report.gaps.length) lines.push('None.');\n else report.gaps.forEach((gap, index) => lines.push(`${index + 1}. ${gap.id}: ${gap.fix}`));\n return lines.join('\\n');\n}\n","export interface OfferConfig {\n name?: string;\n description?: string;\n price?: string | number;\n priceCurrency?: string;\n}\n\nexport interface AigentifyConfig {\n name: string;\n description: string;\n repository: string;\n version?: string;\n mcpUrl?: string;\n npmPackage?: string;\n offer?: OfferConfig;\n}\n\nexport function defineConfig(config: AigentifyConfig): AigentifyConfig {\n return { ...config, repository: config.repository.replace(/\\/+$/, ''), version: config.version ?? '0.1.0' };\n}\n\nexport function defaultConfig(): AigentifyConfig {\n return defineConfig({\n name: 'Your product',\n description: 'A product with an agent-native interface.',\n repository: 'https://github.com/your-org/your-product',\n npmPackage: 'your-package',\n });\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsMd(config: AigentifyConfig): string {\n const packageName = config.npmPackage ?? '<NPM_PACKAGE>';\n const mcp = config.mcpUrl ?? `npx ${packageName}`;\n const offer = config.offer;\n const offerLine = offer?.price === undefined ? 'Price: <PRICE>' : `Price: ${offer.priceCurrency ?? 'USD'} ${offer.price}`;\n return `# ${config.name}\n\n## Mental model\n\n${config.name} is ${config.description}\n\nUse the product interface for product work. Use the agent interface for repeatable tasks that need structured results.\n\n## The faces\n\n- Product: ${config.repository}\n- MCP: ${mcp}\n- Package: ${packageName}\n\n## MCP tools\n\n| Tool | Input | Result |\n| --- | --- | --- |\n| audit | target | An agent-readiness report with a score and gaps. |\n| gen | artifact and params | A generated agent-native artifact. |\n\n## The loop\n\n1. Audit the target.\n2. Fix the highest-impact gap.\n3. Generate or publish the missing artifact.\n4. Audit again and keep the report with the release.\n\n## Rules\n\n- Treat the product description and prices as source facts.\n- Return structured data when a tool provides it.\n- Ask for missing information before making a high-impact change.\n- Keep public agent instructions about the product and its use.\n\n## Offer\n\n${offer?.description ?? '<OFFER_DESCRIPTION>'}\n\n${offerLine}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsRoute(config: AigentifyConfig, framework = 'static'): string {\n if (framework === 'next') {\n return `# Serve /agents.md from a Next route\n\nCopy AGENTS.md to a public directory, or add this force-static route:\n\n\\`\\`\\`ts\nimport { readFile } from 'node:fs/promises';\n\nexport const dynamic = 'force-static';\n\nexport async function GET() {\n const body = await readFile('AGENTS.md', 'utf8');\n return new Response(body, { headers: { 'content-type': 'text/markdown; charset=utf-8' } });\n}\n\\`\\`\\`\n\nProduct: ${config.name}\n`;\n }\n return `# Serve /agents.md\n\nCopy the generated AGENTS.md file to public/agents.md and serve it as a static text/markdown response.\n\nProduct: ${config.name}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateOffer(config: AigentifyConfig): string {\n const offer = config.offer ?? {};\n const data = {\n '@context': 'https://schema.org',\n '@type': 'SoftwareApplication',\n name: config.name,\n description: config.description,\n applicationCategory: 'DeveloperApplication',\n offers: [{\n '@type': 'Offer',\n name: offer.name ?? `${config.name} access`,\n ...(offer.description ? { description: offer.description } : {}),\n ...(offer.price === undefined ? {} : { price: String(offer.price) }),\n priceCurrency: offer.priceCurrency ?? 'USD',\n }],\n };\n return `${JSON.stringify(data, null, 2)}\\n`;\n}\n","import { SERVER_SCHEMA_URL } from '../constants.js';\nimport type { AigentifyConfig } from '../config.js';\n\nexport function generateServerJson(config: AigentifyConfig): string {\n const serverName = config.name.includes('/') ? config.name : `io.github.pooriaarab/${config.name.toLowerCase().replace(/[^a-z0-9._-]+/g, '-')}`;\n const server: Record<string, unknown> = {\n $schema: SERVER_SCHEMA_URL,\n name: serverName,\n description: config.description,\n repository: { url: config.repository, source: 'github' },\n version: config.version ?? '0.1.0',\n };\n if (config.mcpUrl) server.remotes = [{ type: 'streamable-http', url: config.mcpUrl }];\n else server.packages = [{ registry_type: 'npm', identifier: config.npmPackage ?? 'aigentify', version: config.version ?? '0.1.0', runtime_hint: 'npx', transport: { type: 'stdio' } }];\n return `${JSON.stringify(server, null, 2)}\\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\nimport { defaultConfig, defineConfig } from '../config.js';\nimport { generateAgentsMd } from './agents.js';\nimport { generateAgentsRoute } from './agents-route.js';\nimport { generateOffer } from './offer.js';\nimport { generateServerJson } from './server.js';\nexport * from './agents.js';\nexport * from './agents-route.js';\nexport * from './offer.js';\nexport * from './server.js';\n\nexport type GeneratedArtifact = 'agents-md' | 'server-json' | 'offer' | 'agents-route';\nexport type GenerateParams = Partial<AigentifyConfig> & { framework?: string };\n\nfunction configFromParams(params: GenerateParams = {}): AigentifyConfig {\n const base = defaultConfig();\n return defineConfig({ ...base, ...params, offer: { ...(base.offer ?? {}), ...(params.offer ?? {}) } });\n}\n\nexport function generate(artifact: GeneratedArtifact, params: GenerateParams = {}): string {\n const config = configFromParams(params);\n if (artifact === 'agents-md') return generateAgentsMd(config);\n if (artifact === 'server-json') return generateServerJson(config);\n if (artifact === 'offer') return generateOffer(config);\n if (artifact === 'agents-route') return generateAgentsRoute(config, params.framework);\n throw new Error(`Unknown artifact: ${artifact}`);\n}\n","#!/usr/bin/env node\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { auditTarget } from './audit.js';\nimport { PKG_NAME, VERSION } from './constants.js';\nimport { generate, type GenerateParams, type GeneratedArtifact } from './generators/index.js';\n\nconst artifacts = ['agents-md', 'server-json', 'offer', 'agents-route'] as const;\n\nexport function createMcpServer(): McpServer {\n const server = new McpServer({ name: PKG_NAME, version: VERSION });\n server.registerTool('audit', {\n description: 'Audit a local directory or live URL for agent-native readiness.',\n inputSchema: { target: z.string() },\n }, async ({ target }) => ({ content: [{ type: 'text', text: JSON.stringify(await auditTarget(target), null, 2) }] }));\n server.registerTool('gen', {\n description: 'Generate an agent-native artifact as text.',\n inputSchema: { artifact: z.enum(artifacts), params: z.record(z.string(), z.unknown()).optional() },\n }, async ({ artifact, params }) => ({ content: [{ type: 'text', text: generate(artifact as GeneratedArtifact, (params ?? {}) as GenerateParams) }] }));\n return server;\n}\n\nexport async function startMcpServer(): Promise<void> {\n const server = createMcpServer();\n await server.connect(new StdioServerTransport());\n}\n\nif (import.meta.url === `file://${process.argv[1]}`) startMcpServer().catch(error => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n});\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { auditTarget, formatAuditReport } from './audit.js';\nimport { PKG_NAME, VERSION } from './constants.js';\nimport { initProject } from './commands/init.js';\nimport { generateArtifact, type GeneratedArtifact } from './commands/gen.js';\nimport type { GenerateParams } from './generators/index.js';\n\nconst program = new Command();\nprogram.name(PKG_NAME).version(VERSION).description('Audit and generate agent-native product surfaces.');\n\nprogram.command('audit [target]').description('Audit a local directory or live URL.').option('--json', 'print JSON instead of the report').action(async (target = '.', options: { json?: boolean }) => {\n const report = await auditTarget(target);\n process.stdout.write(options.json ? `${JSON.stringify(report, null, 2)}\\n` : `${formatAuditReport(report)}\\n`);\n});\n\nprogram.command('init').description('Write starter AGENTS.md and server.json into the current directory.').option('--force', 'overwrite existing files').action(async (options: { force?: boolean }) => {\n const result = await initProject({ directory: process.cwd(), force: options.force });\n process.stdout.write(`created ${result.created.length}, skipped ${result.skipped.length}\\n`);\n});\n\nprogram.command('gen <artifact>').description('Generate an agent-native artifact.').option('-o, --out <path>', 'write to a file instead of stdout').option('--name <name>').option('--description <description>').option('--repository <url>').option('--mcp-url <url>').option('--npm-package <name>').option('--price <price>').option('--price-currency <currency>').option('--framework <framework>', 'route framework, such as static or next', 'static').action(async (artifact: string, options: Record<string, string | undefined>) => {\n const offer = options.price === undefined && options.priceCurrency === undefined ? undefined : { price: options.price, priceCurrency: options.priceCurrency };\n const params = Object.fromEntries(Object.entries({ name: options.name, description: options.description, repository: options.repository, mcpUrl: options.mcpUrl, npmPackage: options.npmPackage, framework: options.framework, offer }).filter(([, value]) => value !== undefined));\n const content = await generateArtifact(artifact as GeneratedArtifact, process.cwd(), params as GenerateParams);\n if (options.out) { const { writeFile } = await import('node:fs/promises'); await writeFile(options.out, content, 'utf8'); }\n else process.stdout.write(content);\n});\n\nprogram.command('mcp').description('Run the MCP server over stdio.').action(async () => { const { startMcpServer } = await import('./mcp.js'); await startMcpServer(); });\nprogram.parseAsync().catch(error => { process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`); process.exitCode = 1; });\n","import { access, mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { defaultConfig } from '../config.js';\nimport { generate } from '../generators/index.js';\n\nexport interface InitOptions { directory: string; force?: boolean }\nexport interface InitResult { created: string[]; skipped: string[] }\n\nexport async function initProject(options: InitOptions): Promise<InitResult> {\n const root = path.resolve(options.directory);\n await mkdir(root, { recursive: true });\n const config = defaultConfig();\n const result: InitResult = { created: [], skipped: [] };\n for (const [name, content] of [['AGENTS.md', generate('agents-md', config)], ['server.json', generate('server-json', config)]] as const) {\n const file = path.join(root, name);\n try {\n await access(file);\n if (!options.force) { result.skipped.push(name); continue; }\n } catch { /* The file does not exist yet. */ }\n await writeFile(file, content, 'utf8');\n result.created.push(name);\n }\n return result;\n}\n","import { writeFile } from 'node:fs/promises';\nimport { defaultConfig } from '../config.js';\nimport { generate, type GenerateParams, type GeneratedArtifact } from '../generators/index.js';\nimport { loadAigentifyConfig } from './load-config.js';\n\nexport type { GeneratedArtifact } from '../generators/index.js';\n\nexport async function generateArtifact(artifact: GeneratedArtifact, directory = process.cwd(), params: GenerateParams = {}): Promise<string> {\n const config = (await loadAigentifyConfig(directory)) ?? defaultConfig();\n return generate(artifact, { ...config, ...params, offer: { ...(config.offer ?? {}), ...(params.offer ?? {}) } });\n}\n\nexport async function writeGeneratedArtifact(artifact: GeneratedArtifact, options: { directory?: string; output?: string; params?: GenerateParams } = {}): Promise<string> {\n const content = await generateArtifact(artifact, options.directory, options.params);\n if (options.output) await writeFile(options.output, content, 'utf8');\n return content;\n}\n","import path from 'node:path';\nimport { access } from 'node:fs/promises';\nimport { createJiti } from 'jiti';\nimport { CONFIG_FILENAME } from '../constants.js';\nimport { defineConfig, type AigentifyConfig } from '../config.js';\n\nexport async function findConfigFile(directory = process.cwd()): Promise<string | undefined> {\n const candidates = [CONFIG_FILENAME, CONFIG_FILENAME.replace(/\\.ts$/, '.js'), CONFIG_FILENAME.replace(/\\.ts$/, '.mjs')];\n for (const candidate of candidates) {\n const file = path.join(directory, candidate);\n try { await access(file); return file; } catch { /* Try the next supported extension. */ }\n }\n return undefined;\n}\n\nexport async function loadAigentifyConfig(directory = process.cwd()): Promise<AigentifyConfig | undefined> {\n const file = await findConfigFile(directory);\n if (!file) return undefined;\n const jiti = createJiti(import.meta.url);\n const module = (await jiti.import(file)) as { default?: AigentifyConfig; aigentifyConfig?: AigentifyConfig };\n const config = module.aigentifyConfig ?? module.default;\n if (!config) throw new Error(`${path.basename(file)} must export a default config or aigentifyConfig.`);\n return defineConfig(config);\n}\n"],"mappings":"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","names":["path","import_meta","import_promises","import_node_path","path","import_promises","import_node_path","import_promises","path","module","writeFile","startMcpServer"]} | ||
| {"version":3,"sources":["../package.json","../src/constants.ts","../src/audit.ts","../src/config.ts","../src/generators/agents.ts","../src/generators/agents-route.ts","../src/generators/offer.ts","../src/generators/server.ts","../src/generators/index.ts","../src/mcp.ts","../src/cli.ts","../src/commands/init.ts","../src/commands/gen.ts","../src/commands/load-config.ts"],"sourcesContent":["{\n \"name\": \"aigentify\",\n \"version\": \"0.1.1\",\n \"mcpName\": \"io.github.pooriaarab/aigentify\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\"aigentify\": \"dist/cli.js\", \"aigentify-mcp\": \"dist/mcp.js\"},\n \"exports\": {\".\": {\"types\": \"./dist/index.d.ts\", \"import\": \"./dist/index.js\", \"require\": \"./dist/index.cjs\"}},\n \"files\": [\"dist\"],\n \"repository\": {\"type\": \"git\", \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"},\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\"agents\", \"agentification\", \"mcp\", \"ai\", \"json-ld\"],\n \"publishConfig\": {\"access\": \"public\"},\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"lint\": \"tsc --noEmit --pretty false\",\n \"typecheck\": \"tsc --noEmit\",\n \"verify\": \"npm run typecheck && npm run build && npm run test\",\n \"prepublishOnly\": \"npm run verify\"\n },\n \"engines\": {\"node\": \">=20\"},\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.17.5\",\n \"cheerio\": \"^1.1.2\",\n \"commander\": \"^14.0.0\",\n \"jiti\": \"^2.5.1\",\n \"zod\": \"^4.0.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.15.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.2.4\"\n }\n}\n","import pkg from '../package.json';\n\nexport const PKG_NAME = pkg.name;\nexport const VERSION = pkg.version;\nexport const CONFIG_FILENAME = `${PKG_NAME}.config.ts`;\nexport const SERVER_SCHEMA_URL = 'https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json';\n// Any dated MCP registry schema is valid; only the bare `.../server.json` (no `.schema`) 404s.\nexport const SERVER_SCHEMA_RE = /^https:\\/\\/static\\.modelcontextprotocol\\.io\\/schemas\\/\\d{4}-\\d{2}-\\d{2}\\/server\\.schema\\.json$/;\n","import { readFile, readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { SERVER_SCHEMA_URL, SERVER_SCHEMA_RE } from './constants.js';\n\nexport type AuditStatus = 'pass' | 'fail' | 'warn' | 'na';\nexport interface AuditCheck { id: string; status: AuditStatus; note: string; weight: number }\nexport interface AuditGap { id: string; note: string; fix: string }\nexport interface AuditReport { target: string; score: number; checks: AuditCheck[]; gaps: AuditGap[] }\nexport interface AuditOptions { fetch?: typeof globalThis.fetch }\n\ninterface Endpoint { status: number; contentType: string; text: string }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n honestText: string; hasMcp: boolean; networkFailure: boolean;\n}\n\nconst SKIPPED = new Set(['.git', 'node_modules', 'dist', 'coverage', '.next', '_reference_geoaeo']);\nconst WEIGHTS: Record<string, number> = {\n 'agents-md': 15, 'agents-md-public-safe': 10, 'server-json': 15, mcp: 15,\n 'offer-jsonld': 15, 'honest-offer': 10, 'llms-txt': 10, sitemap: 10,\n};\nconst FIXES: Record<string, string> = {\n 'agents-md': 'Add a public AGENTS.md at the target root or serve /agents.md as text/markdown.',\n 'agents-md-public-safe': 'Rewrite AGENTS.md as product guidance. Remove repository paths and contributor instructions.',\n 'server-json': `Add server.json and set \"$schema\" to \"${SERVER_SCHEMA_URL}\". Include a repository and a remotes or packages entry.`,\n mcp: 'Publish server.json, .mcp.json, or an MCP entry point.',\n 'offer-jsonld': 'Publish JSON-LD with @type Offer, or a SoftwareApplication with an offers property.',\n 'honest-offer': 'State the real price plainly. Remove scarcity, countdown, and urgency language.',\n 'llms-txt': 'Publish /llms.txt with a concise product description.',\n sitemap: 'Publish /sitemap.xml for URL discovery.',\n};\n\nfunction check(id: string, status: AuditStatus, note: string): AuditCheck { return { id, status, note, weight: WEIGHTS[id] }; }\n\nexport function scoreAuditChecks(checks: AuditCheck[]): number {\n const relevant = checks.filter(item => item.status !== 'na');\n const total = relevant.reduce((sum, item) => sum + item.weight, 0);\n if (!total) return 0;\n const earned = relevant.reduce((sum, item) => sum + (item.status === 'pass' ? item.weight : item.status === 'warn' ? item.weight / 2 : 0), 0);\n return Math.round((earned / total) * 100);\n}\n\nasync function walkFiles(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n if (entry.isDirectory() && !SKIPPED.has(entry.name)) files.push(...await walkFiles(path.join(directory, entry.name)));\n else if (entry.isFile()) files.push(path.join(directory, entry.name));\n }\n return files;\n}\n\nasync function readText(file: string | undefined): Promise<string> {\n if (!file) return '';\n try { return await readFile(file, 'utf8'); } catch { return ''; }\n}\n\nfunction findFile(files: string[], name: string): string | undefined {\n return files.find(file => {\n const normalized = file.replaceAll('\\\\', '/');\n return path.basename(normalized) === name || normalized.endsWith(`/${name}/route.ts`);\n });\n}\n\nfunction parseJson(text: string): Record<string, unknown> | undefined {\n try {\n const value: unknown = JSON.parse(text);\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n } catch { return undefined; }\n}\n\nfunction validServer(text: string): { valid: boolean; reason: string } {\n const value = parseJson(text);\n if (!value) return { valid: false, reason: 'server.json is not valid JSON.' };\n if (typeof value.$schema !== 'string' || !SERVER_SCHEMA_RE.test(value.$schema)) return { valid: false, reason: `server.json \"$schema\" must be a dated MCP registry schema like ${SERVER_SCHEMA_URL} (the bare .../server.json 404s).` };\n const missing = ['name', 'description', 'repository', 'version'].filter(key => !value[key]);\n if (missing.length) return { valid: false, reason: `server.json is missing: ${missing.join(', ')}.` };\n if (!Array.isArray(value.remotes) && !Array.isArray(value.packages)) return { valid: false, reason: 'server.json needs a remotes or packages entry.' };\n return { valid: true, reason: 'server.json has the required MCP registry fields.' };\n}\n\nfunction hasOffer(texts: string[]): boolean {\n return texts.some(text => /\"@type\"\\s*:\\s*\"Offer\"/i.test(text) || /\"@type\"\\s*:\\s*\"SoftwareApplication\"/i.test(text) && /\"offers\"\\s*:/.test(text));\n}\n\nfunction hasUrgency(text: string): boolean {\n return /limited time|act now|hurry|expires|only\\s+\\d+\\s+left|ends in|sign up now|countdown/i.test(text);\n}\n\nfunction publicSafe(text: string): boolean {\n return !(/\\bsrc\\//i.test(text) || /\\bapps\\//i.test(text) || /\\bpackages\\//i.test(text) || /\\b[\\w.-]+\\.ts\\b/i.test(text) || /npm run build/i.test(text) || /\\btsconfig\\b/i.test(text) || /\\bcontributors?\\b/i.test(text) || /^#+\\s*layout\\b/im.test(text));\n}\n\nfunction offerBlock(text: string): string {\n const match = /^#+\\s*Offer\\b/im.exec(text);\n if (!match || match.index === undefined) return '';\n const rest = text.slice(match.index);\n const nextHeading = /^#+\\s+/m.exec(rest.slice(match[0].length));\n return nextHeading?.index === undefined ? rest : rest.slice(0, match[0].length + nextHeading.index);\n}\n\nasync function directorySnapshot(directory: string): Promise<Snapshot> {\n const files = await walkFiles(directory);\n const agentsFile = findFile(files, 'AGENTS.md');\n const serverFile = findFile(files, 'server.json');\n const mcpFile = files.find(file => /(?:^|\\/)\\.mcp\\.json$/.test(file.replaceAll('\\\\', '/')));\n const packageFile = findFile(files, 'package.json');\n const packageText = await readText(packageFile);\n const hasMcpBin = /\"(?:aigentify|[^\"\\n]*mcp[^\"\\n]*)\"\\s*:/i.test(packageText);\n const agentsText = await readText(agentsFile);\n const offerTexts = [agentsText, ...await Promise.all(files.filter(file => /\\.(html?|json|jsonld|md|mdx|tsx|jsx|js|mjs|ts)$/.test(file)).map(readText))];\n const llmsFile = findFile(files, 'llms.txt');\n const sitemapFile = findFile(files, 'sitemap.xml');\n const offerFiles = files.filter(file => /\\.jsonld$|(?:^|\\/)offer[^/]*\\.(?:json|html?)$/i.test(file));\n const honestText = [offerBlock(agentsText), ...await Promise.all(offerFiles.map(readText))].join('\\n');\n return {\n agents: { status: agentsFile ? 200 : 404, contentType: 'text/markdown', text: agentsText },\n server: { status: serverFile ? 200 : 404, contentType: 'application/json', text: await readText(serverFile) },\n mcp: { status: mcpFile || serverFile || hasMcpBin ? 200 : 404, contentType: '', text: '' },\n home: { status: 200, contentType: 'text/plain', text: offerTexts.join('\\n') },\n llms: { status: llmsFile ? 200 : 404, contentType: 'text/plain', text: await readText(llmsFile) },\n sitemap: { status: sitemapFile ? 200 : 404, contentType: 'application/xml', text: await readText(sitemapFile) },\n honestText, hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), networkFailure: false,\n };\n}\n\nasync function fetchText(fetcher: typeof globalThis.fetch, url: string): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000) });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text() };\n } catch { return { status: 0, contentType: '', text: '' }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n const [agents, server, mcp, home, llms, sitemap] = await Promise.all([\n fetchText(fetcher, `${base}/agents.md`), fetchText(fetcher, `${base}/server.json`), fetchText(fetcher, `${base}/.well-known/mcp`),\n fetchText(fetcher, base), fetchText(fetcher, `${base}/llms.txt`), fetchText(fetcher, `${base}/sitemap.xml`),\n ]);\n const endpoints = [agents, server, mcp, home, llms, sitemap];\n return { agents, server, mcp, home, llms, sitemap, honestText: [home.text, offerBlock(agents.text)].join('\\n'), hasMcp: server.status >= 200 && server.status < 400 || mcp.status >= 200 && mcp.status < 400, networkFailure: endpoints.every(item => item.status === 0) };\n}\n\nfunction buildChecks(snapshot: Snapshot): AuditCheck[] {\n const agentsPresent = snapshot.agents.status === 200 && snapshot.agents.text.trim().length > 0 && /(?:text\\/(?:markdown|plain)|application\\/markdown)/i.test(snapshot.agents.contentType);\n const agentsStatus: AuditStatus = snapshot.agents.status === 0 ? 'warn' : agentsPresent ? 'pass' : 'fail';\n const publicStatus: AuditStatus = !agentsPresent ? (snapshot.agents.status === 0 ? 'warn' : 'na') : publicSafe(snapshot.agents.text) ? 'pass' : 'warn';\n const serverInfo = snapshot.server.status === 200 ? validServer(snapshot.server.text) : undefined;\n const serverStatus: AuditStatus = snapshot.server.status === 0 ? 'warn' : !snapshot.hasMcp ? 'na' : serverInfo?.valid ? 'pass' : 'fail';\n const mcpStatus: AuditStatus = snapshot.networkFailure ? 'warn' : snapshot.hasMcp ? 'pass' : 'fail';\n const offerTexts = [snapshot.home.text, snapshot.agents.text];\n const offerStatus: AuditStatus = snapshot.home.status === 0 ? 'warn' : hasOffer(offerTexts) ? 'pass' : 'fail';\n const honestStatus: AuditStatus = !hasOffer(offerTexts) && !agentsPresent ? (snapshot.home.status === 0 ? 'warn' : 'na') : hasUrgency(snapshot.honestText) ? 'warn' : 'pass';\n const llmsStatus: AuditStatus = snapshot.llms.status === 0 ? 'warn' : snapshot.llms.status >= 200 && snapshot.llms.status < 400 && snapshot.llms.text.trim() ? 'pass' : 'fail';\n const sitemapStatus: AuditStatus = snapshot.sitemap.status === 0 ? 'warn' : snapshot.sitemap.status >= 200 && snapshot.sitemap.status < 400 && snapshot.sitemap.text.trim() ? 'pass' : 'fail';\n return [\n check('agents-md', agentsStatus, agentsPresent ? 'AGENTS.md is available.' : snapshot.agents.status === 0 ? 'The AGENTS.md request failed.' : 'AGENTS.md is missing.'),\n check('agents-md-public-safe', publicStatus, publicStatus === 'pass' ? 'AGENTS.md describes the product as a public surface.' : publicStatus === 'na' ? 'No AGENTS.md is available to inspect.' : 'AGENTS.md contains repository-internal guidance.'),\n check('server-json', serverStatus, serverInfo?.valid ? serverInfo.reason : serverInfo?.reason ?? (!snapshot.hasMcp ? 'No MCP surface was detected.' : 'server.json is missing.')),\n check('mcp', mcpStatus, snapshot.networkFailure ? 'The MCP discovery request failed.' : snapshot.hasMcp ? 'An MCP surface is available.' : 'No MCP surface was found.'),\n check('offer-jsonld', offerStatus, offerStatus === 'pass' ? 'Offer JSON-LD is available.' : offerStatus === 'warn' ? 'The offer could not be checked.' : 'No Offer JSON-LD was found.'),\n check('honest-offer', honestStatus, honestStatus === 'pass' ? 'Offer language states the price without pressure.' : honestStatus === 'na' ? 'No offer or Offer block was found.' : 'Offer language contains scarcity, countdown, or urgency copy.'),\n check('llms-txt', llmsStatus, llmsStatus === 'pass' ? 'llms.txt is available.' : llmsStatus === 'warn' ? 'The llms.txt request failed.' : 'llms.txt is missing.'),\n check('sitemap', sitemapStatus, sitemapStatus === 'pass' ? 'sitemap.xml is available.' : sitemapStatus === 'warn' ? 'The sitemap request failed.' : 'sitemap.xml is missing.'),\n ];\n}\n\nexport async function auditTarget(target: string, options: AuditOptions = {}): Promise<AuditReport> {\n const targetStat = await stat(target).catch(() => undefined);\n const snapshot = targetStat?.isDirectory() ? await directorySnapshot(target) : await urlSnapshot(target, options.fetch ?? globalThis.fetch);\n const checks = buildChecks(snapshot);\n const gaps = checks.filter(item => item.status === 'fail' || item.status === 'warn').map(item => ({ id: item.id, note: item.note, fix: FIXES[item.id] }));\n return { target, score: scoreAuditChecks(checks), checks, gaps };\n}\n\nexport function formatAuditReport(report: AuditReport): string {\n const lines = [`${report.target}: ${report.score}/100`, ''];\n for (const item of report.checks) lines.push(`${item.status.toUpperCase().padEnd(4)} ${item.id}: ${item.note}`);\n lines.push('', 'Gaps:');\n if (!report.gaps.length) lines.push('None.');\n else report.gaps.forEach((gap, index) => lines.push(`${index + 1}. ${gap.id}: ${gap.fix}`));\n return lines.join('\\n');\n}\n","export interface OfferConfig {\n name?: string;\n description?: string;\n price?: string | number;\n priceCurrency?: string;\n}\n\nexport interface AigentifyConfig {\n name: string;\n description: string;\n repository: string;\n version?: string;\n mcpUrl?: string;\n npmPackage?: string;\n offer?: OfferConfig;\n}\n\nexport function defineConfig(config: AigentifyConfig): AigentifyConfig {\n return { ...config, repository: config.repository.replace(/\\/+$/, ''), version: config.version ?? '0.1.0' };\n}\n\nexport function defaultConfig(): AigentifyConfig {\n return defineConfig({\n name: 'Your product',\n description: 'A product with an agent-native interface.',\n repository: 'https://github.com/your-org/your-product',\n npmPackage: 'your-package',\n });\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsMd(config: AigentifyConfig): string {\n const packageName = config.npmPackage ?? '<NPM_PACKAGE>';\n const mcp = config.mcpUrl ?? `npx ${packageName}`;\n const offer = config.offer;\n const offerLine = offer?.price === undefined ? 'Price: <PRICE>' : `Price: ${offer.priceCurrency ?? 'USD'} ${offer.price}`;\n return `# ${config.name}\n\n## Mental model\n\n${config.name} is ${config.description}\n\nUse the product interface for product work. Use the agent interface for repeatable tasks that need structured results.\n\n## The faces\n\n- Product: ${config.repository}\n- MCP: ${mcp}\n- Package: ${packageName}\n\n## MCP tools\n\n| Tool | Input | Result |\n| --- | --- | --- |\n| audit | target | An agent-readiness report with a score and gaps. |\n| gen | artifact and params | A generated agent-native artifact. |\n\n## The loop\n\n1. Audit the target.\n2. Fix the highest-impact gap.\n3. Generate or publish the missing artifact.\n4. Audit again and keep the report with the release.\n\n## Rules\n\n- Treat the product description and prices as source facts.\n- Return structured data when a tool provides it.\n- Ask for missing information before making a high-impact change.\n- Keep public agent instructions about the product and its use.\n\n## Offer\n\n${offer?.description ?? '<OFFER_DESCRIPTION>'}\n\n${offerLine}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsRoute(config: AigentifyConfig, framework = 'static'): string {\n if (framework === 'next') {\n return `# Serve /agents.md from a Next route\n\nCopy AGENTS.md to a public directory, or add this force-static route:\n\n\\`\\`\\`ts\nimport { readFile } from 'node:fs/promises';\n\nexport const dynamic = 'force-static';\n\nexport async function GET() {\n const body = await readFile('AGENTS.md', 'utf8');\n return new Response(body, { headers: { 'content-type': 'text/markdown; charset=utf-8' } });\n}\n\\`\\`\\`\n\nProduct: ${config.name}\n`;\n }\n return `# Serve /agents.md\n\nCopy the generated AGENTS.md file to public/agents.md and serve it as a static text/markdown response.\n\nProduct: ${config.name}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateOffer(config: AigentifyConfig): string {\n const offer = config.offer ?? {};\n const data = {\n '@context': 'https://schema.org',\n '@type': 'SoftwareApplication',\n name: config.name,\n description: config.description,\n applicationCategory: 'DeveloperApplication',\n offers: [{\n '@type': 'Offer',\n name: offer.name ?? `${config.name} access`,\n ...(offer.description ? { description: offer.description } : {}),\n ...(offer.price === undefined ? {} : { price: String(offer.price) }),\n priceCurrency: offer.priceCurrency ?? 'USD',\n }],\n };\n return `${JSON.stringify(data, null, 2)}\\n`;\n}\n","import { SERVER_SCHEMA_URL } from '../constants.js';\nimport type { AigentifyConfig } from '../config.js';\n\nexport function generateServerJson(config: AigentifyConfig): string {\n const serverName = config.name.includes('/') ? config.name : `io.github.pooriaarab/${config.name.toLowerCase().replace(/[^a-z0-9._-]+/g, '-')}`;\n const server: Record<string, unknown> = {\n $schema: SERVER_SCHEMA_URL,\n name: serverName,\n description: config.description,\n repository: { url: config.repository, source: 'github' },\n version: config.version ?? '0.1.0',\n };\n if (config.mcpUrl) server.remotes = [{ type: 'streamable-http', url: config.mcpUrl }];\n else server.packages = [{ registryType: 'npm', registryBaseUrl: 'https://registry.npmjs.org', identifier: config.npmPackage ?? 'aigentify', version: config.version ?? '0.1.0', transport: { type: 'stdio' }, runtimeHint: 'npx', packageArguments: [{ type: 'positional', valueHint: 'subcommand', value: 'mcp' }] }];\n return `${JSON.stringify(server, null, 2)}\\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\nimport { defaultConfig, defineConfig } from '../config.js';\nimport { generateAgentsMd } from './agents.js';\nimport { generateAgentsRoute } from './agents-route.js';\nimport { generateOffer } from './offer.js';\nimport { generateServerJson } from './server.js';\nexport * from './agents.js';\nexport * from './agents-route.js';\nexport * from './offer.js';\nexport * from './server.js';\n\nexport type GeneratedArtifact = 'agents-md' | 'server-json' | 'offer' | 'agents-route';\nexport type GenerateParams = Partial<AigentifyConfig> & { framework?: string };\n\nfunction configFromParams(params: GenerateParams = {}): AigentifyConfig {\n const base = defaultConfig();\n return defineConfig({ ...base, ...params, offer: { ...(base.offer ?? {}), ...(params.offer ?? {}) } });\n}\n\nexport function generate(artifact: GeneratedArtifact, params: GenerateParams = {}): string {\n const config = configFromParams(params);\n if (artifact === 'agents-md') return generateAgentsMd(config);\n if (artifact === 'server-json') return generateServerJson(config);\n if (artifact === 'offer') return generateOffer(config);\n if (artifact === 'agents-route') return generateAgentsRoute(config, params.framework);\n throw new Error(`Unknown artifact: ${artifact}`);\n}\n","#!/usr/bin/env node\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { auditTarget } from './audit.js';\nimport { PKG_NAME, VERSION } from './constants.js';\nimport { generate, type GenerateParams, type GeneratedArtifact } from './generators/index.js';\n\nconst artifacts = ['agents-md', 'server-json', 'offer', 'agents-route'] as const;\n\nexport function createMcpServer(): McpServer {\n const server = new McpServer({ name: PKG_NAME, version: VERSION });\n server.registerTool('audit', {\n description: 'Audit a local directory or live URL for agent-native readiness.',\n inputSchema: { target: z.string() },\n }, async ({ target }) => ({ content: [{ type: 'text', text: JSON.stringify(await auditTarget(target), null, 2) }] }));\n server.registerTool('gen', {\n description: 'Generate an agent-native artifact as text.',\n inputSchema: { artifact: z.enum(artifacts), params: z.record(z.string(), z.unknown()).optional() },\n }, async ({ artifact, params }) => ({ content: [{ type: 'text', text: generate(artifact as GeneratedArtifact, (params ?? {}) as GenerateParams) }] }));\n return server;\n}\n\nexport async function startMcpServer(): Promise<void> {\n const server = createMcpServer();\n await server.connect(new StdioServerTransport());\n}\n\nif (import.meta.url === `file://${process.argv[1]}`) startMcpServer().catch(error => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n});\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { auditTarget, formatAuditReport } from './audit.js';\nimport { PKG_NAME, VERSION } from './constants.js';\nimport { initProject } from './commands/init.js';\nimport { generateArtifact, type GeneratedArtifact } from './commands/gen.js';\nimport type { GenerateParams } from './generators/index.js';\n\nconst program = new Command();\nprogram.name(PKG_NAME).version(VERSION).description('Audit and generate agent-native product surfaces.');\n\nprogram.command('audit [target]').description('Audit a local directory or live URL.').option('--json', 'print JSON instead of the report').action(async (target = '.', options: { json?: boolean }) => {\n const report = await auditTarget(target);\n process.stdout.write(options.json ? `${JSON.stringify(report, null, 2)}\\n` : `${formatAuditReport(report)}\\n`);\n});\n\nprogram.command('init').description('Write starter AGENTS.md and server.json into the current directory.').option('--force', 'overwrite existing files').action(async (options: { force?: boolean }) => {\n const result = await initProject({ directory: process.cwd(), force: options.force });\n process.stdout.write(`created ${result.created.length}, skipped ${result.skipped.length}\\n`);\n});\n\nprogram.command('gen <artifact>').description('Generate an agent-native artifact.').option('-o, --out <path>', 'write to a file instead of stdout').option('--name <name>').option('--description <description>').option('--repository <url>').option('--mcp-url <url>').option('--npm-package <name>').option('--price <price>').option('--price-currency <currency>').option('--framework <framework>', 'route framework, such as static or next', 'static').action(async (artifact: string, options: Record<string, string | undefined>) => {\n const offer = options.price === undefined && options.priceCurrency === undefined ? undefined : { price: options.price, priceCurrency: options.priceCurrency };\n const params = Object.fromEntries(Object.entries({ name: options.name, description: options.description, repository: options.repository, mcpUrl: options.mcpUrl, npmPackage: options.npmPackage, framework: options.framework, offer }).filter(([, value]) => value !== undefined));\n const content = await generateArtifact(artifact as GeneratedArtifact, process.cwd(), params as GenerateParams);\n if (options.out) { const { writeFile } = await import('node:fs/promises'); await writeFile(options.out, content, 'utf8'); }\n else process.stdout.write(content);\n});\n\nprogram.command('mcp').description('Run the MCP server over stdio.').action(async () => { const { startMcpServer } = await import('./mcp.js'); await startMcpServer(); });\nprogram.parseAsync().catch(error => { process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`); process.exitCode = 1; });\n","import { access, mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { defaultConfig } from '../config.js';\nimport { generate } from '../generators/index.js';\n\nexport interface InitOptions { directory: string; force?: boolean }\nexport interface InitResult { created: string[]; skipped: string[] }\n\nexport async function initProject(options: InitOptions): Promise<InitResult> {\n const root = path.resolve(options.directory);\n await mkdir(root, { recursive: true });\n const config = defaultConfig();\n const result: InitResult = { created: [], skipped: [] };\n for (const [name, content] of [['AGENTS.md', generate('agents-md', config)], ['server.json', generate('server-json', config)]] as const) {\n const file = path.join(root, name);\n try {\n await access(file);\n if (!options.force) { result.skipped.push(name); continue; }\n } catch { /* The file does not exist yet. */ }\n await writeFile(file, content, 'utf8');\n result.created.push(name);\n }\n return result;\n}\n","import { writeFile } from 'node:fs/promises';\nimport { defaultConfig } from '../config.js';\nimport { generate, type GenerateParams, type GeneratedArtifact } from '../generators/index.js';\nimport { loadAigentifyConfig } from './load-config.js';\n\nexport type { GeneratedArtifact } from '../generators/index.js';\n\nexport async function generateArtifact(artifact: GeneratedArtifact, directory = process.cwd(), params: GenerateParams = {}): Promise<string> {\n const config = (await loadAigentifyConfig(directory)) ?? defaultConfig();\n return generate(artifact, { ...config, ...params, offer: { ...(config.offer ?? {}), ...(params.offer ?? {}) } });\n}\n\nexport async function writeGeneratedArtifact(artifact: GeneratedArtifact, options: { directory?: string; output?: string; params?: GenerateParams } = {}): Promise<string> {\n const content = await generateArtifact(artifact, options.directory, options.params);\n if (options.output) await writeFile(options.output, content, 'utf8');\n return content;\n}\n","import path from 'node:path';\nimport { access } from 'node:fs/promises';\nimport { createJiti } from 'jiti';\nimport { CONFIG_FILENAME } from '../constants.js';\nimport { defineConfig, type AigentifyConfig } from '../config.js';\n\nexport async function findConfigFile(directory = process.cwd()): Promise<string | undefined> {\n const candidates = [CONFIG_FILENAME, CONFIG_FILENAME.replace(/\\.ts$/, '.js'), CONFIG_FILENAME.replace(/\\.ts$/, '.mjs')];\n for (const candidate of candidates) {\n const file = path.join(directory, candidate);\n try { await access(file); return file; } catch { /* Try the next supported extension. */ }\n }\n return undefined;\n}\n\nexport async function loadAigentifyConfig(directory = process.cwd()): Promise<AigentifyConfig | undefined> {\n const file = await findConfigFile(directory);\n if (!file) return undefined;\n const jiti = createJiti(import.meta.url);\n const module = (await jiti.import(file)) as { default?: AigentifyConfig; aigentifyConfig?: AigentifyConfig };\n const config = module.aigentifyConfig ?? module.default;\n if (!config) throw new Error(`${path.basename(file)} must export a default config or aigentifyConfig.`);\n return defineConfig(config);\n}\n"],"mappings":"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","names":["path","import_meta","import_promises","import_node_path","path","import_promises","import_node_path","import_promises","path","module","writeFile","startMcpServer"]} |
+7
-5
@@ -18,3 +18,4 @@ #!/usr/bin/env node | ||
| name: "aigentify", | ||
| version: "0.1.0", | ||
| version: "0.1.1", | ||
| mcpName: "io.github.pooriaarab/aigentify", | ||
| description: "Audit and generate agent-native product surfaces", | ||
@@ -58,3 +59,3 @@ type: "module", | ||
| // src/constants.ts | ||
| var PKG_NAME, VERSION, CONFIG_FILENAME, SERVER_SCHEMA_URL; | ||
| var PKG_NAME, VERSION, CONFIG_FILENAME, SERVER_SCHEMA_URL, SERVER_SCHEMA_RE; | ||
| var init_constants = __esm({ | ||
@@ -67,3 +68,4 @@ "src/constants.ts"() { | ||
| CONFIG_FILENAME = `${PKG_NAME}.config.ts`; | ||
| SERVER_SCHEMA_URL = "https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json"; | ||
| SERVER_SCHEMA_URL = "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json"; | ||
| SERVER_SCHEMA_RE = /^https:\/\/static\.modelcontextprotocol\.io\/schemas\/\d{4}-\d{2}-\d{2}\/server\.schema\.json$/; | ||
| } | ||
@@ -119,3 +121,3 @@ }); | ||
| if (!value) return { valid: false, reason: "server.json is not valid JSON." }; | ||
| if (value.$schema !== SERVER_SCHEMA_URL) return { valid: false, reason: `server.json must use the exact schema URL ${SERVER_SCHEMA_URL}.` }; | ||
| if (typeof value.$schema !== "string" || !SERVER_SCHEMA_RE.test(value.$schema)) return { valid: false, reason: `server.json "$schema" must be a dated MCP registry schema like ${SERVER_SCHEMA_URL} (the bare .../server.json 404s).` }; | ||
| const missing = ["name", "description", "repository", "version"].filter((key) => !value[key]); | ||
@@ -399,3 +401,3 @@ if (missing.length) return { valid: false, reason: `server.json is missing: ${missing.join(", ")}.` }; | ||
| if (config.mcpUrl) server.remotes = [{ type: "streamable-http", url: config.mcpUrl }]; | ||
| else server.packages = [{ registry_type: "npm", identifier: config.npmPackage ?? "aigentify", version: config.version ?? "0.1.0", runtime_hint: "npx", transport: { type: "stdio" } }]; | ||
| else server.packages = [{ registryType: "npm", registryBaseUrl: "https://registry.npmjs.org", identifier: config.npmPackage ?? "aigentify", version: config.version ?? "0.1.0", transport: { type: "stdio" }, runtimeHint: "npx", packageArguments: [{ type: "positional", valueHint: "subcommand", value: "mcp" }] }]; | ||
| return `${JSON.stringify(server, null, 2)} | ||
@@ -402,0 +404,0 @@ `; |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../package.json","../src/constants.ts","../src/audit.ts","../src/config.ts","../src/generators/agents.ts","../src/generators/agents-route.ts","../src/generators/offer.ts","../src/generators/server.ts","../src/generators/index.ts","../src/mcp.ts","../src/cli.ts","../src/commands/init.ts","../src/commands/gen.ts","../src/commands/load-config.ts"],"sourcesContent":["{\n \"name\": \"aigentify\",\n \"version\": \"0.1.0\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\"aigentify\": \"dist/cli.js\", \"aigentify-mcp\": \"dist/mcp.js\"},\n \"exports\": {\".\": {\"types\": \"./dist/index.d.ts\", \"import\": \"./dist/index.js\", \"require\": \"./dist/index.cjs\"}},\n \"files\": [\"dist\"],\n \"repository\": {\"type\": \"git\", \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"},\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\"agents\", \"agentification\", \"mcp\", \"ai\", \"json-ld\"],\n \"publishConfig\": {\"access\": \"public\"},\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"lint\": \"tsc --noEmit --pretty false\",\n \"typecheck\": \"tsc --noEmit\",\n \"verify\": \"npm run typecheck && npm run build && npm run test\",\n \"prepublishOnly\": \"npm run verify\"\n },\n \"engines\": {\"node\": \">=20\"},\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.17.5\",\n \"cheerio\": \"^1.1.2\",\n \"commander\": \"^14.0.0\",\n \"jiti\": \"^2.5.1\",\n \"zod\": \"^4.0.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.15.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.2.4\"\n }\n}\n","import pkg from '../package.json';\n\nexport const PKG_NAME = pkg.name;\nexport const VERSION = pkg.version;\nexport const CONFIG_FILENAME = `${PKG_NAME}.config.ts`;\nexport const SERVER_SCHEMA_URL = 'https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json';\n","import { readFile, readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { SERVER_SCHEMA_URL } from './constants.js';\n\nexport type AuditStatus = 'pass' | 'fail' | 'warn' | 'na';\nexport interface AuditCheck { id: string; status: AuditStatus; note: string; weight: number }\nexport interface AuditGap { id: string; note: string; fix: string }\nexport interface AuditReport { target: string; score: number; checks: AuditCheck[]; gaps: AuditGap[] }\nexport interface AuditOptions { fetch?: typeof globalThis.fetch }\n\ninterface Endpoint { status: number; contentType: string; text: string }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n honestText: string; hasMcp: boolean; networkFailure: boolean;\n}\n\nconst SKIPPED = new Set(['.git', 'node_modules', 'dist', 'coverage', '.next', '_reference_geoaeo']);\nconst WEIGHTS: Record<string, number> = {\n 'agents-md': 15, 'agents-md-public-safe': 10, 'server-json': 15, mcp: 15,\n 'offer-jsonld': 15, 'honest-offer': 10, 'llms-txt': 10, sitemap: 10,\n};\nconst FIXES: Record<string, string> = {\n 'agents-md': 'Add a public AGENTS.md at the target root or serve /agents.md as text/markdown.',\n 'agents-md-public-safe': 'Rewrite AGENTS.md as product guidance. Remove repository paths and contributor instructions.',\n 'server-json': `Add server.json and set \"$schema\" to \"${SERVER_SCHEMA_URL}\". Include a repository and a remotes or packages entry.`,\n mcp: 'Publish server.json, .mcp.json, or an MCP entry point.',\n 'offer-jsonld': 'Publish JSON-LD with @type Offer, or a SoftwareApplication with an offers property.',\n 'honest-offer': 'State the real price plainly. Remove scarcity, countdown, and urgency language.',\n 'llms-txt': 'Publish /llms.txt with a concise product description.',\n sitemap: 'Publish /sitemap.xml for URL discovery.',\n};\n\nfunction check(id: string, status: AuditStatus, note: string): AuditCheck { return { id, status, note, weight: WEIGHTS[id] }; }\n\nexport function scoreAuditChecks(checks: AuditCheck[]): number {\n const relevant = checks.filter(item => item.status !== 'na');\n const total = relevant.reduce((sum, item) => sum + item.weight, 0);\n if (!total) return 0;\n const earned = relevant.reduce((sum, item) => sum + (item.status === 'pass' ? item.weight : item.status === 'warn' ? item.weight / 2 : 0), 0);\n return Math.round((earned / total) * 100);\n}\n\nasync function walkFiles(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n if (entry.isDirectory() && !SKIPPED.has(entry.name)) files.push(...await walkFiles(path.join(directory, entry.name)));\n else if (entry.isFile()) files.push(path.join(directory, entry.name));\n }\n return files;\n}\n\nasync function readText(file: string | undefined): Promise<string> {\n if (!file) return '';\n try { return await readFile(file, 'utf8'); } catch { return ''; }\n}\n\nfunction findFile(files: string[], name: string): string | undefined {\n return files.find(file => {\n const normalized = file.replaceAll('\\\\', '/');\n return path.basename(normalized) === name || normalized.endsWith(`/${name}/route.ts`);\n });\n}\n\nfunction parseJson(text: string): Record<string, unknown> | undefined {\n try {\n const value: unknown = JSON.parse(text);\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n } catch { return undefined; }\n}\n\nfunction validServer(text: string): { valid: boolean; reason: string } {\n const value = parseJson(text);\n if (!value) return { valid: false, reason: 'server.json is not valid JSON.' };\n if (value.$schema !== SERVER_SCHEMA_URL) return { valid: false, reason: `server.json must use the exact schema URL ${SERVER_SCHEMA_URL}.` };\n const missing = ['name', 'description', 'repository', 'version'].filter(key => !value[key]);\n if (missing.length) return { valid: false, reason: `server.json is missing: ${missing.join(', ')}.` };\n if (!Array.isArray(value.remotes) && !Array.isArray(value.packages)) return { valid: false, reason: 'server.json needs a remotes or packages entry.' };\n return { valid: true, reason: 'server.json has the required MCP registry fields.' };\n}\n\nfunction hasOffer(texts: string[]): boolean {\n return texts.some(text => /\"@type\"\\s*:\\s*\"Offer\"/i.test(text) || /\"@type\"\\s*:\\s*\"SoftwareApplication\"/i.test(text) && /\"offers\"\\s*:/.test(text));\n}\n\nfunction hasUrgency(text: string): boolean {\n return /limited time|act now|hurry|expires|only\\s+\\d+\\s+left|ends in|sign up now|countdown/i.test(text);\n}\n\nfunction publicSafe(text: string): boolean {\n return !(/\\bsrc\\//i.test(text) || /\\bapps\\//i.test(text) || /\\bpackages\\//i.test(text) || /\\b[\\w.-]+\\.ts\\b/i.test(text) || /npm run build/i.test(text) || /\\btsconfig\\b/i.test(text) || /\\bcontributors?\\b/i.test(text) || /^#+\\s*layout\\b/im.test(text));\n}\n\nfunction offerBlock(text: string): string {\n const match = /^#+\\s*Offer\\b/im.exec(text);\n if (!match || match.index === undefined) return '';\n const rest = text.slice(match.index);\n const nextHeading = /^#+\\s+/m.exec(rest.slice(match[0].length));\n return nextHeading?.index === undefined ? rest : rest.slice(0, match[0].length + nextHeading.index);\n}\n\nasync function directorySnapshot(directory: string): Promise<Snapshot> {\n const files = await walkFiles(directory);\n const agentsFile = findFile(files, 'AGENTS.md');\n const serverFile = findFile(files, 'server.json');\n const mcpFile = files.find(file => /(?:^|\\/)\\.mcp\\.json$/.test(file.replaceAll('\\\\', '/')));\n const packageFile = findFile(files, 'package.json');\n const packageText = await readText(packageFile);\n const hasMcpBin = /\"(?:aigentify|[^\"\\n]*mcp[^\"\\n]*)\"\\s*:/i.test(packageText);\n const agentsText = await readText(agentsFile);\n const offerTexts = [agentsText, ...await Promise.all(files.filter(file => /\\.(html?|json|jsonld|md|mdx|tsx|jsx|js|mjs|ts)$/.test(file)).map(readText))];\n const llmsFile = findFile(files, 'llms.txt');\n const sitemapFile = findFile(files, 'sitemap.xml');\n const offerFiles = files.filter(file => /\\.jsonld$|(?:^|\\/)offer[^/]*\\.(?:json|html?)$/i.test(file));\n const honestText = [offerBlock(agentsText), ...await Promise.all(offerFiles.map(readText))].join('\\n');\n return {\n agents: { status: agentsFile ? 200 : 404, contentType: 'text/markdown', text: agentsText },\n server: { status: serverFile ? 200 : 404, contentType: 'application/json', text: await readText(serverFile) },\n mcp: { status: mcpFile || serverFile || hasMcpBin ? 200 : 404, contentType: '', text: '' },\n home: { status: 200, contentType: 'text/plain', text: offerTexts.join('\\n') },\n llms: { status: llmsFile ? 200 : 404, contentType: 'text/plain', text: await readText(llmsFile) },\n sitemap: { status: sitemapFile ? 200 : 404, contentType: 'application/xml', text: await readText(sitemapFile) },\n honestText, hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), networkFailure: false,\n };\n}\n\nasync function fetchText(fetcher: typeof globalThis.fetch, url: string): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000) });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text() };\n } catch { return { status: 0, contentType: '', text: '' }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n const [agents, server, mcp, home, llms, sitemap] = await Promise.all([\n fetchText(fetcher, `${base}/agents.md`), fetchText(fetcher, `${base}/server.json`), fetchText(fetcher, `${base}/.well-known/mcp`),\n fetchText(fetcher, base), fetchText(fetcher, `${base}/llms.txt`), fetchText(fetcher, `${base}/sitemap.xml`),\n ]);\n const endpoints = [agents, server, mcp, home, llms, sitemap];\n return { agents, server, mcp, home, llms, sitemap, honestText: [home.text, offerBlock(agents.text)].join('\\n'), hasMcp: server.status >= 200 && server.status < 400 || mcp.status >= 200 && mcp.status < 400, networkFailure: endpoints.every(item => item.status === 0) };\n}\n\nfunction buildChecks(snapshot: Snapshot): AuditCheck[] {\n const agentsPresent = snapshot.agents.status === 200 && snapshot.agents.text.trim().length > 0 && /(?:text\\/(?:markdown|plain)|application\\/markdown)/i.test(snapshot.agents.contentType);\n const agentsStatus: AuditStatus = snapshot.agents.status === 0 ? 'warn' : agentsPresent ? 'pass' : 'fail';\n const publicStatus: AuditStatus = !agentsPresent ? (snapshot.agents.status === 0 ? 'warn' : 'na') : publicSafe(snapshot.agents.text) ? 'pass' : 'warn';\n const serverInfo = snapshot.server.status === 200 ? validServer(snapshot.server.text) : undefined;\n const serverStatus: AuditStatus = snapshot.server.status === 0 ? 'warn' : !snapshot.hasMcp ? 'na' : serverInfo?.valid ? 'pass' : 'fail';\n const mcpStatus: AuditStatus = snapshot.networkFailure ? 'warn' : snapshot.hasMcp ? 'pass' : 'fail';\n const offerTexts = [snapshot.home.text, snapshot.agents.text];\n const offerStatus: AuditStatus = snapshot.home.status === 0 ? 'warn' : hasOffer(offerTexts) ? 'pass' : 'fail';\n const honestStatus: AuditStatus = !hasOffer(offerTexts) && !agentsPresent ? (snapshot.home.status === 0 ? 'warn' : 'na') : hasUrgency(snapshot.honestText) ? 'warn' : 'pass';\n const llmsStatus: AuditStatus = snapshot.llms.status === 0 ? 'warn' : snapshot.llms.status >= 200 && snapshot.llms.status < 400 && snapshot.llms.text.trim() ? 'pass' : 'fail';\n const sitemapStatus: AuditStatus = snapshot.sitemap.status === 0 ? 'warn' : snapshot.sitemap.status >= 200 && snapshot.sitemap.status < 400 && snapshot.sitemap.text.trim() ? 'pass' : 'fail';\n return [\n check('agents-md', agentsStatus, agentsPresent ? 'AGENTS.md is available.' : snapshot.agents.status === 0 ? 'The AGENTS.md request failed.' : 'AGENTS.md is missing.'),\n check('agents-md-public-safe', publicStatus, publicStatus === 'pass' ? 'AGENTS.md describes the product as a public surface.' : publicStatus === 'na' ? 'No AGENTS.md is available to inspect.' : 'AGENTS.md contains repository-internal guidance.'),\n check('server-json', serverStatus, serverInfo?.valid ? serverInfo.reason : serverInfo?.reason ?? (!snapshot.hasMcp ? 'No MCP surface was detected.' : 'server.json is missing.')),\n check('mcp', mcpStatus, snapshot.networkFailure ? 'The MCP discovery request failed.' : snapshot.hasMcp ? 'An MCP surface is available.' : 'No MCP surface was found.'),\n check('offer-jsonld', offerStatus, offerStatus === 'pass' ? 'Offer JSON-LD is available.' : offerStatus === 'warn' ? 'The offer could not be checked.' : 'No Offer JSON-LD was found.'),\n check('honest-offer', honestStatus, honestStatus === 'pass' ? 'Offer language states the price without pressure.' : honestStatus === 'na' ? 'No offer or Offer block was found.' : 'Offer language contains scarcity, countdown, or urgency copy.'),\n check('llms-txt', llmsStatus, llmsStatus === 'pass' ? 'llms.txt is available.' : llmsStatus === 'warn' ? 'The llms.txt request failed.' : 'llms.txt is missing.'),\n check('sitemap', sitemapStatus, sitemapStatus === 'pass' ? 'sitemap.xml is available.' : sitemapStatus === 'warn' ? 'The sitemap request failed.' : 'sitemap.xml is missing.'),\n ];\n}\n\nexport async function auditTarget(target: string, options: AuditOptions = {}): Promise<AuditReport> {\n const targetStat = await stat(target).catch(() => undefined);\n const snapshot = targetStat?.isDirectory() ? await directorySnapshot(target) : await urlSnapshot(target, options.fetch ?? globalThis.fetch);\n const checks = buildChecks(snapshot);\n const gaps = checks.filter(item => item.status === 'fail' || item.status === 'warn').map(item => ({ id: item.id, note: item.note, fix: FIXES[item.id] }));\n return { target, score: scoreAuditChecks(checks), checks, gaps };\n}\n\nexport function formatAuditReport(report: AuditReport): string {\n const lines = [`${report.target}: ${report.score}/100`, ''];\n for (const item of report.checks) lines.push(`${item.status.toUpperCase().padEnd(4)} ${item.id}: ${item.note}`);\n lines.push('', 'Gaps:');\n if (!report.gaps.length) lines.push('None.');\n else report.gaps.forEach((gap, index) => lines.push(`${index + 1}. ${gap.id}: ${gap.fix}`));\n return lines.join('\\n');\n}\n","export interface OfferConfig {\n name?: string;\n description?: string;\n price?: string | number;\n priceCurrency?: string;\n}\n\nexport interface AigentifyConfig {\n name: string;\n description: string;\n repository: string;\n version?: string;\n mcpUrl?: string;\n npmPackage?: string;\n offer?: OfferConfig;\n}\n\nexport function defineConfig(config: AigentifyConfig): AigentifyConfig {\n return { ...config, repository: config.repository.replace(/\\/+$/, ''), version: config.version ?? '0.1.0' };\n}\n\nexport function defaultConfig(): AigentifyConfig {\n return defineConfig({\n name: 'Your product',\n description: 'A product with an agent-native interface.',\n repository: 'https://github.com/your-org/your-product',\n npmPackage: 'your-package',\n });\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsMd(config: AigentifyConfig): string {\n const packageName = config.npmPackage ?? '<NPM_PACKAGE>';\n const mcp = config.mcpUrl ?? `npx ${packageName}`;\n const offer = config.offer;\n const offerLine = offer?.price === undefined ? 'Price: <PRICE>' : `Price: ${offer.priceCurrency ?? 'USD'} ${offer.price}`;\n return `# ${config.name}\n\n## Mental model\n\n${config.name} is ${config.description}\n\nUse the product interface for product work. Use the agent interface for repeatable tasks that need structured results.\n\n## The faces\n\n- Product: ${config.repository}\n- MCP: ${mcp}\n- Package: ${packageName}\n\n## MCP tools\n\n| Tool | Input | Result |\n| --- | --- | --- |\n| audit | target | An agent-readiness report with a score and gaps. |\n| gen | artifact and params | A generated agent-native artifact. |\n\n## The loop\n\n1. Audit the target.\n2. Fix the highest-impact gap.\n3. Generate or publish the missing artifact.\n4. Audit again and keep the report with the release.\n\n## Rules\n\n- Treat the product description and prices as source facts.\n- Return structured data when a tool provides it.\n- Ask for missing information before making a high-impact change.\n- Keep public agent instructions about the product and its use.\n\n## Offer\n\n${offer?.description ?? '<OFFER_DESCRIPTION>'}\n\n${offerLine}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsRoute(config: AigentifyConfig, framework = 'static'): string {\n if (framework === 'next') {\n return `# Serve /agents.md from a Next route\n\nCopy AGENTS.md to a public directory, or add this force-static route:\n\n\\`\\`\\`ts\nimport { readFile } from 'node:fs/promises';\n\nexport const dynamic = 'force-static';\n\nexport async function GET() {\n const body = await readFile('AGENTS.md', 'utf8');\n return new Response(body, { headers: { 'content-type': 'text/markdown; charset=utf-8' } });\n}\n\\`\\`\\`\n\nProduct: ${config.name}\n`;\n }\n return `# Serve /agents.md\n\nCopy the generated AGENTS.md file to public/agents.md and serve it as a static text/markdown response.\n\nProduct: ${config.name}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateOffer(config: AigentifyConfig): string {\n const offer = config.offer ?? {};\n const data = {\n '@context': 'https://schema.org',\n '@type': 'SoftwareApplication',\n name: config.name,\n description: config.description,\n applicationCategory: 'DeveloperApplication',\n offers: [{\n '@type': 'Offer',\n name: offer.name ?? `${config.name} access`,\n ...(offer.description ? { description: offer.description } : {}),\n ...(offer.price === undefined ? {} : { price: String(offer.price) }),\n priceCurrency: offer.priceCurrency ?? 'USD',\n }],\n };\n return `${JSON.stringify(data, null, 2)}\\n`;\n}\n","import { SERVER_SCHEMA_URL } from '../constants.js';\nimport type { AigentifyConfig } from '../config.js';\n\nexport function generateServerJson(config: AigentifyConfig): string {\n const serverName = config.name.includes('/') ? config.name : `io.github.pooriaarab/${config.name.toLowerCase().replace(/[^a-z0-9._-]+/g, '-')}`;\n const server: Record<string, unknown> = {\n $schema: SERVER_SCHEMA_URL,\n name: serverName,\n description: config.description,\n repository: { url: config.repository, source: 'github' },\n version: config.version ?? '0.1.0',\n };\n if (config.mcpUrl) server.remotes = [{ type: 'streamable-http', url: config.mcpUrl }];\n else server.packages = [{ registry_type: 'npm', identifier: config.npmPackage ?? 'aigentify', version: config.version ?? '0.1.0', runtime_hint: 'npx', transport: { type: 'stdio' } }];\n return `${JSON.stringify(server, null, 2)}\\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\nimport { defaultConfig, defineConfig } from '../config.js';\nimport { generateAgentsMd } from './agents.js';\nimport { generateAgentsRoute } from './agents-route.js';\nimport { generateOffer } from './offer.js';\nimport { generateServerJson } from './server.js';\nexport * from './agents.js';\nexport * from './agents-route.js';\nexport * from './offer.js';\nexport * from './server.js';\n\nexport type GeneratedArtifact = 'agents-md' | 'server-json' | 'offer' | 'agents-route';\nexport type GenerateParams = Partial<AigentifyConfig> & { framework?: string };\n\nfunction configFromParams(params: GenerateParams = {}): AigentifyConfig {\n const base = defaultConfig();\n return defineConfig({ ...base, ...params, offer: { ...(base.offer ?? {}), ...(params.offer ?? {}) } });\n}\n\nexport function generate(artifact: GeneratedArtifact, params: GenerateParams = {}): string {\n const config = configFromParams(params);\n if (artifact === 'agents-md') return generateAgentsMd(config);\n if (artifact === 'server-json') return generateServerJson(config);\n if (artifact === 'offer') return generateOffer(config);\n if (artifact === 'agents-route') return generateAgentsRoute(config, params.framework);\n throw new Error(`Unknown artifact: ${artifact}`);\n}\n","#!/usr/bin/env node\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { auditTarget } from './audit.js';\nimport { PKG_NAME, VERSION } from './constants.js';\nimport { generate, type GenerateParams, type GeneratedArtifact } from './generators/index.js';\n\nconst artifacts = ['agents-md', 'server-json', 'offer', 'agents-route'] as const;\n\nexport function createMcpServer(): McpServer {\n const server = new McpServer({ name: PKG_NAME, version: VERSION });\n server.registerTool('audit', {\n description: 'Audit a local directory or live URL for agent-native readiness.',\n inputSchema: { target: z.string() },\n }, async ({ target }) => ({ content: [{ type: 'text', text: JSON.stringify(await auditTarget(target), null, 2) }] }));\n server.registerTool('gen', {\n description: 'Generate an agent-native artifact as text.',\n inputSchema: { artifact: z.enum(artifacts), params: z.record(z.string(), z.unknown()).optional() },\n }, async ({ artifact, params }) => ({ content: [{ type: 'text', text: generate(artifact as GeneratedArtifact, (params ?? {}) as GenerateParams) }] }));\n return server;\n}\n\nexport async function startMcpServer(): Promise<void> {\n const server = createMcpServer();\n await server.connect(new StdioServerTransport());\n}\n\nif (import.meta.url === `file://${process.argv[1]}`) startMcpServer().catch(error => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n});\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { auditTarget, formatAuditReport } from './audit.js';\nimport { PKG_NAME, VERSION } from './constants.js';\nimport { initProject } from './commands/init.js';\nimport { generateArtifact, type GeneratedArtifact } from './commands/gen.js';\nimport type { GenerateParams } from './generators/index.js';\n\nconst program = new Command();\nprogram.name(PKG_NAME).version(VERSION).description('Audit and generate agent-native product surfaces.');\n\nprogram.command('audit [target]').description('Audit a local directory or live URL.').option('--json', 'print JSON instead of the report').action(async (target = '.', options: { json?: boolean }) => {\n const report = await auditTarget(target);\n process.stdout.write(options.json ? `${JSON.stringify(report, null, 2)}\\n` : `${formatAuditReport(report)}\\n`);\n});\n\nprogram.command('init').description('Write starter AGENTS.md and server.json into the current directory.').option('--force', 'overwrite existing files').action(async (options: { force?: boolean }) => {\n const result = await initProject({ directory: process.cwd(), force: options.force });\n process.stdout.write(`created ${result.created.length}, skipped ${result.skipped.length}\\n`);\n});\n\nprogram.command('gen <artifact>').description('Generate an agent-native artifact.').option('-o, --out <path>', 'write to a file instead of stdout').option('--name <name>').option('--description <description>').option('--repository <url>').option('--mcp-url <url>').option('--npm-package <name>').option('--price <price>').option('--price-currency <currency>').option('--framework <framework>', 'route framework, such as static or next', 'static').action(async (artifact: string, options: Record<string, string | undefined>) => {\n const offer = options.price === undefined && options.priceCurrency === undefined ? undefined : { price: options.price, priceCurrency: options.priceCurrency };\n const params = Object.fromEntries(Object.entries({ name: options.name, description: options.description, repository: options.repository, mcpUrl: options.mcpUrl, npmPackage: options.npmPackage, framework: options.framework, offer }).filter(([, value]) => value !== undefined));\n const content = await generateArtifact(artifact as GeneratedArtifact, process.cwd(), params as GenerateParams);\n if (options.out) { const { writeFile } = await import('node:fs/promises'); await writeFile(options.out, content, 'utf8'); }\n else process.stdout.write(content);\n});\n\nprogram.command('mcp').description('Run the MCP server over stdio.').action(async () => { const { startMcpServer } = await import('./mcp.js'); await startMcpServer(); });\nprogram.parseAsync().catch(error => { process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`); process.exitCode = 1; });\n","import { access, mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { defaultConfig } from '../config.js';\nimport { generate } from '../generators/index.js';\n\nexport interface InitOptions { directory: string; force?: boolean }\nexport interface InitResult { created: string[]; skipped: string[] }\n\nexport async function initProject(options: InitOptions): Promise<InitResult> {\n const root = path.resolve(options.directory);\n await mkdir(root, { recursive: true });\n const config = defaultConfig();\n const result: InitResult = { created: [], skipped: [] };\n for (const [name, content] of [['AGENTS.md', generate('agents-md', config)], ['server.json', generate('server-json', config)]] as const) {\n const file = path.join(root, name);\n try {\n await access(file);\n if (!options.force) { result.skipped.push(name); continue; }\n } catch { /* The file does not exist yet. */ }\n await writeFile(file, content, 'utf8');\n result.created.push(name);\n }\n return result;\n}\n","import { writeFile } from 'node:fs/promises';\nimport { defaultConfig } from '../config.js';\nimport { generate, type GenerateParams, type GeneratedArtifact } from '../generators/index.js';\nimport { loadAigentifyConfig } from './load-config.js';\n\nexport type { GeneratedArtifact } from '../generators/index.js';\n\nexport async function generateArtifact(artifact: GeneratedArtifact, directory = process.cwd(), params: GenerateParams = {}): Promise<string> {\n const config = (await loadAigentifyConfig(directory)) ?? defaultConfig();\n return generate(artifact, { ...config, ...params, offer: { ...(config.offer ?? {}), ...(params.offer ?? {}) } });\n}\n\nexport async function writeGeneratedArtifact(artifact: GeneratedArtifact, options: { directory?: string; output?: string; params?: GenerateParams } = {}): Promise<string> {\n const content = await generateArtifact(artifact, options.directory, options.params);\n if (options.output) await writeFile(options.output, content, 'utf8');\n return content;\n}\n","import path from 'node:path';\nimport { access } from 'node:fs/promises';\nimport { createJiti } from 'jiti';\nimport { CONFIG_FILENAME } from '../constants.js';\nimport { defineConfig, type AigentifyConfig } from '../config.js';\n\nexport async function findConfigFile(directory = process.cwd()): Promise<string | undefined> {\n const candidates = [CONFIG_FILENAME, CONFIG_FILENAME.replace(/\\.ts$/, '.js'), CONFIG_FILENAME.replace(/\\.ts$/, '.mjs')];\n for (const candidate of candidates) {\n const file = path.join(directory, candidate);\n try { await access(file); return file; } catch { /* Try the next supported extension. */ }\n }\n return undefined;\n}\n\nexport async function loadAigentifyConfig(directory = process.cwd()): Promise<AigentifyConfig | undefined> {\n const file = await findConfigFile(directory);\n if (!file) return undefined;\n const jiti = createJiti(import.meta.url);\n const module = (await jiti.import(file)) as { default?: AigentifyConfig; aigentifyConfig?: AigentifyConfig };\n const config = module.aigentifyConfig ?? module.default;\n if (!config) throw new Error(`${path.basename(file)} must export a default config or aigentifyConfig.`);\n return defineConfig(config);\n}\n"],"mappings":"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","names":["path","writeFile","path","access","writeFile","startMcpServer"]} | ||
| {"version":3,"sources":["../package.json","../src/constants.ts","../src/audit.ts","../src/config.ts","../src/generators/agents.ts","../src/generators/agents-route.ts","../src/generators/offer.ts","../src/generators/server.ts","../src/generators/index.ts","../src/mcp.ts","../src/cli.ts","../src/commands/init.ts","../src/commands/gen.ts","../src/commands/load-config.ts"],"sourcesContent":["{\n \"name\": \"aigentify\",\n \"version\": \"0.1.1\",\n \"mcpName\": \"io.github.pooriaarab/aigentify\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\"aigentify\": \"dist/cli.js\", \"aigentify-mcp\": \"dist/mcp.js\"},\n \"exports\": {\".\": {\"types\": \"./dist/index.d.ts\", \"import\": \"./dist/index.js\", \"require\": \"./dist/index.cjs\"}},\n \"files\": [\"dist\"],\n \"repository\": {\"type\": \"git\", \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"},\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\"agents\", \"agentification\", \"mcp\", \"ai\", \"json-ld\"],\n \"publishConfig\": {\"access\": \"public\"},\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"lint\": \"tsc --noEmit --pretty false\",\n \"typecheck\": \"tsc --noEmit\",\n \"verify\": \"npm run typecheck && npm run build && npm run test\",\n \"prepublishOnly\": \"npm run verify\"\n },\n \"engines\": {\"node\": \">=20\"},\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.17.5\",\n \"cheerio\": \"^1.1.2\",\n \"commander\": \"^14.0.0\",\n \"jiti\": \"^2.5.1\",\n \"zod\": \"^4.0.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.15.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.2.4\"\n }\n}\n","import pkg from '../package.json';\n\nexport const PKG_NAME = pkg.name;\nexport const VERSION = pkg.version;\nexport const CONFIG_FILENAME = `${PKG_NAME}.config.ts`;\nexport const SERVER_SCHEMA_URL = 'https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json';\n// Any dated MCP registry schema is valid; only the bare `.../server.json` (no `.schema`) 404s.\nexport const SERVER_SCHEMA_RE = /^https:\\/\\/static\\.modelcontextprotocol\\.io\\/schemas\\/\\d{4}-\\d{2}-\\d{2}\\/server\\.schema\\.json$/;\n","import { readFile, readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { SERVER_SCHEMA_URL, SERVER_SCHEMA_RE } from './constants.js';\n\nexport type AuditStatus = 'pass' | 'fail' | 'warn' | 'na';\nexport interface AuditCheck { id: string; status: AuditStatus; note: string; weight: number }\nexport interface AuditGap { id: string; note: string; fix: string }\nexport interface AuditReport { target: string; score: number; checks: AuditCheck[]; gaps: AuditGap[] }\nexport interface AuditOptions { fetch?: typeof globalThis.fetch }\n\ninterface Endpoint { status: number; contentType: string; text: string }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n honestText: string; hasMcp: boolean; networkFailure: boolean;\n}\n\nconst SKIPPED = new Set(['.git', 'node_modules', 'dist', 'coverage', '.next', '_reference_geoaeo']);\nconst WEIGHTS: Record<string, number> = {\n 'agents-md': 15, 'agents-md-public-safe': 10, 'server-json': 15, mcp: 15,\n 'offer-jsonld': 15, 'honest-offer': 10, 'llms-txt': 10, sitemap: 10,\n};\nconst FIXES: Record<string, string> = {\n 'agents-md': 'Add a public AGENTS.md at the target root or serve /agents.md as text/markdown.',\n 'agents-md-public-safe': 'Rewrite AGENTS.md as product guidance. Remove repository paths and contributor instructions.',\n 'server-json': `Add server.json and set \"$schema\" to \"${SERVER_SCHEMA_URL}\". Include a repository and a remotes or packages entry.`,\n mcp: 'Publish server.json, .mcp.json, or an MCP entry point.',\n 'offer-jsonld': 'Publish JSON-LD with @type Offer, or a SoftwareApplication with an offers property.',\n 'honest-offer': 'State the real price plainly. Remove scarcity, countdown, and urgency language.',\n 'llms-txt': 'Publish /llms.txt with a concise product description.',\n sitemap: 'Publish /sitemap.xml for URL discovery.',\n};\n\nfunction check(id: string, status: AuditStatus, note: string): AuditCheck { return { id, status, note, weight: WEIGHTS[id] }; }\n\nexport function scoreAuditChecks(checks: AuditCheck[]): number {\n const relevant = checks.filter(item => item.status !== 'na');\n const total = relevant.reduce((sum, item) => sum + item.weight, 0);\n if (!total) return 0;\n const earned = relevant.reduce((sum, item) => sum + (item.status === 'pass' ? item.weight : item.status === 'warn' ? item.weight / 2 : 0), 0);\n return Math.round((earned / total) * 100);\n}\n\nasync function walkFiles(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n if (entry.isDirectory() && !SKIPPED.has(entry.name)) files.push(...await walkFiles(path.join(directory, entry.name)));\n else if (entry.isFile()) files.push(path.join(directory, entry.name));\n }\n return files;\n}\n\nasync function readText(file: string | undefined): Promise<string> {\n if (!file) return '';\n try { return await readFile(file, 'utf8'); } catch { return ''; }\n}\n\nfunction findFile(files: string[], name: string): string | undefined {\n return files.find(file => {\n const normalized = file.replaceAll('\\\\', '/');\n return path.basename(normalized) === name || normalized.endsWith(`/${name}/route.ts`);\n });\n}\n\nfunction parseJson(text: string): Record<string, unknown> | undefined {\n try {\n const value: unknown = JSON.parse(text);\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n } catch { return undefined; }\n}\n\nfunction validServer(text: string): { valid: boolean; reason: string } {\n const value = parseJson(text);\n if (!value) return { valid: false, reason: 'server.json is not valid JSON.' };\n if (typeof value.$schema !== 'string' || !SERVER_SCHEMA_RE.test(value.$schema)) return { valid: false, reason: `server.json \"$schema\" must be a dated MCP registry schema like ${SERVER_SCHEMA_URL} (the bare .../server.json 404s).` };\n const missing = ['name', 'description', 'repository', 'version'].filter(key => !value[key]);\n if (missing.length) return { valid: false, reason: `server.json is missing: ${missing.join(', ')}.` };\n if (!Array.isArray(value.remotes) && !Array.isArray(value.packages)) return { valid: false, reason: 'server.json needs a remotes or packages entry.' };\n return { valid: true, reason: 'server.json has the required MCP registry fields.' };\n}\n\nfunction hasOffer(texts: string[]): boolean {\n return texts.some(text => /\"@type\"\\s*:\\s*\"Offer\"/i.test(text) || /\"@type\"\\s*:\\s*\"SoftwareApplication\"/i.test(text) && /\"offers\"\\s*:/.test(text));\n}\n\nfunction hasUrgency(text: string): boolean {\n return /limited time|act now|hurry|expires|only\\s+\\d+\\s+left|ends in|sign up now|countdown/i.test(text);\n}\n\nfunction publicSafe(text: string): boolean {\n return !(/\\bsrc\\//i.test(text) || /\\bapps\\//i.test(text) || /\\bpackages\\//i.test(text) || /\\b[\\w.-]+\\.ts\\b/i.test(text) || /npm run build/i.test(text) || /\\btsconfig\\b/i.test(text) || /\\bcontributors?\\b/i.test(text) || /^#+\\s*layout\\b/im.test(text));\n}\n\nfunction offerBlock(text: string): string {\n const match = /^#+\\s*Offer\\b/im.exec(text);\n if (!match || match.index === undefined) return '';\n const rest = text.slice(match.index);\n const nextHeading = /^#+\\s+/m.exec(rest.slice(match[0].length));\n return nextHeading?.index === undefined ? rest : rest.slice(0, match[0].length + nextHeading.index);\n}\n\nasync function directorySnapshot(directory: string): Promise<Snapshot> {\n const files = await walkFiles(directory);\n const agentsFile = findFile(files, 'AGENTS.md');\n const serverFile = findFile(files, 'server.json');\n const mcpFile = files.find(file => /(?:^|\\/)\\.mcp\\.json$/.test(file.replaceAll('\\\\', '/')));\n const packageFile = findFile(files, 'package.json');\n const packageText = await readText(packageFile);\n const hasMcpBin = /\"(?:aigentify|[^\"\\n]*mcp[^\"\\n]*)\"\\s*:/i.test(packageText);\n const agentsText = await readText(agentsFile);\n const offerTexts = [agentsText, ...await Promise.all(files.filter(file => /\\.(html?|json|jsonld|md|mdx|tsx|jsx|js|mjs|ts)$/.test(file)).map(readText))];\n const llmsFile = findFile(files, 'llms.txt');\n const sitemapFile = findFile(files, 'sitemap.xml');\n const offerFiles = files.filter(file => /\\.jsonld$|(?:^|\\/)offer[^/]*\\.(?:json|html?)$/i.test(file));\n const honestText = [offerBlock(agentsText), ...await Promise.all(offerFiles.map(readText))].join('\\n');\n return {\n agents: { status: agentsFile ? 200 : 404, contentType: 'text/markdown', text: agentsText },\n server: { status: serverFile ? 200 : 404, contentType: 'application/json', text: await readText(serverFile) },\n mcp: { status: mcpFile || serverFile || hasMcpBin ? 200 : 404, contentType: '', text: '' },\n home: { status: 200, contentType: 'text/plain', text: offerTexts.join('\\n') },\n llms: { status: llmsFile ? 200 : 404, contentType: 'text/plain', text: await readText(llmsFile) },\n sitemap: { status: sitemapFile ? 200 : 404, contentType: 'application/xml', text: await readText(sitemapFile) },\n honestText, hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), networkFailure: false,\n };\n}\n\nasync function fetchText(fetcher: typeof globalThis.fetch, url: string): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000) });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text() };\n } catch { return { status: 0, contentType: '', text: '' }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n const [agents, server, mcp, home, llms, sitemap] = await Promise.all([\n fetchText(fetcher, `${base}/agents.md`), fetchText(fetcher, `${base}/server.json`), fetchText(fetcher, `${base}/.well-known/mcp`),\n fetchText(fetcher, base), fetchText(fetcher, `${base}/llms.txt`), fetchText(fetcher, `${base}/sitemap.xml`),\n ]);\n const endpoints = [agents, server, mcp, home, llms, sitemap];\n return { agents, server, mcp, home, llms, sitemap, honestText: [home.text, offerBlock(agents.text)].join('\\n'), hasMcp: server.status >= 200 && server.status < 400 || mcp.status >= 200 && mcp.status < 400, networkFailure: endpoints.every(item => item.status === 0) };\n}\n\nfunction buildChecks(snapshot: Snapshot): AuditCheck[] {\n const agentsPresent = snapshot.agents.status === 200 && snapshot.agents.text.trim().length > 0 && /(?:text\\/(?:markdown|plain)|application\\/markdown)/i.test(snapshot.agents.contentType);\n const agentsStatus: AuditStatus = snapshot.agents.status === 0 ? 'warn' : agentsPresent ? 'pass' : 'fail';\n const publicStatus: AuditStatus = !agentsPresent ? (snapshot.agents.status === 0 ? 'warn' : 'na') : publicSafe(snapshot.agents.text) ? 'pass' : 'warn';\n const serverInfo = snapshot.server.status === 200 ? validServer(snapshot.server.text) : undefined;\n const serverStatus: AuditStatus = snapshot.server.status === 0 ? 'warn' : !snapshot.hasMcp ? 'na' : serverInfo?.valid ? 'pass' : 'fail';\n const mcpStatus: AuditStatus = snapshot.networkFailure ? 'warn' : snapshot.hasMcp ? 'pass' : 'fail';\n const offerTexts = [snapshot.home.text, snapshot.agents.text];\n const offerStatus: AuditStatus = snapshot.home.status === 0 ? 'warn' : hasOffer(offerTexts) ? 'pass' : 'fail';\n const honestStatus: AuditStatus = !hasOffer(offerTexts) && !agentsPresent ? (snapshot.home.status === 0 ? 'warn' : 'na') : hasUrgency(snapshot.honestText) ? 'warn' : 'pass';\n const llmsStatus: AuditStatus = snapshot.llms.status === 0 ? 'warn' : snapshot.llms.status >= 200 && snapshot.llms.status < 400 && snapshot.llms.text.trim() ? 'pass' : 'fail';\n const sitemapStatus: AuditStatus = snapshot.sitemap.status === 0 ? 'warn' : snapshot.sitemap.status >= 200 && snapshot.sitemap.status < 400 && snapshot.sitemap.text.trim() ? 'pass' : 'fail';\n return [\n check('agents-md', agentsStatus, agentsPresent ? 'AGENTS.md is available.' : snapshot.agents.status === 0 ? 'The AGENTS.md request failed.' : 'AGENTS.md is missing.'),\n check('agents-md-public-safe', publicStatus, publicStatus === 'pass' ? 'AGENTS.md describes the product as a public surface.' : publicStatus === 'na' ? 'No AGENTS.md is available to inspect.' : 'AGENTS.md contains repository-internal guidance.'),\n check('server-json', serverStatus, serverInfo?.valid ? serverInfo.reason : serverInfo?.reason ?? (!snapshot.hasMcp ? 'No MCP surface was detected.' : 'server.json is missing.')),\n check('mcp', mcpStatus, snapshot.networkFailure ? 'The MCP discovery request failed.' : snapshot.hasMcp ? 'An MCP surface is available.' : 'No MCP surface was found.'),\n check('offer-jsonld', offerStatus, offerStatus === 'pass' ? 'Offer JSON-LD is available.' : offerStatus === 'warn' ? 'The offer could not be checked.' : 'No Offer JSON-LD was found.'),\n check('honest-offer', honestStatus, honestStatus === 'pass' ? 'Offer language states the price without pressure.' : honestStatus === 'na' ? 'No offer or Offer block was found.' : 'Offer language contains scarcity, countdown, or urgency copy.'),\n check('llms-txt', llmsStatus, llmsStatus === 'pass' ? 'llms.txt is available.' : llmsStatus === 'warn' ? 'The llms.txt request failed.' : 'llms.txt is missing.'),\n check('sitemap', sitemapStatus, sitemapStatus === 'pass' ? 'sitemap.xml is available.' : sitemapStatus === 'warn' ? 'The sitemap request failed.' : 'sitemap.xml is missing.'),\n ];\n}\n\nexport async function auditTarget(target: string, options: AuditOptions = {}): Promise<AuditReport> {\n const targetStat = await stat(target).catch(() => undefined);\n const snapshot = targetStat?.isDirectory() ? await directorySnapshot(target) : await urlSnapshot(target, options.fetch ?? globalThis.fetch);\n const checks = buildChecks(snapshot);\n const gaps = checks.filter(item => item.status === 'fail' || item.status === 'warn').map(item => ({ id: item.id, note: item.note, fix: FIXES[item.id] }));\n return { target, score: scoreAuditChecks(checks), checks, gaps };\n}\n\nexport function formatAuditReport(report: AuditReport): string {\n const lines = [`${report.target}: ${report.score}/100`, ''];\n for (const item of report.checks) lines.push(`${item.status.toUpperCase().padEnd(4)} ${item.id}: ${item.note}`);\n lines.push('', 'Gaps:');\n if (!report.gaps.length) lines.push('None.');\n else report.gaps.forEach((gap, index) => lines.push(`${index + 1}. ${gap.id}: ${gap.fix}`));\n return lines.join('\\n');\n}\n","export interface OfferConfig {\n name?: string;\n description?: string;\n price?: string | number;\n priceCurrency?: string;\n}\n\nexport interface AigentifyConfig {\n name: string;\n description: string;\n repository: string;\n version?: string;\n mcpUrl?: string;\n npmPackage?: string;\n offer?: OfferConfig;\n}\n\nexport function defineConfig(config: AigentifyConfig): AigentifyConfig {\n return { ...config, repository: config.repository.replace(/\\/+$/, ''), version: config.version ?? '0.1.0' };\n}\n\nexport function defaultConfig(): AigentifyConfig {\n return defineConfig({\n name: 'Your product',\n description: 'A product with an agent-native interface.',\n repository: 'https://github.com/your-org/your-product',\n npmPackage: 'your-package',\n });\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsMd(config: AigentifyConfig): string {\n const packageName = config.npmPackage ?? '<NPM_PACKAGE>';\n const mcp = config.mcpUrl ?? `npx ${packageName}`;\n const offer = config.offer;\n const offerLine = offer?.price === undefined ? 'Price: <PRICE>' : `Price: ${offer.priceCurrency ?? 'USD'} ${offer.price}`;\n return `# ${config.name}\n\n## Mental model\n\n${config.name} is ${config.description}\n\nUse the product interface for product work. Use the agent interface for repeatable tasks that need structured results.\n\n## The faces\n\n- Product: ${config.repository}\n- MCP: ${mcp}\n- Package: ${packageName}\n\n## MCP tools\n\n| Tool | Input | Result |\n| --- | --- | --- |\n| audit | target | An agent-readiness report with a score and gaps. |\n| gen | artifact and params | A generated agent-native artifact. |\n\n## The loop\n\n1. Audit the target.\n2. Fix the highest-impact gap.\n3. Generate or publish the missing artifact.\n4. Audit again and keep the report with the release.\n\n## Rules\n\n- Treat the product description and prices as source facts.\n- Return structured data when a tool provides it.\n- Ask for missing information before making a high-impact change.\n- Keep public agent instructions about the product and its use.\n\n## Offer\n\n${offer?.description ?? '<OFFER_DESCRIPTION>'}\n\n${offerLine}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsRoute(config: AigentifyConfig, framework = 'static'): string {\n if (framework === 'next') {\n return `# Serve /agents.md from a Next route\n\nCopy AGENTS.md to a public directory, or add this force-static route:\n\n\\`\\`\\`ts\nimport { readFile } from 'node:fs/promises';\n\nexport const dynamic = 'force-static';\n\nexport async function GET() {\n const body = await readFile('AGENTS.md', 'utf8');\n return new Response(body, { headers: { 'content-type': 'text/markdown; charset=utf-8' } });\n}\n\\`\\`\\`\n\nProduct: ${config.name}\n`;\n }\n return `# Serve /agents.md\n\nCopy the generated AGENTS.md file to public/agents.md and serve it as a static text/markdown response.\n\nProduct: ${config.name}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateOffer(config: AigentifyConfig): string {\n const offer = config.offer ?? {};\n const data = {\n '@context': 'https://schema.org',\n '@type': 'SoftwareApplication',\n name: config.name,\n description: config.description,\n applicationCategory: 'DeveloperApplication',\n offers: [{\n '@type': 'Offer',\n name: offer.name ?? `${config.name} access`,\n ...(offer.description ? { description: offer.description } : {}),\n ...(offer.price === undefined ? {} : { price: String(offer.price) }),\n priceCurrency: offer.priceCurrency ?? 'USD',\n }],\n };\n return `${JSON.stringify(data, null, 2)}\\n`;\n}\n","import { SERVER_SCHEMA_URL } from '../constants.js';\nimport type { AigentifyConfig } from '../config.js';\n\nexport function generateServerJson(config: AigentifyConfig): string {\n const serverName = config.name.includes('/') ? config.name : `io.github.pooriaarab/${config.name.toLowerCase().replace(/[^a-z0-9._-]+/g, '-')}`;\n const server: Record<string, unknown> = {\n $schema: SERVER_SCHEMA_URL,\n name: serverName,\n description: config.description,\n repository: { url: config.repository, source: 'github' },\n version: config.version ?? '0.1.0',\n };\n if (config.mcpUrl) server.remotes = [{ type: 'streamable-http', url: config.mcpUrl }];\n else server.packages = [{ registryType: 'npm', registryBaseUrl: 'https://registry.npmjs.org', identifier: config.npmPackage ?? 'aigentify', version: config.version ?? '0.1.0', transport: { type: 'stdio' }, runtimeHint: 'npx', packageArguments: [{ type: 'positional', valueHint: 'subcommand', value: 'mcp' }] }];\n return `${JSON.stringify(server, null, 2)}\\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\nimport { defaultConfig, defineConfig } from '../config.js';\nimport { generateAgentsMd } from './agents.js';\nimport { generateAgentsRoute } from './agents-route.js';\nimport { generateOffer } from './offer.js';\nimport { generateServerJson } from './server.js';\nexport * from './agents.js';\nexport * from './agents-route.js';\nexport * from './offer.js';\nexport * from './server.js';\n\nexport type GeneratedArtifact = 'agents-md' | 'server-json' | 'offer' | 'agents-route';\nexport type GenerateParams = Partial<AigentifyConfig> & { framework?: string };\n\nfunction configFromParams(params: GenerateParams = {}): AigentifyConfig {\n const base = defaultConfig();\n return defineConfig({ ...base, ...params, offer: { ...(base.offer ?? {}), ...(params.offer ?? {}) } });\n}\n\nexport function generate(artifact: GeneratedArtifact, params: GenerateParams = {}): string {\n const config = configFromParams(params);\n if (artifact === 'agents-md') return generateAgentsMd(config);\n if (artifact === 'server-json') return generateServerJson(config);\n if (artifact === 'offer') return generateOffer(config);\n if (artifact === 'agents-route') return generateAgentsRoute(config, params.framework);\n throw new Error(`Unknown artifact: ${artifact}`);\n}\n","#!/usr/bin/env node\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { auditTarget } from './audit.js';\nimport { PKG_NAME, VERSION } from './constants.js';\nimport { generate, type GenerateParams, type GeneratedArtifact } from './generators/index.js';\n\nconst artifacts = ['agents-md', 'server-json', 'offer', 'agents-route'] as const;\n\nexport function createMcpServer(): McpServer {\n const server = new McpServer({ name: PKG_NAME, version: VERSION });\n server.registerTool('audit', {\n description: 'Audit a local directory or live URL for agent-native readiness.',\n inputSchema: { target: z.string() },\n }, async ({ target }) => ({ content: [{ type: 'text', text: JSON.stringify(await auditTarget(target), null, 2) }] }));\n server.registerTool('gen', {\n description: 'Generate an agent-native artifact as text.',\n inputSchema: { artifact: z.enum(artifacts), params: z.record(z.string(), z.unknown()).optional() },\n }, async ({ artifact, params }) => ({ content: [{ type: 'text', text: generate(artifact as GeneratedArtifact, (params ?? {}) as GenerateParams) }] }));\n return server;\n}\n\nexport async function startMcpServer(): Promise<void> {\n const server = createMcpServer();\n await server.connect(new StdioServerTransport());\n}\n\nif (import.meta.url === `file://${process.argv[1]}`) startMcpServer().catch(error => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n});\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { auditTarget, formatAuditReport } from './audit.js';\nimport { PKG_NAME, VERSION } from './constants.js';\nimport { initProject } from './commands/init.js';\nimport { generateArtifact, type GeneratedArtifact } from './commands/gen.js';\nimport type { GenerateParams } from './generators/index.js';\n\nconst program = new Command();\nprogram.name(PKG_NAME).version(VERSION).description('Audit and generate agent-native product surfaces.');\n\nprogram.command('audit [target]').description('Audit a local directory or live URL.').option('--json', 'print JSON instead of the report').action(async (target = '.', options: { json?: boolean }) => {\n const report = await auditTarget(target);\n process.stdout.write(options.json ? `${JSON.stringify(report, null, 2)}\\n` : `${formatAuditReport(report)}\\n`);\n});\n\nprogram.command('init').description('Write starter AGENTS.md and server.json into the current directory.').option('--force', 'overwrite existing files').action(async (options: { force?: boolean }) => {\n const result = await initProject({ directory: process.cwd(), force: options.force });\n process.stdout.write(`created ${result.created.length}, skipped ${result.skipped.length}\\n`);\n});\n\nprogram.command('gen <artifact>').description('Generate an agent-native artifact.').option('-o, --out <path>', 'write to a file instead of stdout').option('--name <name>').option('--description <description>').option('--repository <url>').option('--mcp-url <url>').option('--npm-package <name>').option('--price <price>').option('--price-currency <currency>').option('--framework <framework>', 'route framework, such as static or next', 'static').action(async (artifact: string, options: Record<string, string | undefined>) => {\n const offer = options.price === undefined && options.priceCurrency === undefined ? undefined : { price: options.price, priceCurrency: options.priceCurrency };\n const params = Object.fromEntries(Object.entries({ name: options.name, description: options.description, repository: options.repository, mcpUrl: options.mcpUrl, npmPackage: options.npmPackage, framework: options.framework, offer }).filter(([, value]) => value !== undefined));\n const content = await generateArtifact(artifact as GeneratedArtifact, process.cwd(), params as GenerateParams);\n if (options.out) { const { writeFile } = await import('node:fs/promises'); await writeFile(options.out, content, 'utf8'); }\n else process.stdout.write(content);\n});\n\nprogram.command('mcp').description('Run the MCP server over stdio.').action(async () => { const { startMcpServer } = await import('./mcp.js'); await startMcpServer(); });\nprogram.parseAsync().catch(error => { process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`); process.exitCode = 1; });\n","import { access, mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { defaultConfig } from '../config.js';\nimport { generate } from '../generators/index.js';\n\nexport interface InitOptions { directory: string; force?: boolean }\nexport interface InitResult { created: string[]; skipped: string[] }\n\nexport async function initProject(options: InitOptions): Promise<InitResult> {\n const root = path.resolve(options.directory);\n await mkdir(root, { recursive: true });\n const config = defaultConfig();\n const result: InitResult = { created: [], skipped: [] };\n for (const [name, content] of [['AGENTS.md', generate('agents-md', config)], ['server.json', generate('server-json', config)]] as const) {\n const file = path.join(root, name);\n try {\n await access(file);\n if (!options.force) { result.skipped.push(name); continue; }\n } catch { /* The file does not exist yet. */ }\n await writeFile(file, content, 'utf8');\n result.created.push(name);\n }\n return result;\n}\n","import { writeFile } from 'node:fs/promises';\nimport { defaultConfig } from '../config.js';\nimport { generate, type GenerateParams, type GeneratedArtifact } from '../generators/index.js';\nimport { loadAigentifyConfig } from './load-config.js';\n\nexport type { GeneratedArtifact } from '../generators/index.js';\n\nexport async function generateArtifact(artifact: GeneratedArtifact, directory = process.cwd(), params: GenerateParams = {}): Promise<string> {\n const config = (await loadAigentifyConfig(directory)) ?? defaultConfig();\n return generate(artifact, { ...config, ...params, offer: { ...(config.offer ?? {}), ...(params.offer ?? {}) } });\n}\n\nexport async function writeGeneratedArtifact(artifact: GeneratedArtifact, options: { directory?: string; output?: string; params?: GenerateParams } = {}): Promise<string> {\n const content = await generateArtifact(artifact, options.directory, options.params);\n if (options.output) await writeFile(options.output, content, 'utf8');\n return content;\n}\n","import path from 'node:path';\nimport { access } from 'node:fs/promises';\nimport { createJiti } from 'jiti';\nimport { CONFIG_FILENAME } from '../constants.js';\nimport { defineConfig, type AigentifyConfig } from '../config.js';\n\nexport async function findConfigFile(directory = process.cwd()): Promise<string | undefined> {\n const candidates = [CONFIG_FILENAME, CONFIG_FILENAME.replace(/\\.ts$/, '.js'), CONFIG_FILENAME.replace(/\\.ts$/, '.mjs')];\n for (const candidate of candidates) {\n const file = path.join(directory, candidate);\n try { await access(file); return file; } catch { /* Try the next supported extension. */ }\n }\n return undefined;\n}\n\nexport async function loadAigentifyConfig(directory = process.cwd()): Promise<AigentifyConfig | undefined> {\n const file = await findConfigFile(directory);\n if (!file) return undefined;\n const jiti = createJiti(import.meta.url);\n const module = (await jiti.import(file)) as { default?: AigentifyConfig; aigentifyConfig?: AigentifyConfig };\n const config = module.aigentifyConfig ?? module.default;\n if (!config) throw new Error(`${path.basename(file)} must export a default config or aigentifyConfig.`);\n return defineConfig(config);\n}\n"],"mappings":"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","names":["path","writeFile","path","access","writeFile","startMcpServer"]} |
+8
-4
@@ -35,2 +35,3 @@ "use strict"; | ||
| PKG_NAME: () => PKG_NAME, | ||
| SERVER_SCHEMA_RE: () => SERVER_SCHEMA_RE, | ||
| SERVER_SCHEMA_URL: () => SERVER_SCHEMA_URL, | ||
@@ -58,3 +59,4 @@ VERSION: () => VERSION, | ||
| name: "aigentify", | ||
| version: "0.1.0", | ||
| version: "0.1.1", | ||
| mcpName: "io.github.pooriaarab/aigentify", | ||
| description: "Audit and generate agent-native product surfaces", | ||
@@ -99,3 +101,4 @@ type: "module", | ||
| var CONFIG_FILENAME = `${PKG_NAME}.config.ts`; | ||
| var SERVER_SCHEMA_URL = "https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json"; | ||
| var SERVER_SCHEMA_URL = "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json"; | ||
| var SERVER_SCHEMA_RE = /^https:\/\/static\.modelcontextprotocol\.io\/schemas\/\d{4}-\d{2}-\d{2}\/server\.schema\.json$/; | ||
@@ -168,3 +171,3 @@ // src/audit.ts | ||
| if (!value) return { valid: false, reason: "server.json is not valid JSON." }; | ||
| if (value.$schema !== SERVER_SCHEMA_URL) return { valid: false, reason: `server.json must use the exact schema URL ${SERVER_SCHEMA_URL}.` }; | ||
| if (typeof value.$schema !== "string" || !SERVER_SCHEMA_RE.test(value.$schema)) return { valid: false, reason: `server.json "$schema" must be a dated MCP registry schema like ${SERVER_SCHEMA_URL} (the bare .../server.json 404s).` }; | ||
| const missing = ["name", "description", "repository", "version"].filter((key) => !value[key]); | ||
@@ -400,3 +403,3 @@ if (missing.length) return { valid: false, reason: `server.json is missing: ${missing.join(", ")}.` }; | ||
| if (config.mcpUrl) server.remotes = [{ type: "streamable-http", url: config.mcpUrl }]; | ||
| else server.packages = [{ registry_type: "npm", identifier: config.npmPackage ?? "aigentify", version: config.version ?? "0.1.0", runtime_hint: "npx", transport: { type: "stdio" } }]; | ||
| else server.packages = [{ registryType: "npm", registryBaseUrl: "https://registry.npmjs.org", identifier: config.npmPackage ?? "aigentify", version: config.version ?? "0.1.0", transport: { type: "stdio" }, runtimeHint: "npx", packageArguments: [{ type: "positional", valueHint: "subcommand", value: "mcp" }] }]; | ||
| return `${JSON.stringify(server, null, 2)} | ||
@@ -423,2 +426,3 @@ `; | ||
| PKG_NAME, | ||
| SERVER_SCHEMA_RE, | ||
| SERVER_SCHEMA_URL, | ||
@@ -425,0 +429,0 @@ VERSION, |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/index.ts","../src/audit.ts","../package.json","../src/constants.ts","../src/config.ts","../src/generators/agents.ts","../src/generators/agents-route.ts","../src/generators/offer.ts","../src/generators/server.ts","../src/generators/index.ts"],"sourcesContent":["export * from './audit.js';\nexport * from './config.js';\nexport * from './constants.js';\nexport * from './generators/index.js';\n","import { readFile, readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { SERVER_SCHEMA_URL } from './constants.js';\n\nexport type AuditStatus = 'pass' | 'fail' | 'warn' | 'na';\nexport interface AuditCheck { id: string; status: AuditStatus; note: string; weight: number }\nexport interface AuditGap { id: string; note: string; fix: string }\nexport interface AuditReport { target: string; score: number; checks: AuditCheck[]; gaps: AuditGap[] }\nexport interface AuditOptions { fetch?: typeof globalThis.fetch }\n\ninterface Endpoint { status: number; contentType: string; text: string }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n honestText: string; hasMcp: boolean; networkFailure: boolean;\n}\n\nconst SKIPPED = new Set(['.git', 'node_modules', 'dist', 'coverage', '.next', '_reference_geoaeo']);\nconst WEIGHTS: Record<string, number> = {\n 'agents-md': 15, 'agents-md-public-safe': 10, 'server-json': 15, mcp: 15,\n 'offer-jsonld': 15, 'honest-offer': 10, 'llms-txt': 10, sitemap: 10,\n};\nconst FIXES: Record<string, string> = {\n 'agents-md': 'Add a public AGENTS.md at the target root or serve /agents.md as text/markdown.',\n 'agents-md-public-safe': 'Rewrite AGENTS.md as product guidance. Remove repository paths and contributor instructions.',\n 'server-json': `Add server.json and set \"$schema\" to \"${SERVER_SCHEMA_URL}\". Include a repository and a remotes or packages entry.`,\n mcp: 'Publish server.json, .mcp.json, or an MCP entry point.',\n 'offer-jsonld': 'Publish JSON-LD with @type Offer, or a SoftwareApplication with an offers property.',\n 'honest-offer': 'State the real price plainly. Remove scarcity, countdown, and urgency language.',\n 'llms-txt': 'Publish /llms.txt with a concise product description.',\n sitemap: 'Publish /sitemap.xml for URL discovery.',\n};\n\nfunction check(id: string, status: AuditStatus, note: string): AuditCheck { return { id, status, note, weight: WEIGHTS[id] }; }\n\nexport function scoreAuditChecks(checks: AuditCheck[]): number {\n const relevant = checks.filter(item => item.status !== 'na');\n const total = relevant.reduce((sum, item) => sum + item.weight, 0);\n if (!total) return 0;\n const earned = relevant.reduce((sum, item) => sum + (item.status === 'pass' ? item.weight : item.status === 'warn' ? item.weight / 2 : 0), 0);\n return Math.round((earned / total) * 100);\n}\n\nasync function walkFiles(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n if (entry.isDirectory() && !SKIPPED.has(entry.name)) files.push(...await walkFiles(path.join(directory, entry.name)));\n else if (entry.isFile()) files.push(path.join(directory, entry.name));\n }\n return files;\n}\n\nasync function readText(file: string | undefined): Promise<string> {\n if (!file) return '';\n try { return await readFile(file, 'utf8'); } catch { return ''; }\n}\n\nfunction findFile(files: string[], name: string): string | undefined {\n return files.find(file => {\n const normalized = file.replaceAll('\\\\', '/');\n return path.basename(normalized) === name || normalized.endsWith(`/${name}/route.ts`);\n });\n}\n\nfunction parseJson(text: string): Record<string, unknown> | undefined {\n try {\n const value: unknown = JSON.parse(text);\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n } catch { return undefined; }\n}\n\nfunction validServer(text: string): { valid: boolean; reason: string } {\n const value = parseJson(text);\n if (!value) return { valid: false, reason: 'server.json is not valid JSON.' };\n if (value.$schema !== SERVER_SCHEMA_URL) return { valid: false, reason: `server.json must use the exact schema URL ${SERVER_SCHEMA_URL}.` };\n const missing = ['name', 'description', 'repository', 'version'].filter(key => !value[key]);\n if (missing.length) return { valid: false, reason: `server.json is missing: ${missing.join(', ')}.` };\n if (!Array.isArray(value.remotes) && !Array.isArray(value.packages)) return { valid: false, reason: 'server.json needs a remotes or packages entry.' };\n return { valid: true, reason: 'server.json has the required MCP registry fields.' };\n}\n\nfunction hasOffer(texts: string[]): boolean {\n return texts.some(text => /\"@type\"\\s*:\\s*\"Offer\"/i.test(text) || /\"@type\"\\s*:\\s*\"SoftwareApplication\"/i.test(text) && /\"offers\"\\s*:/.test(text));\n}\n\nfunction hasUrgency(text: string): boolean {\n return /limited time|act now|hurry|expires|only\\s+\\d+\\s+left|ends in|sign up now|countdown/i.test(text);\n}\n\nfunction publicSafe(text: string): boolean {\n return !(/\\bsrc\\//i.test(text) || /\\bapps\\//i.test(text) || /\\bpackages\\//i.test(text) || /\\b[\\w.-]+\\.ts\\b/i.test(text) || /npm run build/i.test(text) || /\\btsconfig\\b/i.test(text) || /\\bcontributors?\\b/i.test(text) || /^#+\\s*layout\\b/im.test(text));\n}\n\nfunction offerBlock(text: string): string {\n const match = /^#+\\s*Offer\\b/im.exec(text);\n if (!match || match.index === undefined) return '';\n const rest = text.slice(match.index);\n const nextHeading = /^#+\\s+/m.exec(rest.slice(match[0].length));\n return nextHeading?.index === undefined ? rest : rest.slice(0, match[0].length + nextHeading.index);\n}\n\nasync function directorySnapshot(directory: string): Promise<Snapshot> {\n const files = await walkFiles(directory);\n const agentsFile = findFile(files, 'AGENTS.md');\n const serverFile = findFile(files, 'server.json');\n const mcpFile = files.find(file => /(?:^|\\/)\\.mcp\\.json$/.test(file.replaceAll('\\\\', '/')));\n const packageFile = findFile(files, 'package.json');\n const packageText = await readText(packageFile);\n const hasMcpBin = /\"(?:aigentify|[^\"\\n]*mcp[^\"\\n]*)\"\\s*:/i.test(packageText);\n const agentsText = await readText(agentsFile);\n const offerTexts = [agentsText, ...await Promise.all(files.filter(file => /\\.(html?|json|jsonld|md|mdx|tsx|jsx|js|mjs|ts)$/.test(file)).map(readText))];\n const llmsFile = findFile(files, 'llms.txt');\n const sitemapFile = findFile(files, 'sitemap.xml');\n const offerFiles = files.filter(file => /\\.jsonld$|(?:^|\\/)offer[^/]*\\.(?:json|html?)$/i.test(file));\n const honestText = [offerBlock(agentsText), ...await Promise.all(offerFiles.map(readText))].join('\\n');\n return {\n agents: { status: agentsFile ? 200 : 404, contentType: 'text/markdown', text: agentsText },\n server: { status: serverFile ? 200 : 404, contentType: 'application/json', text: await readText(serverFile) },\n mcp: { status: mcpFile || serverFile || hasMcpBin ? 200 : 404, contentType: '', text: '' },\n home: { status: 200, contentType: 'text/plain', text: offerTexts.join('\\n') },\n llms: { status: llmsFile ? 200 : 404, contentType: 'text/plain', text: await readText(llmsFile) },\n sitemap: { status: sitemapFile ? 200 : 404, contentType: 'application/xml', text: await readText(sitemapFile) },\n honestText, hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), networkFailure: false,\n };\n}\n\nasync function fetchText(fetcher: typeof globalThis.fetch, url: string): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000) });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text() };\n } catch { return { status: 0, contentType: '', text: '' }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n const [agents, server, mcp, home, llms, sitemap] = await Promise.all([\n fetchText(fetcher, `${base}/agents.md`), fetchText(fetcher, `${base}/server.json`), fetchText(fetcher, `${base}/.well-known/mcp`),\n fetchText(fetcher, base), fetchText(fetcher, `${base}/llms.txt`), fetchText(fetcher, `${base}/sitemap.xml`),\n ]);\n const endpoints = [agents, server, mcp, home, llms, sitemap];\n return { agents, server, mcp, home, llms, sitemap, honestText: [home.text, offerBlock(agents.text)].join('\\n'), hasMcp: server.status >= 200 && server.status < 400 || mcp.status >= 200 && mcp.status < 400, networkFailure: endpoints.every(item => item.status === 0) };\n}\n\nfunction buildChecks(snapshot: Snapshot): AuditCheck[] {\n const agentsPresent = snapshot.agents.status === 200 && snapshot.agents.text.trim().length > 0 && /(?:text\\/(?:markdown|plain)|application\\/markdown)/i.test(snapshot.agents.contentType);\n const agentsStatus: AuditStatus = snapshot.agents.status === 0 ? 'warn' : agentsPresent ? 'pass' : 'fail';\n const publicStatus: AuditStatus = !agentsPresent ? (snapshot.agents.status === 0 ? 'warn' : 'na') : publicSafe(snapshot.agents.text) ? 'pass' : 'warn';\n const serverInfo = snapshot.server.status === 200 ? validServer(snapshot.server.text) : undefined;\n const serverStatus: AuditStatus = snapshot.server.status === 0 ? 'warn' : !snapshot.hasMcp ? 'na' : serverInfo?.valid ? 'pass' : 'fail';\n const mcpStatus: AuditStatus = snapshot.networkFailure ? 'warn' : snapshot.hasMcp ? 'pass' : 'fail';\n const offerTexts = [snapshot.home.text, snapshot.agents.text];\n const offerStatus: AuditStatus = snapshot.home.status === 0 ? 'warn' : hasOffer(offerTexts) ? 'pass' : 'fail';\n const honestStatus: AuditStatus = !hasOffer(offerTexts) && !agentsPresent ? (snapshot.home.status === 0 ? 'warn' : 'na') : hasUrgency(snapshot.honestText) ? 'warn' : 'pass';\n const llmsStatus: AuditStatus = snapshot.llms.status === 0 ? 'warn' : snapshot.llms.status >= 200 && snapshot.llms.status < 400 && snapshot.llms.text.trim() ? 'pass' : 'fail';\n const sitemapStatus: AuditStatus = snapshot.sitemap.status === 0 ? 'warn' : snapshot.sitemap.status >= 200 && snapshot.sitemap.status < 400 && snapshot.sitemap.text.trim() ? 'pass' : 'fail';\n return [\n check('agents-md', agentsStatus, agentsPresent ? 'AGENTS.md is available.' : snapshot.agents.status === 0 ? 'The AGENTS.md request failed.' : 'AGENTS.md is missing.'),\n check('agents-md-public-safe', publicStatus, publicStatus === 'pass' ? 'AGENTS.md describes the product as a public surface.' : publicStatus === 'na' ? 'No AGENTS.md is available to inspect.' : 'AGENTS.md contains repository-internal guidance.'),\n check('server-json', serverStatus, serverInfo?.valid ? serverInfo.reason : serverInfo?.reason ?? (!snapshot.hasMcp ? 'No MCP surface was detected.' : 'server.json is missing.')),\n check('mcp', mcpStatus, snapshot.networkFailure ? 'The MCP discovery request failed.' : snapshot.hasMcp ? 'An MCP surface is available.' : 'No MCP surface was found.'),\n check('offer-jsonld', offerStatus, offerStatus === 'pass' ? 'Offer JSON-LD is available.' : offerStatus === 'warn' ? 'The offer could not be checked.' : 'No Offer JSON-LD was found.'),\n check('honest-offer', honestStatus, honestStatus === 'pass' ? 'Offer language states the price without pressure.' : honestStatus === 'na' ? 'No offer or Offer block was found.' : 'Offer language contains scarcity, countdown, or urgency copy.'),\n check('llms-txt', llmsStatus, llmsStatus === 'pass' ? 'llms.txt is available.' : llmsStatus === 'warn' ? 'The llms.txt request failed.' : 'llms.txt is missing.'),\n check('sitemap', sitemapStatus, sitemapStatus === 'pass' ? 'sitemap.xml is available.' : sitemapStatus === 'warn' ? 'The sitemap request failed.' : 'sitemap.xml is missing.'),\n ];\n}\n\nexport async function auditTarget(target: string, options: AuditOptions = {}): Promise<AuditReport> {\n const targetStat = await stat(target).catch(() => undefined);\n const snapshot = targetStat?.isDirectory() ? await directorySnapshot(target) : await urlSnapshot(target, options.fetch ?? globalThis.fetch);\n const checks = buildChecks(snapshot);\n const gaps = checks.filter(item => item.status === 'fail' || item.status === 'warn').map(item => ({ id: item.id, note: item.note, fix: FIXES[item.id] }));\n return { target, score: scoreAuditChecks(checks), checks, gaps };\n}\n\nexport function formatAuditReport(report: AuditReport): string {\n const lines = [`${report.target}: ${report.score}/100`, ''];\n for (const item of report.checks) lines.push(`${item.status.toUpperCase().padEnd(4)} ${item.id}: ${item.note}`);\n lines.push('', 'Gaps:');\n if (!report.gaps.length) lines.push('None.');\n else report.gaps.forEach((gap, index) => lines.push(`${index + 1}. ${gap.id}: ${gap.fix}`));\n return lines.join('\\n');\n}\n","{\n \"name\": \"aigentify\",\n \"version\": \"0.1.0\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\"aigentify\": \"dist/cli.js\", \"aigentify-mcp\": \"dist/mcp.js\"},\n \"exports\": {\".\": {\"types\": \"./dist/index.d.ts\", \"import\": \"./dist/index.js\", \"require\": \"./dist/index.cjs\"}},\n \"files\": [\"dist\"],\n \"repository\": {\"type\": \"git\", \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"},\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\"agents\", \"agentification\", \"mcp\", \"ai\", \"json-ld\"],\n \"publishConfig\": {\"access\": \"public\"},\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"lint\": \"tsc --noEmit --pretty false\",\n \"typecheck\": \"tsc --noEmit\",\n \"verify\": \"npm run typecheck && npm run build && npm run test\",\n \"prepublishOnly\": \"npm run verify\"\n },\n \"engines\": {\"node\": \">=20\"},\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.17.5\",\n \"cheerio\": \"^1.1.2\",\n \"commander\": \"^14.0.0\",\n \"jiti\": \"^2.5.1\",\n \"zod\": \"^4.0.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.15.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.2.4\"\n }\n}\n","import pkg from '../package.json';\n\nexport const PKG_NAME = pkg.name;\nexport const VERSION = pkg.version;\nexport const CONFIG_FILENAME = `${PKG_NAME}.config.ts`;\nexport const SERVER_SCHEMA_URL = 'https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json';\n","export interface OfferConfig {\n name?: string;\n description?: string;\n price?: string | number;\n priceCurrency?: string;\n}\n\nexport interface AigentifyConfig {\n name: string;\n description: string;\n repository: string;\n version?: string;\n mcpUrl?: string;\n npmPackage?: string;\n offer?: OfferConfig;\n}\n\nexport function defineConfig(config: AigentifyConfig): AigentifyConfig {\n return { ...config, repository: config.repository.replace(/\\/+$/, ''), version: config.version ?? '0.1.0' };\n}\n\nexport function defaultConfig(): AigentifyConfig {\n return defineConfig({\n name: 'Your product',\n description: 'A product with an agent-native interface.',\n repository: 'https://github.com/your-org/your-product',\n npmPackage: 'your-package',\n });\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsMd(config: AigentifyConfig): string {\n const packageName = config.npmPackage ?? '<NPM_PACKAGE>';\n const mcp = config.mcpUrl ?? `npx ${packageName}`;\n const offer = config.offer;\n const offerLine = offer?.price === undefined ? 'Price: <PRICE>' : `Price: ${offer.priceCurrency ?? 'USD'} ${offer.price}`;\n return `# ${config.name}\n\n## Mental model\n\n${config.name} is ${config.description}\n\nUse the product interface for product work. Use the agent interface for repeatable tasks that need structured results.\n\n## The faces\n\n- Product: ${config.repository}\n- MCP: ${mcp}\n- Package: ${packageName}\n\n## MCP tools\n\n| Tool | Input | Result |\n| --- | --- | --- |\n| audit | target | An agent-readiness report with a score and gaps. |\n| gen | artifact and params | A generated agent-native artifact. |\n\n## The loop\n\n1. Audit the target.\n2. Fix the highest-impact gap.\n3. Generate or publish the missing artifact.\n4. Audit again and keep the report with the release.\n\n## Rules\n\n- Treat the product description and prices as source facts.\n- Return structured data when a tool provides it.\n- Ask for missing information before making a high-impact change.\n- Keep public agent instructions about the product and its use.\n\n## Offer\n\n${offer?.description ?? '<OFFER_DESCRIPTION>'}\n\n${offerLine}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsRoute(config: AigentifyConfig, framework = 'static'): string {\n if (framework === 'next') {\n return `# Serve /agents.md from a Next route\n\nCopy AGENTS.md to a public directory, or add this force-static route:\n\n\\`\\`\\`ts\nimport { readFile } from 'node:fs/promises';\n\nexport const dynamic = 'force-static';\n\nexport async function GET() {\n const body = await readFile('AGENTS.md', 'utf8');\n return new Response(body, { headers: { 'content-type': 'text/markdown; charset=utf-8' } });\n}\n\\`\\`\\`\n\nProduct: ${config.name}\n`;\n }\n return `# Serve /agents.md\n\nCopy the generated AGENTS.md file to public/agents.md and serve it as a static text/markdown response.\n\nProduct: ${config.name}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateOffer(config: AigentifyConfig): string {\n const offer = config.offer ?? {};\n const data = {\n '@context': 'https://schema.org',\n '@type': 'SoftwareApplication',\n name: config.name,\n description: config.description,\n applicationCategory: 'DeveloperApplication',\n offers: [{\n '@type': 'Offer',\n name: offer.name ?? `${config.name} access`,\n ...(offer.description ? { description: offer.description } : {}),\n ...(offer.price === undefined ? {} : { price: String(offer.price) }),\n priceCurrency: offer.priceCurrency ?? 'USD',\n }],\n };\n return `${JSON.stringify(data, null, 2)}\\n`;\n}\n","import { SERVER_SCHEMA_URL } from '../constants.js';\nimport type { AigentifyConfig } from '../config.js';\n\nexport function generateServerJson(config: AigentifyConfig): string {\n const serverName = config.name.includes('/') ? config.name : `io.github.pooriaarab/${config.name.toLowerCase().replace(/[^a-z0-9._-]+/g, '-')}`;\n const server: Record<string, unknown> = {\n $schema: SERVER_SCHEMA_URL,\n name: serverName,\n description: config.description,\n repository: { url: config.repository, source: 'github' },\n version: config.version ?? '0.1.0',\n };\n if (config.mcpUrl) server.remotes = [{ type: 'streamable-http', url: config.mcpUrl }];\n else server.packages = [{ registry_type: 'npm', identifier: config.npmPackage ?? 'aigentify', version: config.version ?? '0.1.0', runtime_hint: 'npx', transport: { type: 'stdio' } }];\n return `${JSON.stringify(server, null, 2)}\\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\nimport { defaultConfig, defineConfig } from '../config.js';\nimport { generateAgentsMd } from './agents.js';\nimport { generateAgentsRoute } from './agents-route.js';\nimport { generateOffer } from './offer.js';\nimport { generateServerJson } from './server.js';\nexport * from './agents.js';\nexport * from './agents-route.js';\nexport * from './offer.js';\nexport * from './server.js';\n\nexport type GeneratedArtifact = 'agents-md' | 'server-json' | 'offer' | 'agents-route';\nexport type GenerateParams = Partial<AigentifyConfig> & { framework?: string };\n\nfunction configFromParams(params: GenerateParams = {}): AigentifyConfig {\n const base = defaultConfig();\n return defineConfig({ ...base, ...params, offer: { ...(base.offer ?? {}), ...(params.offer ?? {}) } });\n}\n\nexport function generate(artifact: GeneratedArtifact, params: GenerateParams = {}): string {\n const config = configFromParams(params);\n if (artifact === 'agents-md') return generateAgentsMd(config);\n if (artifact === 'server-json') return generateServerJson(config);\n if (artifact === 'offer') return generateOffer(config);\n if (artifact === 'agents-route') return generateAgentsRoute(config, params.framework);\n throw new Error(`Unknown artifact: ${artifact}`);\n}\n"],"mappings":"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","names":["path"]} | ||
| {"version":3,"sources":["../src/index.ts","../src/audit.ts","../package.json","../src/constants.ts","../src/config.ts","../src/generators/agents.ts","../src/generators/agents-route.ts","../src/generators/offer.ts","../src/generators/server.ts","../src/generators/index.ts"],"sourcesContent":["export * from './audit.js';\nexport * from './config.js';\nexport * from './constants.js';\nexport * from './generators/index.js';\n","import { readFile, readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { SERVER_SCHEMA_URL, SERVER_SCHEMA_RE } from './constants.js';\n\nexport type AuditStatus = 'pass' | 'fail' | 'warn' | 'na';\nexport interface AuditCheck { id: string; status: AuditStatus; note: string; weight: number }\nexport interface AuditGap { id: string; note: string; fix: string }\nexport interface AuditReport { target: string; score: number; checks: AuditCheck[]; gaps: AuditGap[] }\nexport interface AuditOptions { fetch?: typeof globalThis.fetch }\n\ninterface Endpoint { status: number; contentType: string; text: string }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n honestText: string; hasMcp: boolean; networkFailure: boolean;\n}\n\nconst SKIPPED = new Set(['.git', 'node_modules', 'dist', 'coverage', '.next', '_reference_geoaeo']);\nconst WEIGHTS: Record<string, number> = {\n 'agents-md': 15, 'agents-md-public-safe': 10, 'server-json': 15, mcp: 15,\n 'offer-jsonld': 15, 'honest-offer': 10, 'llms-txt': 10, sitemap: 10,\n};\nconst FIXES: Record<string, string> = {\n 'agents-md': 'Add a public AGENTS.md at the target root or serve /agents.md as text/markdown.',\n 'agents-md-public-safe': 'Rewrite AGENTS.md as product guidance. Remove repository paths and contributor instructions.',\n 'server-json': `Add server.json and set \"$schema\" to \"${SERVER_SCHEMA_URL}\". Include a repository and a remotes or packages entry.`,\n mcp: 'Publish server.json, .mcp.json, or an MCP entry point.',\n 'offer-jsonld': 'Publish JSON-LD with @type Offer, or a SoftwareApplication with an offers property.',\n 'honest-offer': 'State the real price plainly. Remove scarcity, countdown, and urgency language.',\n 'llms-txt': 'Publish /llms.txt with a concise product description.',\n sitemap: 'Publish /sitemap.xml for URL discovery.',\n};\n\nfunction check(id: string, status: AuditStatus, note: string): AuditCheck { return { id, status, note, weight: WEIGHTS[id] }; }\n\nexport function scoreAuditChecks(checks: AuditCheck[]): number {\n const relevant = checks.filter(item => item.status !== 'na');\n const total = relevant.reduce((sum, item) => sum + item.weight, 0);\n if (!total) return 0;\n const earned = relevant.reduce((sum, item) => sum + (item.status === 'pass' ? item.weight : item.status === 'warn' ? item.weight / 2 : 0), 0);\n return Math.round((earned / total) * 100);\n}\n\nasync function walkFiles(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n if (entry.isDirectory() && !SKIPPED.has(entry.name)) files.push(...await walkFiles(path.join(directory, entry.name)));\n else if (entry.isFile()) files.push(path.join(directory, entry.name));\n }\n return files;\n}\n\nasync function readText(file: string | undefined): Promise<string> {\n if (!file) return '';\n try { return await readFile(file, 'utf8'); } catch { return ''; }\n}\n\nfunction findFile(files: string[], name: string): string | undefined {\n return files.find(file => {\n const normalized = file.replaceAll('\\\\', '/');\n return path.basename(normalized) === name || normalized.endsWith(`/${name}/route.ts`);\n });\n}\n\nfunction parseJson(text: string): Record<string, unknown> | undefined {\n try {\n const value: unknown = JSON.parse(text);\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n } catch { return undefined; }\n}\n\nfunction validServer(text: string): { valid: boolean; reason: string } {\n const value = parseJson(text);\n if (!value) return { valid: false, reason: 'server.json is not valid JSON.' };\n if (typeof value.$schema !== 'string' || !SERVER_SCHEMA_RE.test(value.$schema)) return { valid: false, reason: `server.json \"$schema\" must be a dated MCP registry schema like ${SERVER_SCHEMA_URL} (the bare .../server.json 404s).` };\n const missing = ['name', 'description', 'repository', 'version'].filter(key => !value[key]);\n if (missing.length) return { valid: false, reason: `server.json is missing: ${missing.join(', ')}.` };\n if (!Array.isArray(value.remotes) && !Array.isArray(value.packages)) return { valid: false, reason: 'server.json needs a remotes or packages entry.' };\n return { valid: true, reason: 'server.json has the required MCP registry fields.' };\n}\n\nfunction hasOffer(texts: string[]): boolean {\n return texts.some(text => /\"@type\"\\s*:\\s*\"Offer\"/i.test(text) || /\"@type\"\\s*:\\s*\"SoftwareApplication\"/i.test(text) && /\"offers\"\\s*:/.test(text));\n}\n\nfunction hasUrgency(text: string): boolean {\n return /limited time|act now|hurry|expires|only\\s+\\d+\\s+left|ends in|sign up now|countdown/i.test(text);\n}\n\nfunction publicSafe(text: string): boolean {\n return !(/\\bsrc\\//i.test(text) || /\\bapps\\//i.test(text) || /\\bpackages\\//i.test(text) || /\\b[\\w.-]+\\.ts\\b/i.test(text) || /npm run build/i.test(text) || /\\btsconfig\\b/i.test(text) || /\\bcontributors?\\b/i.test(text) || /^#+\\s*layout\\b/im.test(text));\n}\n\nfunction offerBlock(text: string): string {\n const match = /^#+\\s*Offer\\b/im.exec(text);\n if (!match || match.index === undefined) return '';\n const rest = text.slice(match.index);\n const nextHeading = /^#+\\s+/m.exec(rest.slice(match[0].length));\n return nextHeading?.index === undefined ? rest : rest.slice(0, match[0].length + nextHeading.index);\n}\n\nasync function directorySnapshot(directory: string): Promise<Snapshot> {\n const files = await walkFiles(directory);\n const agentsFile = findFile(files, 'AGENTS.md');\n const serverFile = findFile(files, 'server.json');\n const mcpFile = files.find(file => /(?:^|\\/)\\.mcp\\.json$/.test(file.replaceAll('\\\\', '/')));\n const packageFile = findFile(files, 'package.json');\n const packageText = await readText(packageFile);\n const hasMcpBin = /\"(?:aigentify|[^\"\\n]*mcp[^\"\\n]*)\"\\s*:/i.test(packageText);\n const agentsText = await readText(agentsFile);\n const offerTexts = [agentsText, ...await Promise.all(files.filter(file => /\\.(html?|json|jsonld|md|mdx|tsx|jsx|js|mjs|ts)$/.test(file)).map(readText))];\n const llmsFile = findFile(files, 'llms.txt');\n const sitemapFile = findFile(files, 'sitemap.xml');\n const offerFiles = files.filter(file => /\\.jsonld$|(?:^|\\/)offer[^/]*\\.(?:json|html?)$/i.test(file));\n const honestText = [offerBlock(agentsText), ...await Promise.all(offerFiles.map(readText))].join('\\n');\n return {\n agents: { status: agentsFile ? 200 : 404, contentType: 'text/markdown', text: agentsText },\n server: { status: serverFile ? 200 : 404, contentType: 'application/json', text: await readText(serverFile) },\n mcp: { status: mcpFile || serverFile || hasMcpBin ? 200 : 404, contentType: '', text: '' },\n home: { status: 200, contentType: 'text/plain', text: offerTexts.join('\\n') },\n llms: { status: llmsFile ? 200 : 404, contentType: 'text/plain', text: await readText(llmsFile) },\n sitemap: { status: sitemapFile ? 200 : 404, contentType: 'application/xml', text: await readText(sitemapFile) },\n honestText, hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), networkFailure: false,\n };\n}\n\nasync function fetchText(fetcher: typeof globalThis.fetch, url: string): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000) });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text() };\n } catch { return { status: 0, contentType: '', text: '' }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n const [agents, server, mcp, home, llms, sitemap] = await Promise.all([\n fetchText(fetcher, `${base}/agents.md`), fetchText(fetcher, `${base}/server.json`), fetchText(fetcher, `${base}/.well-known/mcp`),\n fetchText(fetcher, base), fetchText(fetcher, `${base}/llms.txt`), fetchText(fetcher, `${base}/sitemap.xml`),\n ]);\n const endpoints = [agents, server, mcp, home, llms, sitemap];\n return { agents, server, mcp, home, llms, sitemap, honestText: [home.text, offerBlock(agents.text)].join('\\n'), hasMcp: server.status >= 200 && server.status < 400 || mcp.status >= 200 && mcp.status < 400, networkFailure: endpoints.every(item => item.status === 0) };\n}\n\nfunction buildChecks(snapshot: Snapshot): AuditCheck[] {\n const agentsPresent = snapshot.agents.status === 200 && snapshot.agents.text.trim().length > 0 && /(?:text\\/(?:markdown|plain)|application\\/markdown)/i.test(snapshot.agents.contentType);\n const agentsStatus: AuditStatus = snapshot.agents.status === 0 ? 'warn' : agentsPresent ? 'pass' : 'fail';\n const publicStatus: AuditStatus = !agentsPresent ? (snapshot.agents.status === 0 ? 'warn' : 'na') : publicSafe(snapshot.agents.text) ? 'pass' : 'warn';\n const serverInfo = snapshot.server.status === 200 ? validServer(snapshot.server.text) : undefined;\n const serverStatus: AuditStatus = snapshot.server.status === 0 ? 'warn' : !snapshot.hasMcp ? 'na' : serverInfo?.valid ? 'pass' : 'fail';\n const mcpStatus: AuditStatus = snapshot.networkFailure ? 'warn' : snapshot.hasMcp ? 'pass' : 'fail';\n const offerTexts = [snapshot.home.text, snapshot.agents.text];\n const offerStatus: AuditStatus = snapshot.home.status === 0 ? 'warn' : hasOffer(offerTexts) ? 'pass' : 'fail';\n const honestStatus: AuditStatus = !hasOffer(offerTexts) && !agentsPresent ? (snapshot.home.status === 0 ? 'warn' : 'na') : hasUrgency(snapshot.honestText) ? 'warn' : 'pass';\n const llmsStatus: AuditStatus = snapshot.llms.status === 0 ? 'warn' : snapshot.llms.status >= 200 && snapshot.llms.status < 400 && snapshot.llms.text.trim() ? 'pass' : 'fail';\n const sitemapStatus: AuditStatus = snapshot.sitemap.status === 0 ? 'warn' : snapshot.sitemap.status >= 200 && snapshot.sitemap.status < 400 && snapshot.sitemap.text.trim() ? 'pass' : 'fail';\n return [\n check('agents-md', agentsStatus, agentsPresent ? 'AGENTS.md is available.' : snapshot.agents.status === 0 ? 'The AGENTS.md request failed.' : 'AGENTS.md is missing.'),\n check('agents-md-public-safe', publicStatus, publicStatus === 'pass' ? 'AGENTS.md describes the product as a public surface.' : publicStatus === 'na' ? 'No AGENTS.md is available to inspect.' : 'AGENTS.md contains repository-internal guidance.'),\n check('server-json', serverStatus, serverInfo?.valid ? serverInfo.reason : serverInfo?.reason ?? (!snapshot.hasMcp ? 'No MCP surface was detected.' : 'server.json is missing.')),\n check('mcp', mcpStatus, snapshot.networkFailure ? 'The MCP discovery request failed.' : snapshot.hasMcp ? 'An MCP surface is available.' : 'No MCP surface was found.'),\n check('offer-jsonld', offerStatus, offerStatus === 'pass' ? 'Offer JSON-LD is available.' : offerStatus === 'warn' ? 'The offer could not be checked.' : 'No Offer JSON-LD was found.'),\n check('honest-offer', honestStatus, honestStatus === 'pass' ? 'Offer language states the price without pressure.' : honestStatus === 'na' ? 'No offer or Offer block was found.' : 'Offer language contains scarcity, countdown, or urgency copy.'),\n check('llms-txt', llmsStatus, llmsStatus === 'pass' ? 'llms.txt is available.' : llmsStatus === 'warn' ? 'The llms.txt request failed.' : 'llms.txt is missing.'),\n check('sitemap', sitemapStatus, sitemapStatus === 'pass' ? 'sitemap.xml is available.' : sitemapStatus === 'warn' ? 'The sitemap request failed.' : 'sitemap.xml is missing.'),\n ];\n}\n\nexport async function auditTarget(target: string, options: AuditOptions = {}): Promise<AuditReport> {\n const targetStat = await stat(target).catch(() => undefined);\n const snapshot = targetStat?.isDirectory() ? await directorySnapshot(target) : await urlSnapshot(target, options.fetch ?? globalThis.fetch);\n const checks = buildChecks(snapshot);\n const gaps = checks.filter(item => item.status === 'fail' || item.status === 'warn').map(item => ({ id: item.id, note: item.note, fix: FIXES[item.id] }));\n return { target, score: scoreAuditChecks(checks), checks, gaps };\n}\n\nexport function formatAuditReport(report: AuditReport): string {\n const lines = [`${report.target}: ${report.score}/100`, ''];\n for (const item of report.checks) lines.push(`${item.status.toUpperCase().padEnd(4)} ${item.id}: ${item.note}`);\n lines.push('', 'Gaps:');\n if (!report.gaps.length) lines.push('None.');\n else report.gaps.forEach((gap, index) => lines.push(`${index + 1}. ${gap.id}: ${gap.fix}`));\n return lines.join('\\n');\n}\n","{\n \"name\": \"aigentify\",\n \"version\": \"0.1.1\",\n \"mcpName\": \"io.github.pooriaarab/aigentify\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\"aigentify\": \"dist/cli.js\", \"aigentify-mcp\": \"dist/mcp.js\"},\n \"exports\": {\".\": {\"types\": \"./dist/index.d.ts\", \"import\": \"./dist/index.js\", \"require\": \"./dist/index.cjs\"}},\n \"files\": [\"dist\"],\n \"repository\": {\"type\": \"git\", \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"},\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\"agents\", \"agentification\", \"mcp\", \"ai\", \"json-ld\"],\n \"publishConfig\": {\"access\": \"public\"},\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"lint\": \"tsc --noEmit --pretty false\",\n \"typecheck\": \"tsc --noEmit\",\n \"verify\": \"npm run typecheck && npm run build && npm run test\",\n \"prepublishOnly\": \"npm run verify\"\n },\n \"engines\": {\"node\": \">=20\"},\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.17.5\",\n \"cheerio\": \"^1.1.2\",\n \"commander\": \"^14.0.0\",\n \"jiti\": \"^2.5.1\",\n \"zod\": \"^4.0.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.15.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.2.4\"\n }\n}\n","import pkg from '../package.json';\n\nexport const PKG_NAME = pkg.name;\nexport const VERSION = pkg.version;\nexport const CONFIG_FILENAME = `${PKG_NAME}.config.ts`;\nexport const SERVER_SCHEMA_URL = 'https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json';\n// Any dated MCP registry schema is valid; only the bare `.../server.json` (no `.schema`) 404s.\nexport const SERVER_SCHEMA_RE = /^https:\\/\\/static\\.modelcontextprotocol\\.io\\/schemas\\/\\d{4}-\\d{2}-\\d{2}\\/server\\.schema\\.json$/;\n","export interface OfferConfig {\n name?: string;\n description?: string;\n price?: string | number;\n priceCurrency?: string;\n}\n\nexport interface AigentifyConfig {\n name: string;\n description: string;\n repository: string;\n version?: string;\n mcpUrl?: string;\n npmPackage?: string;\n offer?: OfferConfig;\n}\n\nexport function defineConfig(config: AigentifyConfig): AigentifyConfig {\n return { ...config, repository: config.repository.replace(/\\/+$/, ''), version: config.version ?? '0.1.0' };\n}\n\nexport function defaultConfig(): AigentifyConfig {\n return defineConfig({\n name: 'Your product',\n description: 'A product with an agent-native interface.',\n repository: 'https://github.com/your-org/your-product',\n npmPackage: 'your-package',\n });\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsMd(config: AigentifyConfig): string {\n const packageName = config.npmPackage ?? '<NPM_PACKAGE>';\n const mcp = config.mcpUrl ?? `npx ${packageName}`;\n const offer = config.offer;\n const offerLine = offer?.price === undefined ? 'Price: <PRICE>' : `Price: ${offer.priceCurrency ?? 'USD'} ${offer.price}`;\n return `# ${config.name}\n\n## Mental model\n\n${config.name} is ${config.description}\n\nUse the product interface for product work. Use the agent interface for repeatable tasks that need structured results.\n\n## The faces\n\n- Product: ${config.repository}\n- MCP: ${mcp}\n- Package: ${packageName}\n\n## MCP tools\n\n| Tool | Input | Result |\n| --- | --- | --- |\n| audit | target | An agent-readiness report with a score and gaps. |\n| gen | artifact and params | A generated agent-native artifact. |\n\n## The loop\n\n1. Audit the target.\n2. Fix the highest-impact gap.\n3. Generate or publish the missing artifact.\n4. Audit again and keep the report with the release.\n\n## Rules\n\n- Treat the product description and prices as source facts.\n- Return structured data when a tool provides it.\n- Ask for missing information before making a high-impact change.\n- Keep public agent instructions about the product and its use.\n\n## Offer\n\n${offer?.description ?? '<OFFER_DESCRIPTION>'}\n\n${offerLine}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsRoute(config: AigentifyConfig, framework = 'static'): string {\n if (framework === 'next') {\n return `# Serve /agents.md from a Next route\n\nCopy AGENTS.md to a public directory, or add this force-static route:\n\n\\`\\`\\`ts\nimport { readFile } from 'node:fs/promises';\n\nexport const dynamic = 'force-static';\n\nexport async function GET() {\n const body = await readFile('AGENTS.md', 'utf8');\n return new Response(body, { headers: { 'content-type': 'text/markdown; charset=utf-8' } });\n}\n\\`\\`\\`\n\nProduct: ${config.name}\n`;\n }\n return `# Serve /agents.md\n\nCopy the generated AGENTS.md file to public/agents.md and serve it as a static text/markdown response.\n\nProduct: ${config.name}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateOffer(config: AigentifyConfig): string {\n const offer = config.offer ?? {};\n const data = {\n '@context': 'https://schema.org',\n '@type': 'SoftwareApplication',\n name: config.name,\n description: config.description,\n applicationCategory: 'DeveloperApplication',\n offers: [{\n '@type': 'Offer',\n name: offer.name ?? `${config.name} access`,\n ...(offer.description ? { description: offer.description } : {}),\n ...(offer.price === undefined ? {} : { price: String(offer.price) }),\n priceCurrency: offer.priceCurrency ?? 'USD',\n }],\n };\n return `${JSON.stringify(data, null, 2)}\\n`;\n}\n","import { SERVER_SCHEMA_URL } from '../constants.js';\nimport type { AigentifyConfig } from '../config.js';\n\nexport function generateServerJson(config: AigentifyConfig): string {\n const serverName = config.name.includes('/') ? config.name : `io.github.pooriaarab/${config.name.toLowerCase().replace(/[^a-z0-9._-]+/g, '-')}`;\n const server: Record<string, unknown> = {\n $schema: SERVER_SCHEMA_URL,\n name: serverName,\n description: config.description,\n repository: { url: config.repository, source: 'github' },\n version: config.version ?? '0.1.0',\n };\n if (config.mcpUrl) server.remotes = [{ type: 'streamable-http', url: config.mcpUrl }];\n else server.packages = [{ registryType: 'npm', registryBaseUrl: 'https://registry.npmjs.org', identifier: config.npmPackage ?? 'aigentify', version: config.version ?? '0.1.0', transport: { type: 'stdio' }, runtimeHint: 'npx', packageArguments: [{ type: 'positional', valueHint: 'subcommand', value: 'mcp' }] }];\n return `${JSON.stringify(server, null, 2)}\\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\nimport { defaultConfig, defineConfig } from '../config.js';\nimport { generateAgentsMd } from './agents.js';\nimport { generateAgentsRoute } from './agents-route.js';\nimport { generateOffer } from './offer.js';\nimport { generateServerJson } from './server.js';\nexport * from './agents.js';\nexport * from './agents-route.js';\nexport * from './offer.js';\nexport * from './server.js';\n\nexport type GeneratedArtifact = 'agents-md' | 'server-json' | 'offer' | 'agents-route';\nexport type GenerateParams = Partial<AigentifyConfig> & { framework?: string };\n\nfunction configFromParams(params: GenerateParams = {}): AigentifyConfig {\n const base = defaultConfig();\n return defineConfig({ ...base, ...params, offer: { ...(base.offer ?? {}), ...(params.offer ?? {}) } });\n}\n\nexport function generate(artifact: GeneratedArtifact, params: GenerateParams = {}): string {\n const config = configFromParams(params);\n if (artifact === 'agents-md') return generateAgentsMd(config);\n if (artifact === 'server-json') return generateServerJson(config);\n if (artifact === 'offer') return generateOffer(config);\n if (artifact === 'agents-route') return generateAgentsRoute(config, params.framework);\n throw new Error(`Unknown artifact: ${artifact}`);\n}\n"],"mappings":"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","names":["path"]} |
+3
-2
@@ -47,3 +47,4 @@ type AuditStatus = 'pass' | 'fail' | 'warn' | 'na'; | ||
| declare const CONFIG_FILENAME: string; | ||
| declare const SERVER_SCHEMA_URL = "https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json"; | ||
| declare const SERVER_SCHEMA_URL = "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json"; | ||
| declare const SERVER_SCHEMA_RE: RegExp; | ||
@@ -64,2 +65,2 @@ declare function generateAgentsMd(config: AigentifyConfig): string; | ||
| export { type AigentifyConfig, type AuditCheck, type AuditGap, type AuditOptions, type AuditReport, type AuditStatus, CONFIG_FILENAME, type GenerateParams, type GeneratedArtifact, type OfferConfig, PKG_NAME, SERVER_SCHEMA_URL, VERSION, auditTarget, defaultConfig, defineConfig, formatAuditReport, generate, generateAgentsMd, generateAgentsRoute, generateOffer, generateServerJson, scoreAuditChecks }; | ||
| export { type AigentifyConfig, type AuditCheck, type AuditGap, type AuditOptions, type AuditReport, type AuditStatus, CONFIG_FILENAME, type GenerateParams, type GeneratedArtifact, type OfferConfig, PKG_NAME, SERVER_SCHEMA_RE, SERVER_SCHEMA_URL, VERSION, auditTarget, defaultConfig, defineConfig, formatAuditReport, generate, generateAgentsMd, generateAgentsRoute, generateOffer, generateServerJson, scoreAuditChecks }; |
+3
-2
@@ -47,3 +47,4 @@ type AuditStatus = 'pass' | 'fail' | 'warn' | 'na'; | ||
| declare const CONFIG_FILENAME: string; | ||
| declare const SERVER_SCHEMA_URL = "https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json"; | ||
| declare const SERVER_SCHEMA_URL = "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json"; | ||
| declare const SERVER_SCHEMA_RE: RegExp; | ||
@@ -64,2 +65,2 @@ declare function generateAgentsMd(config: AigentifyConfig): string; | ||
| export { type AigentifyConfig, type AuditCheck, type AuditGap, type AuditOptions, type AuditReport, type AuditStatus, CONFIG_FILENAME, type GenerateParams, type GeneratedArtifact, type OfferConfig, PKG_NAME, SERVER_SCHEMA_URL, VERSION, auditTarget, defaultConfig, defineConfig, formatAuditReport, generate, generateAgentsMd, generateAgentsRoute, generateOffer, generateServerJson, scoreAuditChecks }; | ||
| export { type AigentifyConfig, type AuditCheck, type AuditGap, type AuditOptions, type AuditReport, type AuditStatus, CONFIG_FILENAME, type GenerateParams, type GeneratedArtifact, type OfferConfig, PKG_NAME, SERVER_SCHEMA_RE, SERVER_SCHEMA_URL, VERSION, auditTarget, defaultConfig, defineConfig, formatAuditReport, generate, generateAgentsMd, generateAgentsRoute, generateOffer, generateServerJson, scoreAuditChecks }; |
+7
-4
@@ -8,3 +8,4 @@ // src/audit.ts | ||
| name: "aigentify", | ||
| version: "0.1.0", | ||
| version: "0.1.1", | ||
| mcpName: "io.github.pooriaarab/aigentify", | ||
| description: "Audit and generate agent-native product surfaces", | ||
@@ -49,3 +50,4 @@ type: "module", | ||
| var CONFIG_FILENAME = `${PKG_NAME}.config.ts`; | ||
| var SERVER_SCHEMA_URL = "https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json"; | ||
| var SERVER_SCHEMA_URL = "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json"; | ||
| var SERVER_SCHEMA_RE = /^https:\/\/static\.modelcontextprotocol\.io\/schemas\/\d{4}-\d{2}-\d{2}\/server\.schema\.json$/; | ||
@@ -118,3 +120,3 @@ // src/audit.ts | ||
| if (!value) return { valid: false, reason: "server.json is not valid JSON." }; | ||
| if (value.$schema !== SERVER_SCHEMA_URL) return { valid: false, reason: `server.json must use the exact schema URL ${SERVER_SCHEMA_URL}.` }; | ||
| if (typeof value.$schema !== "string" || !SERVER_SCHEMA_RE.test(value.$schema)) return { valid: false, reason: `server.json "$schema" must be a dated MCP registry schema like ${SERVER_SCHEMA_URL} (the bare .../server.json 404s).` }; | ||
| const missing = ["name", "description", "repository", "version"].filter((key) => !value[key]); | ||
@@ -350,3 +352,3 @@ if (missing.length) return { valid: false, reason: `server.json is missing: ${missing.join(", ")}.` }; | ||
| if (config.mcpUrl) server.remotes = [{ type: "streamable-http", url: config.mcpUrl }]; | ||
| else server.packages = [{ registry_type: "npm", identifier: config.npmPackage ?? "aigentify", version: config.version ?? "0.1.0", runtime_hint: "npx", transport: { type: "stdio" } }]; | ||
| else server.packages = [{ registryType: "npm", registryBaseUrl: "https://registry.npmjs.org", identifier: config.npmPackage ?? "aigentify", version: config.version ?? "0.1.0", transport: { type: "stdio" }, runtimeHint: "npx", packageArguments: [{ type: "positional", valueHint: "subcommand", value: "mcp" }] }]; | ||
| return `${JSON.stringify(server, null, 2)} | ||
@@ -372,2 +374,3 @@ `; | ||
| PKG_NAME, | ||
| SERVER_SCHEMA_RE, | ||
| SERVER_SCHEMA_URL, | ||
@@ -374,0 +377,0 @@ VERSION, |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/audit.ts","../package.json","../src/constants.ts","../src/config.ts","../src/generators/agents.ts","../src/generators/agents-route.ts","../src/generators/offer.ts","../src/generators/server.ts","../src/generators/index.ts"],"sourcesContent":["import { readFile, readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { SERVER_SCHEMA_URL } from './constants.js';\n\nexport type AuditStatus = 'pass' | 'fail' | 'warn' | 'na';\nexport interface AuditCheck { id: string; status: AuditStatus; note: string; weight: number }\nexport interface AuditGap { id: string; note: string; fix: string }\nexport interface AuditReport { target: string; score: number; checks: AuditCheck[]; gaps: AuditGap[] }\nexport interface AuditOptions { fetch?: typeof globalThis.fetch }\n\ninterface Endpoint { status: number; contentType: string; text: string }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n honestText: string; hasMcp: boolean; networkFailure: boolean;\n}\n\nconst SKIPPED = new Set(['.git', 'node_modules', 'dist', 'coverage', '.next', '_reference_geoaeo']);\nconst WEIGHTS: Record<string, number> = {\n 'agents-md': 15, 'agents-md-public-safe': 10, 'server-json': 15, mcp: 15,\n 'offer-jsonld': 15, 'honest-offer': 10, 'llms-txt': 10, sitemap: 10,\n};\nconst FIXES: Record<string, string> = {\n 'agents-md': 'Add a public AGENTS.md at the target root or serve /agents.md as text/markdown.',\n 'agents-md-public-safe': 'Rewrite AGENTS.md as product guidance. Remove repository paths and contributor instructions.',\n 'server-json': `Add server.json and set \"$schema\" to \"${SERVER_SCHEMA_URL}\". Include a repository and a remotes or packages entry.`,\n mcp: 'Publish server.json, .mcp.json, or an MCP entry point.',\n 'offer-jsonld': 'Publish JSON-LD with @type Offer, or a SoftwareApplication with an offers property.',\n 'honest-offer': 'State the real price plainly. Remove scarcity, countdown, and urgency language.',\n 'llms-txt': 'Publish /llms.txt with a concise product description.',\n sitemap: 'Publish /sitemap.xml for URL discovery.',\n};\n\nfunction check(id: string, status: AuditStatus, note: string): AuditCheck { return { id, status, note, weight: WEIGHTS[id] }; }\n\nexport function scoreAuditChecks(checks: AuditCheck[]): number {\n const relevant = checks.filter(item => item.status !== 'na');\n const total = relevant.reduce((sum, item) => sum + item.weight, 0);\n if (!total) return 0;\n const earned = relevant.reduce((sum, item) => sum + (item.status === 'pass' ? item.weight : item.status === 'warn' ? item.weight / 2 : 0), 0);\n return Math.round((earned / total) * 100);\n}\n\nasync function walkFiles(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n if (entry.isDirectory() && !SKIPPED.has(entry.name)) files.push(...await walkFiles(path.join(directory, entry.name)));\n else if (entry.isFile()) files.push(path.join(directory, entry.name));\n }\n return files;\n}\n\nasync function readText(file: string | undefined): Promise<string> {\n if (!file) return '';\n try { return await readFile(file, 'utf8'); } catch { return ''; }\n}\n\nfunction findFile(files: string[], name: string): string | undefined {\n return files.find(file => {\n const normalized = file.replaceAll('\\\\', '/');\n return path.basename(normalized) === name || normalized.endsWith(`/${name}/route.ts`);\n });\n}\n\nfunction parseJson(text: string): Record<string, unknown> | undefined {\n try {\n const value: unknown = JSON.parse(text);\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n } catch { return undefined; }\n}\n\nfunction validServer(text: string): { valid: boolean; reason: string } {\n const value = parseJson(text);\n if (!value) return { valid: false, reason: 'server.json is not valid JSON.' };\n if (value.$schema !== SERVER_SCHEMA_URL) return { valid: false, reason: `server.json must use the exact schema URL ${SERVER_SCHEMA_URL}.` };\n const missing = ['name', 'description', 'repository', 'version'].filter(key => !value[key]);\n if (missing.length) return { valid: false, reason: `server.json is missing: ${missing.join(', ')}.` };\n if (!Array.isArray(value.remotes) && !Array.isArray(value.packages)) return { valid: false, reason: 'server.json needs a remotes or packages entry.' };\n return { valid: true, reason: 'server.json has the required MCP registry fields.' };\n}\n\nfunction hasOffer(texts: string[]): boolean {\n return texts.some(text => /\"@type\"\\s*:\\s*\"Offer\"/i.test(text) || /\"@type\"\\s*:\\s*\"SoftwareApplication\"/i.test(text) && /\"offers\"\\s*:/.test(text));\n}\n\nfunction hasUrgency(text: string): boolean {\n return /limited time|act now|hurry|expires|only\\s+\\d+\\s+left|ends in|sign up now|countdown/i.test(text);\n}\n\nfunction publicSafe(text: string): boolean {\n return !(/\\bsrc\\//i.test(text) || /\\bapps\\//i.test(text) || /\\bpackages\\//i.test(text) || /\\b[\\w.-]+\\.ts\\b/i.test(text) || /npm run build/i.test(text) || /\\btsconfig\\b/i.test(text) || /\\bcontributors?\\b/i.test(text) || /^#+\\s*layout\\b/im.test(text));\n}\n\nfunction offerBlock(text: string): string {\n const match = /^#+\\s*Offer\\b/im.exec(text);\n if (!match || match.index === undefined) return '';\n const rest = text.slice(match.index);\n const nextHeading = /^#+\\s+/m.exec(rest.slice(match[0].length));\n return nextHeading?.index === undefined ? rest : rest.slice(0, match[0].length + nextHeading.index);\n}\n\nasync function directorySnapshot(directory: string): Promise<Snapshot> {\n const files = await walkFiles(directory);\n const agentsFile = findFile(files, 'AGENTS.md');\n const serverFile = findFile(files, 'server.json');\n const mcpFile = files.find(file => /(?:^|\\/)\\.mcp\\.json$/.test(file.replaceAll('\\\\', '/')));\n const packageFile = findFile(files, 'package.json');\n const packageText = await readText(packageFile);\n const hasMcpBin = /\"(?:aigentify|[^\"\\n]*mcp[^\"\\n]*)\"\\s*:/i.test(packageText);\n const agentsText = await readText(agentsFile);\n const offerTexts = [agentsText, ...await Promise.all(files.filter(file => /\\.(html?|json|jsonld|md|mdx|tsx|jsx|js|mjs|ts)$/.test(file)).map(readText))];\n const llmsFile = findFile(files, 'llms.txt');\n const sitemapFile = findFile(files, 'sitemap.xml');\n const offerFiles = files.filter(file => /\\.jsonld$|(?:^|\\/)offer[^/]*\\.(?:json|html?)$/i.test(file));\n const honestText = [offerBlock(agentsText), ...await Promise.all(offerFiles.map(readText))].join('\\n');\n return {\n agents: { status: agentsFile ? 200 : 404, contentType: 'text/markdown', text: agentsText },\n server: { status: serverFile ? 200 : 404, contentType: 'application/json', text: await readText(serverFile) },\n mcp: { status: mcpFile || serverFile || hasMcpBin ? 200 : 404, contentType: '', text: '' },\n home: { status: 200, contentType: 'text/plain', text: offerTexts.join('\\n') },\n llms: { status: llmsFile ? 200 : 404, contentType: 'text/plain', text: await readText(llmsFile) },\n sitemap: { status: sitemapFile ? 200 : 404, contentType: 'application/xml', text: await readText(sitemapFile) },\n honestText, hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), networkFailure: false,\n };\n}\n\nasync function fetchText(fetcher: typeof globalThis.fetch, url: string): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000) });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text() };\n } catch { return { status: 0, contentType: '', text: '' }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n const [agents, server, mcp, home, llms, sitemap] = await Promise.all([\n fetchText(fetcher, `${base}/agents.md`), fetchText(fetcher, `${base}/server.json`), fetchText(fetcher, `${base}/.well-known/mcp`),\n fetchText(fetcher, base), fetchText(fetcher, `${base}/llms.txt`), fetchText(fetcher, `${base}/sitemap.xml`),\n ]);\n const endpoints = [agents, server, mcp, home, llms, sitemap];\n return { agents, server, mcp, home, llms, sitemap, honestText: [home.text, offerBlock(agents.text)].join('\\n'), hasMcp: server.status >= 200 && server.status < 400 || mcp.status >= 200 && mcp.status < 400, networkFailure: endpoints.every(item => item.status === 0) };\n}\n\nfunction buildChecks(snapshot: Snapshot): AuditCheck[] {\n const agentsPresent = snapshot.agents.status === 200 && snapshot.agents.text.trim().length > 0 && /(?:text\\/(?:markdown|plain)|application\\/markdown)/i.test(snapshot.agents.contentType);\n const agentsStatus: AuditStatus = snapshot.agents.status === 0 ? 'warn' : agentsPresent ? 'pass' : 'fail';\n const publicStatus: AuditStatus = !agentsPresent ? (snapshot.agents.status === 0 ? 'warn' : 'na') : publicSafe(snapshot.agents.text) ? 'pass' : 'warn';\n const serverInfo = snapshot.server.status === 200 ? validServer(snapshot.server.text) : undefined;\n const serverStatus: AuditStatus = snapshot.server.status === 0 ? 'warn' : !snapshot.hasMcp ? 'na' : serverInfo?.valid ? 'pass' : 'fail';\n const mcpStatus: AuditStatus = snapshot.networkFailure ? 'warn' : snapshot.hasMcp ? 'pass' : 'fail';\n const offerTexts = [snapshot.home.text, snapshot.agents.text];\n const offerStatus: AuditStatus = snapshot.home.status === 0 ? 'warn' : hasOffer(offerTexts) ? 'pass' : 'fail';\n const honestStatus: AuditStatus = !hasOffer(offerTexts) && !agentsPresent ? (snapshot.home.status === 0 ? 'warn' : 'na') : hasUrgency(snapshot.honestText) ? 'warn' : 'pass';\n const llmsStatus: AuditStatus = snapshot.llms.status === 0 ? 'warn' : snapshot.llms.status >= 200 && snapshot.llms.status < 400 && snapshot.llms.text.trim() ? 'pass' : 'fail';\n const sitemapStatus: AuditStatus = snapshot.sitemap.status === 0 ? 'warn' : snapshot.sitemap.status >= 200 && snapshot.sitemap.status < 400 && snapshot.sitemap.text.trim() ? 'pass' : 'fail';\n return [\n check('agents-md', agentsStatus, agentsPresent ? 'AGENTS.md is available.' : snapshot.agents.status === 0 ? 'The AGENTS.md request failed.' : 'AGENTS.md is missing.'),\n check('agents-md-public-safe', publicStatus, publicStatus === 'pass' ? 'AGENTS.md describes the product as a public surface.' : publicStatus === 'na' ? 'No AGENTS.md is available to inspect.' : 'AGENTS.md contains repository-internal guidance.'),\n check('server-json', serverStatus, serverInfo?.valid ? serverInfo.reason : serverInfo?.reason ?? (!snapshot.hasMcp ? 'No MCP surface was detected.' : 'server.json is missing.')),\n check('mcp', mcpStatus, snapshot.networkFailure ? 'The MCP discovery request failed.' : snapshot.hasMcp ? 'An MCP surface is available.' : 'No MCP surface was found.'),\n check('offer-jsonld', offerStatus, offerStatus === 'pass' ? 'Offer JSON-LD is available.' : offerStatus === 'warn' ? 'The offer could not be checked.' : 'No Offer JSON-LD was found.'),\n check('honest-offer', honestStatus, honestStatus === 'pass' ? 'Offer language states the price without pressure.' : honestStatus === 'na' ? 'No offer or Offer block was found.' : 'Offer language contains scarcity, countdown, or urgency copy.'),\n check('llms-txt', llmsStatus, llmsStatus === 'pass' ? 'llms.txt is available.' : llmsStatus === 'warn' ? 'The llms.txt request failed.' : 'llms.txt is missing.'),\n check('sitemap', sitemapStatus, sitemapStatus === 'pass' ? 'sitemap.xml is available.' : sitemapStatus === 'warn' ? 'The sitemap request failed.' : 'sitemap.xml is missing.'),\n ];\n}\n\nexport async function auditTarget(target: string, options: AuditOptions = {}): Promise<AuditReport> {\n const targetStat = await stat(target).catch(() => undefined);\n const snapshot = targetStat?.isDirectory() ? await directorySnapshot(target) : await urlSnapshot(target, options.fetch ?? globalThis.fetch);\n const checks = buildChecks(snapshot);\n const gaps = checks.filter(item => item.status === 'fail' || item.status === 'warn').map(item => ({ id: item.id, note: item.note, fix: FIXES[item.id] }));\n return { target, score: scoreAuditChecks(checks), checks, gaps };\n}\n\nexport function formatAuditReport(report: AuditReport): string {\n const lines = [`${report.target}: ${report.score}/100`, ''];\n for (const item of report.checks) lines.push(`${item.status.toUpperCase().padEnd(4)} ${item.id}: ${item.note}`);\n lines.push('', 'Gaps:');\n if (!report.gaps.length) lines.push('None.');\n else report.gaps.forEach((gap, index) => lines.push(`${index + 1}. ${gap.id}: ${gap.fix}`));\n return lines.join('\\n');\n}\n","{\n \"name\": \"aigentify\",\n \"version\": \"0.1.0\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\"aigentify\": \"dist/cli.js\", \"aigentify-mcp\": \"dist/mcp.js\"},\n \"exports\": {\".\": {\"types\": \"./dist/index.d.ts\", \"import\": \"./dist/index.js\", \"require\": \"./dist/index.cjs\"}},\n \"files\": [\"dist\"],\n \"repository\": {\"type\": \"git\", \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"},\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\"agents\", \"agentification\", \"mcp\", \"ai\", \"json-ld\"],\n \"publishConfig\": {\"access\": \"public\"},\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"lint\": \"tsc --noEmit --pretty false\",\n \"typecheck\": \"tsc --noEmit\",\n \"verify\": \"npm run typecheck && npm run build && npm run test\",\n \"prepublishOnly\": \"npm run verify\"\n },\n \"engines\": {\"node\": \">=20\"},\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.17.5\",\n \"cheerio\": \"^1.1.2\",\n \"commander\": \"^14.0.0\",\n \"jiti\": \"^2.5.1\",\n \"zod\": \"^4.0.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.15.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.2.4\"\n }\n}\n","import pkg from '../package.json';\n\nexport const PKG_NAME = pkg.name;\nexport const VERSION = pkg.version;\nexport const CONFIG_FILENAME = `${PKG_NAME}.config.ts`;\nexport const SERVER_SCHEMA_URL = 'https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json';\n","export interface OfferConfig {\n name?: string;\n description?: string;\n price?: string | number;\n priceCurrency?: string;\n}\n\nexport interface AigentifyConfig {\n name: string;\n description: string;\n repository: string;\n version?: string;\n mcpUrl?: string;\n npmPackage?: string;\n offer?: OfferConfig;\n}\n\nexport function defineConfig(config: AigentifyConfig): AigentifyConfig {\n return { ...config, repository: config.repository.replace(/\\/+$/, ''), version: config.version ?? '0.1.0' };\n}\n\nexport function defaultConfig(): AigentifyConfig {\n return defineConfig({\n name: 'Your product',\n description: 'A product with an agent-native interface.',\n repository: 'https://github.com/your-org/your-product',\n npmPackage: 'your-package',\n });\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsMd(config: AigentifyConfig): string {\n const packageName = config.npmPackage ?? '<NPM_PACKAGE>';\n const mcp = config.mcpUrl ?? `npx ${packageName}`;\n const offer = config.offer;\n const offerLine = offer?.price === undefined ? 'Price: <PRICE>' : `Price: ${offer.priceCurrency ?? 'USD'} ${offer.price}`;\n return `# ${config.name}\n\n## Mental model\n\n${config.name} is ${config.description}\n\nUse the product interface for product work. Use the agent interface for repeatable tasks that need structured results.\n\n## The faces\n\n- Product: ${config.repository}\n- MCP: ${mcp}\n- Package: ${packageName}\n\n## MCP tools\n\n| Tool | Input | Result |\n| --- | --- | --- |\n| audit | target | An agent-readiness report with a score and gaps. |\n| gen | artifact and params | A generated agent-native artifact. |\n\n## The loop\n\n1. Audit the target.\n2. Fix the highest-impact gap.\n3. Generate or publish the missing artifact.\n4. Audit again and keep the report with the release.\n\n## Rules\n\n- Treat the product description and prices as source facts.\n- Return structured data when a tool provides it.\n- Ask for missing information before making a high-impact change.\n- Keep public agent instructions about the product and its use.\n\n## Offer\n\n${offer?.description ?? '<OFFER_DESCRIPTION>'}\n\n${offerLine}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsRoute(config: AigentifyConfig, framework = 'static'): string {\n if (framework === 'next') {\n return `# Serve /agents.md from a Next route\n\nCopy AGENTS.md to a public directory, or add this force-static route:\n\n\\`\\`\\`ts\nimport { readFile } from 'node:fs/promises';\n\nexport const dynamic = 'force-static';\n\nexport async function GET() {\n const body = await readFile('AGENTS.md', 'utf8');\n return new Response(body, { headers: { 'content-type': 'text/markdown; charset=utf-8' } });\n}\n\\`\\`\\`\n\nProduct: ${config.name}\n`;\n }\n return `# Serve /agents.md\n\nCopy the generated AGENTS.md file to public/agents.md and serve it as a static text/markdown response.\n\nProduct: ${config.name}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateOffer(config: AigentifyConfig): string {\n const offer = config.offer ?? {};\n const data = {\n '@context': 'https://schema.org',\n '@type': 'SoftwareApplication',\n name: config.name,\n description: config.description,\n applicationCategory: 'DeveloperApplication',\n offers: [{\n '@type': 'Offer',\n name: offer.name ?? `${config.name} access`,\n ...(offer.description ? { description: offer.description } : {}),\n ...(offer.price === undefined ? {} : { price: String(offer.price) }),\n priceCurrency: offer.priceCurrency ?? 'USD',\n }],\n };\n return `${JSON.stringify(data, null, 2)}\\n`;\n}\n","import { SERVER_SCHEMA_URL } from '../constants.js';\nimport type { AigentifyConfig } from '../config.js';\n\nexport function generateServerJson(config: AigentifyConfig): string {\n const serverName = config.name.includes('/') ? config.name : `io.github.pooriaarab/${config.name.toLowerCase().replace(/[^a-z0-9._-]+/g, '-')}`;\n const server: Record<string, unknown> = {\n $schema: SERVER_SCHEMA_URL,\n name: serverName,\n description: config.description,\n repository: { url: config.repository, source: 'github' },\n version: config.version ?? '0.1.0',\n };\n if (config.mcpUrl) server.remotes = [{ type: 'streamable-http', url: config.mcpUrl }];\n else server.packages = [{ registry_type: 'npm', identifier: config.npmPackage ?? 'aigentify', version: config.version ?? '0.1.0', runtime_hint: 'npx', transport: { type: 'stdio' } }];\n return `${JSON.stringify(server, null, 2)}\\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\nimport { defaultConfig, defineConfig } from '../config.js';\nimport { generateAgentsMd } from './agents.js';\nimport { generateAgentsRoute } from './agents-route.js';\nimport { generateOffer } from './offer.js';\nimport { generateServerJson } from './server.js';\nexport * from './agents.js';\nexport * from './agents-route.js';\nexport * from './offer.js';\nexport * from './server.js';\n\nexport type GeneratedArtifact = 'agents-md' | 'server-json' | 'offer' | 'agents-route';\nexport type GenerateParams = Partial<AigentifyConfig> & { framework?: string };\n\nfunction configFromParams(params: GenerateParams = {}): AigentifyConfig {\n const base = defaultConfig();\n return defineConfig({ ...base, ...params, offer: { ...(base.offer ?? {}), ...(params.offer ?? {}) } });\n}\n\nexport function generate(artifact: GeneratedArtifact, params: GenerateParams = {}): string {\n const config = configFromParams(params);\n if (artifact === 'agents-md') return generateAgentsMd(config);\n if (artifact === 'server-json') return generateServerJson(config);\n if (artifact === 'offer') return generateOffer(config);\n if (artifact === 'agents-route') return generateAgentsRoute(config, params.framework);\n throw new Error(`Unknown artifact: ${artifact}`);\n}\n"],"mappings":"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","names":[]} | ||
| {"version":3,"sources":["../src/audit.ts","../package.json","../src/constants.ts","../src/config.ts","../src/generators/agents.ts","../src/generators/agents-route.ts","../src/generators/offer.ts","../src/generators/server.ts","../src/generators/index.ts"],"sourcesContent":["import { readFile, readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { SERVER_SCHEMA_URL, SERVER_SCHEMA_RE } from './constants.js';\n\nexport type AuditStatus = 'pass' | 'fail' | 'warn' | 'na';\nexport interface AuditCheck { id: string; status: AuditStatus; note: string; weight: number }\nexport interface AuditGap { id: string; note: string; fix: string }\nexport interface AuditReport { target: string; score: number; checks: AuditCheck[]; gaps: AuditGap[] }\nexport interface AuditOptions { fetch?: typeof globalThis.fetch }\n\ninterface Endpoint { status: number; contentType: string; text: string }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n honestText: string; hasMcp: boolean; networkFailure: boolean;\n}\n\nconst SKIPPED = new Set(['.git', 'node_modules', 'dist', 'coverage', '.next', '_reference_geoaeo']);\nconst WEIGHTS: Record<string, number> = {\n 'agents-md': 15, 'agents-md-public-safe': 10, 'server-json': 15, mcp: 15,\n 'offer-jsonld': 15, 'honest-offer': 10, 'llms-txt': 10, sitemap: 10,\n};\nconst FIXES: Record<string, string> = {\n 'agents-md': 'Add a public AGENTS.md at the target root or serve /agents.md as text/markdown.',\n 'agents-md-public-safe': 'Rewrite AGENTS.md as product guidance. Remove repository paths and contributor instructions.',\n 'server-json': `Add server.json and set \"$schema\" to \"${SERVER_SCHEMA_URL}\". Include a repository and a remotes or packages entry.`,\n mcp: 'Publish server.json, .mcp.json, or an MCP entry point.',\n 'offer-jsonld': 'Publish JSON-LD with @type Offer, or a SoftwareApplication with an offers property.',\n 'honest-offer': 'State the real price plainly. Remove scarcity, countdown, and urgency language.',\n 'llms-txt': 'Publish /llms.txt with a concise product description.',\n sitemap: 'Publish /sitemap.xml for URL discovery.',\n};\n\nfunction check(id: string, status: AuditStatus, note: string): AuditCheck { return { id, status, note, weight: WEIGHTS[id] }; }\n\nexport function scoreAuditChecks(checks: AuditCheck[]): number {\n const relevant = checks.filter(item => item.status !== 'na');\n const total = relevant.reduce((sum, item) => sum + item.weight, 0);\n if (!total) return 0;\n const earned = relevant.reduce((sum, item) => sum + (item.status === 'pass' ? item.weight : item.status === 'warn' ? item.weight / 2 : 0), 0);\n return Math.round((earned / total) * 100);\n}\n\nasync function walkFiles(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n if (entry.isDirectory() && !SKIPPED.has(entry.name)) files.push(...await walkFiles(path.join(directory, entry.name)));\n else if (entry.isFile()) files.push(path.join(directory, entry.name));\n }\n return files;\n}\n\nasync function readText(file: string | undefined): Promise<string> {\n if (!file) return '';\n try { return await readFile(file, 'utf8'); } catch { return ''; }\n}\n\nfunction findFile(files: string[], name: string): string | undefined {\n return files.find(file => {\n const normalized = file.replaceAll('\\\\', '/');\n return path.basename(normalized) === name || normalized.endsWith(`/${name}/route.ts`);\n });\n}\n\nfunction parseJson(text: string): Record<string, unknown> | undefined {\n try {\n const value: unknown = JSON.parse(text);\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n } catch { return undefined; }\n}\n\nfunction validServer(text: string): { valid: boolean; reason: string } {\n const value = parseJson(text);\n if (!value) return { valid: false, reason: 'server.json is not valid JSON.' };\n if (typeof value.$schema !== 'string' || !SERVER_SCHEMA_RE.test(value.$schema)) return { valid: false, reason: `server.json \"$schema\" must be a dated MCP registry schema like ${SERVER_SCHEMA_URL} (the bare .../server.json 404s).` };\n const missing = ['name', 'description', 'repository', 'version'].filter(key => !value[key]);\n if (missing.length) return { valid: false, reason: `server.json is missing: ${missing.join(', ')}.` };\n if (!Array.isArray(value.remotes) && !Array.isArray(value.packages)) return { valid: false, reason: 'server.json needs a remotes or packages entry.' };\n return { valid: true, reason: 'server.json has the required MCP registry fields.' };\n}\n\nfunction hasOffer(texts: string[]): boolean {\n return texts.some(text => /\"@type\"\\s*:\\s*\"Offer\"/i.test(text) || /\"@type\"\\s*:\\s*\"SoftwareApplication\"/i.test(text) && /\"offers\"\\s*:/.test(text));\n}\n\nfunction hasUrgency(text: string): boolean {\n return /limited time|act now|hurry|expires|only\\s+\\d+\\s+left|ends in|sign up now|countdown/i.test(text);\n}\n\nfunction publicSafe(text: string): boolean {\n return !(/\\bsrc\\//i.test(text) || /\\bapps\\//i.test(text) || /\\bpackages\\//i.test(text) || /\\b[\\w.-]+\\.ts\\b/i.test(text) || /npm run build/i.test(text) || /\\btsconfig\\b/i.test(text) || /\\bcontributors?\\b/i.test(text) || /^#+\\s*layout\\b/im.test(text));\n}\n\nfunction offerBlock(text: string): string {\n const match = /^#+\\s*Offer\\b/im.exec(text);\n if (!match || match.index === undefined) return '';\n const rest = text.slice(match.index);\n const nextHeading = /^#+\\s+/m.exec(rest.slice(match[0].length));\n return nextHeading?.index === undefined ? rest : rest.slice(0, match[0].length + nextHeading.index);\n}\n\nasync function directorySnapshot(directory: string): Promise<Snapshot> {\n const files = await walkFiles(directory);\n const agentsFile = findFile(files, 'AGENTS.md');\n const serverFile = findFile(files, 'server.json');\n const mcpFile = files.find(file => /(?:^|\\/)\\.mcp\\.json$/.test(file.replaceAll('\\\\', '/')));\n const packageFile = findFile(files, 'package.json');\n const packageText = await readText(packageFile);\n const hasMcpBin = /\"(?:aigentify|[^\"\\n]*mcp[^\"\\n]*)\"\\s*:/i.test(packageText);\n const agentsText = await readText(agentsFile);\n const offerTexts = [agentsText, ...await Promise.all(files.filter(file => /\\.(html?|json|jsonld|md|mdx|tsx|jsx|js|mjs|ts)$/.test(file)).map(readText))];\n const llmsFile = findFile(files, 'llms.txt');\n const sitemapFile = findFile(files, 'sitemap.xml');\n const offerFiles = files.filter(file => /\\.jsonld$|(?:^|\\/)offer[^/]*\\.(?:json|html?)$/i.test(file));\n const honestText = [offerBlock(agentsText), ...await Promise.all(offerFiles.map(readText))].join('\\n');\n return {\n agents: { status: agentsFile ? 200 : 404, contentType: 'text/markdown', text: agentsText },\n server: { status: serverFile ? 200 : 404, contentType: 'application/json', text: await readText(serverFile) },\n mcp: { status: mcpFile || serverFile || hasMcpBin ? 200 : 404, contentType: '', text: '' },\n home: { status: 200, contentType: 'text/plain', text: offerTexts.join('\\n') },\n llms: { status: llmsFile ? 200 : 404, contentType: 'text/plain', text: await readText(llmsFile) },\n sitemap: { status: sitemapFile ? 200 : 404, contentType: 'application/xml', text: await readText(sitemapFile) },\n honestText, hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), networkFailure: false,\n };\n}\n\nasync function fetchText(fetcher: typeof globalThis.fetch, url: string): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000) });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text() };\n } catch { return { status: 0, contentType: '', text: '' }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n const [agents, server, mcp, home, llms, sitemap] = await Promise.all([\n fetchText(fetcher, `${base}/agents.md`), fetchText(fetcher, `${base}/server.json`), fetchText(fetcher, `${base}/.well-known/mcp`),\n fetchText(fetcher, base), fetchText(fetcher, `${base}/llms.txt`), fetchText(fetcher, `${base}/sitemap.xml`),\n ]);\n const endpoints = [agents, server, mcp, home, llms, sitemap];\n return { agents, server, mcp, home, llms, sitemap, honestText: [home.text, offerBlock(agents.text)].join('\\n'), hasMcp: server.status >= 200 && server.status < 400 || mcp.status >= 200 && mcp.status < 400, networkFailure: endpoints.every(item => item.status === 0) };\n}\n\nfunction buildChecks(snapshot: Snapshot): AuditCheck[] {\n const agentsPresent = snapshot.agents.status === 200 && snapshot.agents.text.trim().length > 0 && /(?:text\\/(?:markdown|plain)|application\\/markdown)/i.test(snapshot.agents.contentType);\n const agentsStatus: AuditStatus = snapshot.agents.status === 0 ? 'warn' : agentsPresent ? 'pass' : 'fail';\n const publicStatus: AuditStatus = !agentsPresent ? (snapshot.agents.status === 0 ? 'warn' : 'na') : publicSafe(snapshot.agents.text) ? 'pass' : 'warn';\n const serverInfo = snapshot.server.status === 200 ? validServer(snapshot.server.text) : undefined;\n const serverStatus: AuditStatus = snapshot.server.status === 0 ? 'warn' : !snapshot.hasMcp ? 'na' : serverInfo?.valid ? 'pass' : 'fail';\n const mcpStatus: AuditStatus = snapshot.networkFailure ? 'warn' : snapshot.hasMcp ? 'pass' : 'fail';\n const offerTexts = [snapshot.home.text, snapshot.agents.text];\n const offerStatus: AuditStatus = snapshot.home.status === 0 ? 'warn' : hasOffer(offerTexts) ? 'pass' : 'fail';\n const honestStatus: AuditStatus = !hasOffer(offerTexts) && !agentsPresent ? (snapshot.home.status === 0 ? 'warn' : 'na') : hasUrgency(snapshot.honestText) ? 'warn' : 'pass';\n const llmsStatus: AuditStatus = snapshot.llms.status === 0 ? 'warn' : snapshot.llms.status >= 200 && snapshot.llms.status < 400 && snapshot.llms.text.trim() ? 'pass' : 'fail';\n const sitemapStatus: AuditStatus = snapshot.sitemap.status === 0 ? 'warn' : snapshot.sitemap.status >= 200 && snapshot.sitemap.status < 400 && snapshot.sitemap.text.trim() ? 'pass' : 'fail';\n return [\n check('agents-md', agentsStatus, agentsPresent ? 'AGENTS.md is available.' : snapshot.agents.status === 0 ? 'The AGENTS.md request failed.' : 'AGENTS.md is missing.'),\n check('agents-md-public-safe', publicStatus, publicStatus === 'pass' ? 'AGENTS.md describes the product as a public surface.' : publicStatus === 'na' ? 'No AGENTS.md is available to inspect.' : 'AGENTS.md contains repository-internal guidance.'),\n check('server-json', serverStatus, serverInfo?.valid ? serverInfo.reason : serverInfo?.reason ?? (!snapshot.hasMcp ? 'No MCP surface was detected.' : 'server.json is missing.')),\n check('mcp', mcpStatus, snapshot.networkFailure ? 'The MCP discovery request failed.' : snapshot.hasMcp ? 'An MCP surface is available.' : 'No MCP surface was found.'),\n check('offer-jsonld', offerStatus, offerStatus === 'pass' ? 'Offer JSON-LD is available.' : offerStatus === 'warn' ? 'The offer could not be checked.' : 'No Offer JSON-LD was found.'),\n check('honest-offer', honestStatus, honestStatus === 'pass' ? 'Offer language states the price without pressure.' : honestStatus === 'na' ? 'No offer or Offer block was found.' : 'Offer language contains scarcity, countdown, or urgency copy.'),\n check('llms-txt', llmsStatus, llmsStatus === 'pass' ? 'llms.txt is available.' : llmsStatus === 'warn' ? 'The llms.txt request failed.' : 'llms.txt is missing.'),\n check('sitemap', sitemapStatus, sitemapStatus === 'pass' ? 'sitemap.xml is available.' : sitemapStatus === 'warn' ? 'The sitemap request failed.' : 'sitemap.xml is missing.'),\n ];\n}\n\nexport async function auditTarget(target: string, options: AuditOptions = {}): Promise<AuditReport> {\n const targetStat = await stat(target).catch(() => undefined);\n const snapshot = targetStat?.isDirectory() ? await directorySnapshot(target) : await urlSnapshot(target, options.fetch ?? globalThis.fetch);\n const checks = buildChecks(snapshot);\n const gaps = checks.filter(item => item.status === 'fail' || item.status === 'warn').map(item => ({ id: item.id, note: item.note, fix: FIXES[item.id] }));\n return { target, score: scoreAuditChecks(checks), checks, gaps };\n}\n\nexport function formatAuditReport(report: AuditReport): string {\n const lines = [`${report.target}: ${report.score}/100`, ''];\n for (const item of report.checks) lines.push(`${item.status.toUpperCase().padEnd(4)} ${item.id}: ${item.note}`);\n lines.push('', 'Gaps:');\n if (!report.gaps.length) lines.push('None.');\n else report.gaps.forEach((gap, index) => lines.push(`${index + 1}. ${gap.id}: ${gap.fix}`));\n return lines.join('\\n');\n}\n","{\n \"name\": \"aigentify\",\n \"version\": \"0.1.1\",\n \"mcpName\": \"io.github.pooriaarab/aigentify\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\"aigentify\": \"dist/cli.js\", \"aigentify-mcp\": \"dist/mcp.js\"},\n \"exports\": {\".\": {\"types\": \"./dist/index.d.ts\", \"import\": \"./dist/index.js\", \"require\": \"./dist/index.cjs\"}},\n \"files\": [\"dist\"],\n \"repository\": {\"type\": \"git\", \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"},\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\"agents\", \"agentification\", \"mcp\", \"ai\", \"json-ld\"],\n \"publishConfig\": {\"access\": \"public\"},\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"lint\": \"tsc --noEmit --pretty false\",\n \"typecheck\": \"tsc --noEmit\",\n \"verify\": \"npm run typecheck && npm run build && npm run test\",\n \"prepublishOnly\": \"npm run verify\"\n },\n \"engines\": {\"node\": \">=20\"},\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.17.5\",\n \"cheerio\": \"^1.1.2\",\n \"commander\": \"^14.0.0\",\n \"jiti\": \"^2.5.1\",\n \"zod\": \"^4.0.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.15.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.2.4\"\n }\n}\n","import pkg from '../package.json';\n\nexport const PKG_NAME = pkg.name;\nexport const VERSION = pkg.version;\nexport const CONFIG_FILENAME = `${PKG_NAME}.config.ts`;\nexport const SERVER_SCHEMA_URL = 'https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json';\n// Any dated MCP registry schema is valid; only the bare `.../server.json` (no `.schema`) 404s.\nexport const SERVER_SCHEMA_RE = /^https:\\/\\/static\\.modelcontextprotocol\\.io\\/schemas\\/\\d{4}-\\d{2}-\\d{2}\\/server\\.schema\\.json$/;\n","export interface OfferConfig {\n name?: string;\n description?: string;\n price?: string | number;\n priceCurrency?: string;\n}\n\nexport interface AigentifyConfig {\n name: string;\n description: string;\n repository: string;\n version?: string;\n mcpUrl?: string;\n npmPackage?: string;\n offer?: OfferConfig;\n}\n\nexport function defineConfig(config: AigentifyConfig): AigentifyConfig {\n return { ...config, repository: config.repository.replace(/\\/+$/, ''), version: config.version ?? '0.1.0' };\n}\n\nexport function defaultConfig(): AigentifyConfig {\n return defineConfig({\n name: 'Your product',\n description: 'A product with an agent-native interface.',\n repository: 'https://github.com/your-org/your-product',\n npmPackage: 'your-package',\n });\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsMd(config: AigentifyConfig): string {\n const packageName = config.npmPackage ?? '<NPM_PACKAGE>';\n const mcp = config.mcpUrl ?? `npx ${packageName}`;\n const offer = config.offer;\n const offerLine = offer?.price === undefined ? 'Price: <PRICE>' : `Price: ${offer.priceCurrency ?? 'USD'} ${offer.price}`;\n return `# ${config.name}\n\n## Mental model\n\n${config.name} is ${config.description}\n\nUse the product interface for product work. Use the agent interface for repeatable tasks that need structured results.\n\n## The faces\n\n- Product: ${config.repository}\n- MCP: ${mcp}\n- Package: ${packageName}\n\n## MCP tools\n\n| Tool | Input | Result |\n| --- | --- | --- |\n| audit | target | An agent-readiness report with a score and gaps. |\n| gen | artifact and params | A generated agent-native artifact. |\n\n## The loop\n\n1. Audit the target.\n2. Fix the highest-impact gap.\n3. Generate or publish the missing artifact.\n4. Audit again and keep the report with the release.\n\n## Rules\n\n- Treat the product description and prices as source facts.\n- Return structured data when a tool provides it.\n- Ask for missing information before making a high-impact change.\n- Keep public agent instructions about the product and its use.\n\n## Offer\n\n${offer?.description ?? '<OFFER_DESCRIPTION>'}\n\n${offerLine}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsRoute(config: AigentifyConfig, framework = 'static'): string {\n if (framework === 'next') {\n return `# Serve /agents.md from a Next route\n\nCopy AGENTS.md to a public directory, or add this force-static route:\n\n\\`\\`\\`ts\nimport { readFile } from 'node:fs/promises';\n\nexport const dynamic = 'force-static';\n\nexport async function GET() {\n const body = await readFile('AGENTS.md', 'utf8');\n return new Response(body, { headers: { 'content-type': 'text/markdown; charset=utf-8' } });\n}\n\\`\\`\\`\n\nProduct: ${config.name}\n`;\n }\n return `# Serve /agents.md\n\nCopy the generated AGENTS.md file to public/agents.md and serve it as a static text/markdown response.\n\nProduct: ${config.name}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateOffer(config: AigentifyConfig): string {\n const offer = config.offer ?? {};\n const data = {\n '@context': 'https://schema.org',\n '@type': 'SoftwareApplication',\n name: config.name,\n description: config.description,\n applicationCategory: 'DeveloperApplication',\n offers: [{\n '@type': 'Offer',\n name: offer.name ?? `${config.name} access`,\n ...(offer.description ? { description: offer.description } : {}),\n ...(offer.price === undefined ? {} : { price: String(offer.price) }),\n priceCurrency: offer.priceCurrency ?? 'USD',\n }],\n };\n return `${JSON.stringify(data, null, 2)}\\n`;\n}\n","import { SERVER_SCHEMA_URL } from '../constants.js';\nimport type { AigentifyConfig } from '../config.js';\n\nexport function generateServerJson(config: AigentifyConfig): string {\n const serverName = config.name.includes('/') ? config.name : `io.github.pooriaarab/${config.name.toLowerCase().replace(/[^a-z0-9._-]+/g, '-')}`;\n const server: Record<string, unknown> = {\n $schema: SERVER_SCHEMA_URL,\n name: serverName,\n description: config.description,\n repository: { url: config.repository, source: 'github' },\n version: config.version ?? '0.1.0',\n };\n if (config.mcpUrl) server.remotes = [{ type: 'streamable-http', url: config.mcpUrl }];\n else server.packages = [{ registryType: 'npm', registryBaseUrl: 'https://registry.npmjs.org', identifier: config.npmPackage ?? 'aigentify', version: config.version ?? '0.1.0', transport: { type: 'stdio' }, runtimeHint: 'npx', packageArguments: [{ type: 'positional', valueHint: 'subcommand', value: 'mcp' }] }];\n return `${JSON.stringify(server, null, 2)}\\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\nimport { defaultConfig, defineConfig } from '../config.js';\nimport { generateAgentsMd } from './agents.js';\nimport { generateAgentsRoute } from './agents-route.js';\nimport { generateOffer } from './offer.js';\nimport { generateServerJson } from './server.js';\nexport * from './agents.js';\nexport * from './agents-route.js';\nexport * from './offer.js';\nexport * from './server.js';\n\nexport type GeneratedArtifact = 'agents-md' | 'server-json' | 'offer' | 'agents-route';\nexport type GenerateParams = Partial<AigentifyConfig> & { framework?: string };\n\nfunction configFromParams(params: GenerateParams = {}): AigentifyConfig {\n const base = defaultConfig();\n return defineConfig({ ...base, ...params, offer: { ...(base.offer ?? {}), ...(params.offer ?? {}) } });\n}\n\nexport function generate(artifact: GeneratedArtifact, params: GenerateParams = {}): string {\n const config = configFromParams(params);\n if (artifact === 'agents-md') return generateAgentsMd(config);\n if (artifact === 'server-json') return generateServerJson(config);\n if (artifact === 'offer') return generateOffer(config);\n if (artifact === 'agents-route') return generateAgentsRoute(config, params.framework);\n throw new Error(`Unknown artifact: ${artifact}`);\n}\n"],"mappings":";AAAA,SAAS,UAAU,SAAS,YAAY;AACxC,OAAO,UAAU;;;ACDjB;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,SAAW;AAAA,EACX,aAAe;AAAA,EACf,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,KAAO,EAAC,WAAa,eAAe,iBAAiB,cAAa;AAAA,EAClE,SAAW,EAAC,KAAK,EAAC,OAAS,qBAAqB,QAAU,mBAAmB,SAAW,mBAAkB,EAAC;AAAA,EAC3G,OAAS,CAAC,MAAM;AAAA,EAChB,YAAc,EAAC,MAAQ,OAAO,KAAO,kDAAiD;AAAA,EACtF,UAAY;AAAA,EACZ,MAAQ;AAAA,EACR,UAAY,CAAC,UAAU,kBAAkB,OAAO,MAAM,SAAS;AAAA,EAC/D,eAAiB,EAAC,QAAU,SAAQ;AAAA,EACpC,SAAW;AAAA,IACT,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,WAAa;AAAA,IACb,QAAU;AAAA,IACV,gBAAkB;AAAA,EACpB;AAAA,EACA,SAAW,EAAC,MAAQ,OAAM;AAAA,EAC1B,cAAgB;AAAA,IACd,6BAA6B;AAAA,IAC7B,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,EACT;AAAA,EACA,iBAAmB;AAAA,IACjB,eAAe;AAAA,IACf,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,QAAU;AAAA,EACZ;AACF;;;ACnCO,IAAM,WAAW,gBAAI;AACrB,IAAM,UAAU,gBAAI;AACpB,IAAM,kBAAkB,GAAG,QAAQ;AACnC,IAAM,oBAAoB;AAE1B,IAAM,mBAAmB;;;AFShC,IAAM,UAAU,oBAAI,IAAI,CAAC,QAAQ,gBAAgB,QAAQ,YAAY,SAAS,mBAAmB,CAAC;AAClG,IAAM,UAAkC;AAAA,EACtC,aAAa;AAAA,EAAI,yBAAyB;AAAA,EAAI,eAAe;AAAA,EAAI,KAAK;AAAA,EACtE,gBAAgB;AAAA,EAAI,gBAAgB;AAAA,EAAI,YAAY;AAAA,EAAI,SAAS;AACnE;AACA,IAAM,QAAgC;AAAA,EACpC,aAAa;AAAA,EACb,yBAAyB;AAAA,EACzB,eAAe,yCAAyC,iBAAiB;AAAA,EACzE,KAAK;AAAA,EACL,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,SAAS;AACX;AAEA,SAAS,MAAM,IAAY,QAAqB,MAA0B;AAAE,SAAO,EAAE,IAAI,QAAQ,MAAM,QAAQ,QAAQ,EAAE,EAAE;AAAG;AAEvH,SAAS,iBAAiB,QAA8B;AAC7D,QAAM,WAAW,OAAO,OAAO,UAAQ,KAAK,WAAW,IAAI;AAC3D,QAAM,QAAQ,SAAS,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,QAAQ,CAAC;AACjE,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,SAAS,SAAS,OAAO,CAAC,KAAK,SAAS,OAAO,KAAK,WAAW,SAAS,KAAK,SAAS,KAAK,WAAW,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC;AAC5I,SAAO,KAAK,MAAO,SAAS,QAAS,GAAG;AAC1C;AAEA,eAAe,UAAU,WAAsC;AAC7D,QAAM,UAAU,MAAM,QAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AAChE,QAAM,QAAkB,CAAC;AACzB,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,YAAY,KAAK,CAAC,QAAQ,IAAI,MAAM,IAAI,EAAG,OAAM,KAAK,GAAG,MAAM,UAAU,KAAK,KAAK,WAAW,MAAM,IAAI,CAAC,CAAC;AAAA,aAC3G,MAAM,OAAO,EAAG,OAAM,KAAK,KAAK,KAAK,WAAW,MAAM,IAAI,CAAC;AAAA,EACtE;AACA,SAAO;AACT;AAEA,eAAe,SAAS,MAA2C;AACjE,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI;AAAE,WAAO,MAAM,SAAS,MAAM,MAAM;AAAA,EAAG,QAAQ;AAAE,WAAO;AAAA,EAAI;AAClE;AAEA,SAAS,SAAS,OAAiB,MAAkC;AACnE,SAAO,MAAM,KAAK,UAAQ;AACxB,UAAM,aAAa,KAAK,WAAW,MAAM,GAAG;AAC5C,WAAO,KAAK,SAAS,UAAU,MAAM,QAAQ,WAAW,SAAS,IAAI,IAAI,WAAW;AAAA,EACtF,CAAC;AACH;AAEA,SAAS,UAAU,MAAmD;AACpE,MAAI;AACF,UAAM,QAAiB,KAAK,MAAM,IAAI;AACtC,WAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAAI,QAAmC;AAAA,EAC1G,QAAQ;AAAE,WAAO;AAAA,EAAW;AAC9B;AAEA,SAAS,YAAY,MAAkD;AACrE,QAAM,QAAQ,UAAU,IAAI;AAC5B,MAAI,CAAC,MAAO,QAAO,EAAE,OAAO,OAAO,QAAQ,iCAAiC;AAC5E,MAAI,OAAO,MAAM,YAAY,YAAY,CAAC,iBAAiB,KAAK,MAAM,OAAO,EAAG,QAAO,EAAE,OAAO,OAAO,QAAQ,kEAAkE,iBAAiB,oCAAoC;AACtO,QAAM,UAAU,CAAC,QAAQ,eAAe,cAAc,SAAS,EAAE,OAAO,SAAO,CAAC,MAAM,GAAG,CAAC;AAC1F,MAAI,QAAQ,OAAQ,QAAO,EAAE,OAAO,OAAO,QAAQ,2BAA2B,QAAQ,KAAK,IAAI,CAAC,IAAI;AACpG,MAAI,CAAC,MAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,QAAQ,MAAM,QAAQ,EAAG,QAAO,EAAE,OAAO,OAAO,QAAQ,iDAAiD;AACrJ,SAAO,EAAE,OAAO,MAAM,QAAQ,oDAAoD;AACpF;AAEA,SAAS,SAAS,OAA0B;AAC1C,SAAO,MAAM,KAAK,UAAQ,yBAAyB,KAAK,IAAI,KAAK,uCAAuC,KAAK,IAAI,KAAK,eAAe,KAAK,IAAI,CAAC;AACjJ;AAEA,SAAS,WAAW,MAAuB;AACzC,SAAO,sFAAsF,KAAK,IAAI;AACxG;AAEA,SAAS,WAAW,MAAuB;AACzC,SAAO,EAAE,WAAW,KAAK,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,gBAAgB,KAAK,IAAI,KAAK,mBAAmB,KAAK,IAAI,KAAK,iBAAiB,KAAK,IAAI,KAAK,gBAAgB,KAAK,IAAI,KAAK,qBAAqB,KAAK,IAAI,KAAK,mBAAmB,KAAK,IAAI;AACzP;AAEA,SAAS,WAAW,MAAsB;AACxC,QAAM,QAAQ,kBAAkB,KAAK,IAAI;AACzC,MAAI,CAAC,SAAS,MAAM,UAAU,OAAW,QAAO;AAChD,QAAM,OAAO,KAAK,MAAM,MAAM,KAAK;AACnC,QAAM,cAAc,UAAU,KAAK,KAAK,MAAM,MAAM,CAAC,EAAE,MAAM,CAAC;AAC9D,SAAO,aAAa,UAAU,SAAY,OAAO,KAAK,MAAM,GAAG,MAAM,CAAC,EAAE,SAAS,YAAY,KAAK;AACpG;AAEA,eAAe,kBAAkB,WAAsC;AACrE,QAAM,QAAQ,MAAM,UAAU,SAAS;AACvC,QAAM,aAAa,SAAS,OAAO,WAAW;AAC9C,QAAM,aAAa,SAAS,OAAO,aAAa;AAChD,QAAM,UAAU,MAAM,KAAK,UAAQ,uBAAuB,KAAK,KAAK,WAAW,MAAM,GAAG,CAAC,CAAC;AAC1F,QAAM,cAAc,SAAS,OAAO,cAAc;AAClD,QAAM,cAAc,MAAM,SAAS,WAAW;AAC9C,QAAM,YAAY,yCAAyC,KAAK,WAAW;AAC3E,QAAM,aAAa,MAAM,SAAS,UAAU;AAC5C,QAAM,aAAa,CAAC,YAAY,GAAG,MAAM,QAAQ,IAAI,MAAM,OAAO,UAAQ,kDAAkD,KAAK,IAAI,CAAC,EAAE,IAAI,QAAQ,CAAC,CAAC;AACtJ,QAAM,WAAW,SAAS,OAAO,UAAU;AAC3C,QAAM,cAAc,SAAS,OAAO,aAAa;AACjD,QAAM,aAAa,MAAM,OAAO,UAAQ,iDAAiD,KAAK,IAAI,CAAC;AACnG,QAAM,aAAa,CAAC,WAAW,UAAU,GAAG,GAAG,MAAM,QAAQ,IAAI,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,KAAK,IAAI;AACrG,SAAO;AAAA,IACL,QAAQ,EAAE,QAAQ,aAAa,MAAM,KAAK,aAAa,iBAAiB,MAAM,WAAW;AAAA,IACzF,QAAQ,EAAE,QAAQ,aAAa,MAAM,KAAK,aAAa,oBAAoB,MAAM,MAAM,SAAS,UAAU,EAAE;AAAA,IAC5G,KAAK,EAAE,QAAQ,WAAW,cAAc,YAAY,MAAM,KAAK,aAAa,IAAI,MAAM,GAAG;AAAA,IACzF,MAAM,EAAE,QAAQ,KAAK,aAAa,cAAc,MAAM,WAAW,KAAK,IAAI,EAAE;AAAA,IAC5E,MAAM,EAAE,QAAQ,WAAW,MAAM,KAAK,aAAa,cAAc,MAAM,MAAM,SAAS,QAAQ,EAAE;AAAA,IAChG,SAAS,EAAE,QAAQ,cAAc,MAAM,KAAK,aAAa,mBAAmB,MAAM,MAAM,SAAS,WAAW,EAAE;AAAA,IAC9G;AAAA,IAAY,QAAQ,QAAQ,WAAW,cAAc,SAAS;AAAA,IAAG,gBAAgB;AAAA,EACnF;AACF;AAEA,eAAe,UAAU,SAAkC,KAAgC;AACzF,MAAI;AACF,UAAM,WAAW,MAAM,QAAQ,KAAK,EAAE,QAAQ,YAAY,QAAQ,GAAI,EAAE,CAAC;AACzE,WAAO,EAAE,QAAQ,SAAS,QAAQ,aAAa,SAAS,QAAQ,IAAI,cAAc,KAAK,IAAI,MAAM,MAAM,SAAS,KAAK,EAAE;AAAA,EACzH,QAAQ;AAAE,WAAO,EAAE,QAAQ,GAAG,aAAa,IAAI,MAAM,GAAG;AAAA,EAAG;AAC7D;AAEA,eAAe,YAAY,QAAgB,SAAqD;AAC9F,QAAM,OAAO,OAAO,QAAQ,QAAQ,EAAE;AACtC,QAAM,CAAC,QAAQ,QAAQ,KAAK,MAAM,MAAM,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,IACnE,UAAU,SAAS,GAAG,IAAI,YAAY;AAAA,IAAG,UAAU,SAAS,GAAG,IAAI,cAAc;AAAA,IAAG,UAAU,SAAS,GAAG,IAAI,kBAAkB;AAAA,IAChI,UAAU,SAAS,IAAI;AAAA,IAAG,UAAU,SAAS,GAAG,IAAI,WAAW;AAAA,IAAG,UAAU,SAAS,GAAG,IAAI,cAAc;AAAA,EAC5G,CAAC;AACD,QAAM,YAAY,CAAC,QAAQ,QAAQ,KAAK,MAAM,MAAM,OAAO;AAC3D,SAAO,EAAE,QAAQ,QAAQ,KAAK,MAAM,MAAM,SAAS,YAAY,CAAC,KAAK,MAAM,WAAW,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI,GAAG,QAAQ,OAAO,UAAU,OAAO,OAAO,SAAS,OAAO,IAAI,UAAU,OAAO,IAAI,SAAS,KAAK,gBAAgB,UAAU,MAAM,UAAQ,KAAK,WAAW,CAAC,EAAE;AAC3Q;AAEA,SAAS,YAAY,UAAkC;AACrD,QAAM,gBAAgB,SAAS,OAAO,WAAW,OAAO,SAAS,OAAO,KAAK,KAAK,EAAE,SAAS,KAAK,sDAAsD,KAAK,SAAS,OAAO,WAAW;AACxL,QAAM,eAA4B,SAAS,OAAO,WAAW,IAAI,SAAS,gBAAgB,SAAS;AACnG,QAAM,eAA4B,CAAC,gBAAiB,SAAS,OAAO,WAAW,IAAI,SAAS,OAAQ,WAAW,SAAS,OAAO,IAAI,IAAI,SAAS;AAChJ,QAAM,aAAa,SAAS,OAAO,WAAW,MAAM,YAAY,SAAS,OAAO,IAAI,IAAI;AACxF,QAAM,eAA4B,SAAS,OAAO,WAAW,IAAI,SAAS,CAAC,SAAS,SAAS,OAAO,YAAY,QAAQ,SAAS;AACjI,QAAM,YAAyB,SAAS,iBAAiB,SAAS,SAAS,SAAS,SAAS;AAC7F,QAAM,aAAa,CAAC,SAAS,KAAK,MAAM,SAAS,OAAO,IAAI;AAC5D,QAAM,cAA2B,SAAS,KAAK,WAAW,IAAI,SAAS,SAAS,UAAU,IAAI,SAAS;AACvG,QAAM,eAA4B,CAAC,SAAS,UAAU,KAAK,CAAC,gBAAiB,SAAS,KAAK,WAAW,IAAI,SAAS,OAAQ,WAAW,SAAS,UAAU,IAAI,SAAS;AACtK,QAAM,aAA0B,SAAS,KAAK,WAAW,IAAI,SAAS,SAAS,KAAK,UAAU,OAAO,SAAS,KAAK,SAAS,OAAO,SAAS,KAAK,KAAK,KAAK,IAAI,SAAS;AACxK,QAAM,gBAA6B,SAAS,QAAQ,WAAW,IAAI,SAAS,SAAS,QAAQ,UAAU,OAAO,SAAS,QAAQ,SAAS,OAAO,SAAS,QAAQ,KAAK,KAAK,IAAI,SAAS;AACvL,SAAO;AAAA,IACL,MAAM,aAAa,cAAc,gBAAgB,4BAA4B,SAAS,OAAO,WAAW,IAAI,kCAAkC,uBAAuB;AAAA,IACrK,MAAM,yBAAyB,cAAc,iBAAiB,SAAS,yDAAyD,iBAAiB,OAAO,0CAA0C,kDAAkD;AAAA,IACpP,MAAM,eAAe,cAAc,YAAY,QAAQ,WAAW,SAAS,YAAY,WAAW,CAAC,SAAS,SAAS,iCAAiC,0BAA0B;AAAA,IAChL,MAAM,OAAO,WAAW,SAAS,iBAAiB,sCAAsC,SAAS,SAAS,iCAAiC,2BAA2B;AAAA,IACtK,MAAM,gBAAgB,aAAa,gBAAgB,SAAS,gCAAgC,gBAAgB,SAAS,oCAAoC,6BAA6B;AAAA,IACtL,MAAM,gBAAgB,cAAc,iBAAiB,SAAS,sDAAsD,iBAAiB,OAAO,uCAAuC,+DAA+D;AAAA,IAClP,MAAM,YAAY,YAAY,eAAe,SAAS,2BAA2B,eAAe,SAAS,iCAAiC,sBAAsB;AAAA,IAChK,MAAM,WAAW,eAAe,kBAAkB,SAAS,8BAA8B,kBAAkB,SAAS,gCAAgC,yBAAyB;AAAA,EAC/K;AACF;AAEA,eAAsB,YAAY,QAAgB,UAAwB,CAAC,GAAyB;AAClG,QAAM,aAAa,MAAM,KAAK,MAAM,EAAE,MAAM,MAAM,MAAS;AAC3D,QAAM,WAAW,YAAY,YAAY,IAAI,MAAM,kBAAkB,MAAM,IAAI,MAAM,YAAY,QAAQ,QAAQ,SAAS,WAAW,KAAK;AAC1I,QAAM,SAAS,YAAY,QAAQ;AACnC,QAAM,OAAO,OAAO,OAAO,UAAQ,KAAK,WAAW,UAAU,KAAK,WAAW,MAAM,EAAE,IAAI,WAAS,EAAE,IAAI,KAAK,IAAI,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,EAAE,EAAE,EAAE;AACxJ,SAAO,EAAE,QAAQ,OAAO,iBAAiB,MAAM,GAAG,QAAQ,KAAK;AACjE;AAEO,SAAS,kBAAkB,QAA6B;AAC7D,QAAM,QAAQ,CAAC,GAAG,OAAO,MAAM,KAAK,OAAO,KAAK,QAAQ,EAAE;AAC1D,aAAW,QAAQ,OAAO,OAAQ,OAAM,KAAK,GAAG,KAAK,OAAO,YAAY,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK,EAAE,KAAK,KAAK,IAAI,EAAE;AAC/G,QAAM,KAAK,IAAI,OAAO;AACtB,MAAI,CAAC,OAAO,KAAK,OAAQ,OAAM,KAAK,OAAO;AAAA,MACtC,QAAO,KAAK,QAAQ,CAAC,KAAK,UAAU,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,EAAE,KAAK,IAAI,GAAG,EAAE,CAAC;AAC1F,SAAO,MAAM,KAAK,IAAI;AACxB;;;AGrKO,SAAS,aAAa,QAA0C;AACrE,SAAO,EAAE,GAAG,QAAQ,YAAY,OAAO,WAAW,QAAQ,QAAQ,EAAE,GAAG,SAAS,OAAO,WAAW,QAAQ;AAC5G;AAEO,SAAS,gBAAiC;AAC/C,SAAO,aAAa;AAAA,IAClB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,YAAY;AAAA,EACd,CAAC;AACH;;;AC1BO,SAAS,iBAAiB,QAAiC;AAChE,QAAM,cAAc,OAAO,cAAc;AACzC,QAAM,MAAM,OAAO,UAAU,OAAO,WAAW;AAC/C,QAAM,QAAQ,OAAO;AACrB,QAAM,YAAY,OAAO,UAAU,SAAY,mBAAmB,UAAU,MAAM,iBAAiB,KAAK,IAAI,MAAM,KAAK;AACvH,SAAO,KAAK,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA,EAIvB,OAAO,IAAI,OAAO,OAAO,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAMzB,OAAO,UAAU;AAAA,SACrB,GAAG;AAAA,aACC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBtB,OAAO,eAAe,qBAAqB;AAAA;AAAA,EAE3C,SAAS;AAAA;AAEX;;;AC9CO,SAAS,oBAAoB,QAAyB,YAAY,UAAkB;AACzF,MAAI,cAAc,QAAQ;AACxB,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAeA,OAAO,IAAI;AAAA;AAAA,EAEpB;AACA,SAAO;AAAA;AAAA;AAAA;AAAA,WAIE,OAAO,IAAI;AAAA;AAEtB;;;AC1BO,SAAS,cAAc,QAAiC;AAC7D,QAAM,QAAQ,OAAO,SAAS,CAAC;AAC/B,QAAM,OAAO;AAAA,IACX,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,MAAM,OAAO;AAAA,IACb,aAAa,OAAO;AAAA,IACpB,qBAAqB;AAAA,IACrB,QAAQ,CAAC;AAAA,MACP,SAAS;AAAA,MACT,MAAM,MAAM,QAAQ,GAAG,OAAO,IAAI;AAAA,MAClC,GAAI,MAAM,cAAc,EAAE,aAAa,MAAM,YAAY,IAAI,CAAC;AAAA,MAC9D,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM,KAAK,EAAE;AAAA,MAClE,eAAe,MAAM,iBAAiB;AAAA,IACxC,CAAC;AAAA,EACH;AACA,SAAO,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA;AACzC;;;AChBO,SAAS,mBAAmB,QAAiC;AAClE,QAAM,aAAa,OAAO,KAAK,SAAS,GAAG,IAAI,OAAO,OAAO,wBAAwB,OAAO,KAAK,YAAY,EAAE,QAAQ,kBAAkB,GAAG,CAAC;AAC7I,QAAM,SAAkC;AAAA,IACtC,SAAS;AAAA,IACT,MAAM;AAAA,IACN,aAAa,OAAO;AAAA,IACpB,YAAY,EAAE,KAAK,OAAO,YAAY,QAAQ,SAAS;AAAA,IACvD,SAAS,OAAO,WAAW;AAAA,EAC7B;AACA,MAAI,OAAO,OAAQ,QAAO,UAAU,CAAC,EAAE,MAAM,mBAAmB,KAAK,OAAO,OAAO,CAAC;AAAA,MAC/E,QAAO,WAAW,CAAC,EAAE,cAAc,OAAO,iBAAiB,8BAA8B,YAAY,OAAO,cAAc,aAAa,SAAS,OAAO,WAAW,SAAS,WAAW,EAAE,MAAM,QAAQ,GAAG,aAAa,OAAO,kBAAkB,CAAC,EAAE,MAAM,cAAc,WAAW,cAAc,OAAO,MAAM,CAAC,EAAE,CAAC;AACrT,SAAO,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA;AAC3C;;;ACDA,SAAS,iBAAiB,SAAyB,CAAC,GAAoB;AACtE,QAAM,OAAO,cAAc;AAC3B,SAAO,aAAa,EAAE,GAAG,MAAM,GAAG,QAAQ,OAAO,EAAE,GAAI,KAAK,SAAS,CAAC,GAAI,GAAI,OAAO,SAAS,CAAC,EAAG,EAAE,CAAC;AACvG;AAEO,SAAS,SAAS,UAA6B,SAAyB,CAAC,GAAW;AACzF,QAAM,SAAS,iBAAiB,MAAM;AACtC,MAAI,aAAa,YAAa,QAAO,iBAAiB,MAAM;AAC5D,MAAI,aAAa,cAAe,QAAO,mBAAmB,MAAM;AAChE,MAAI,aAAa,QAAS,QAAO,cAAc,MAAM;AACrD,MAAI,aAAa,eAAgB,QAAO,oBAAoB,QAAQ,OAAO,SAAS;AACpF,QAAM,IAAI,MAAM,qBAAqB,QAAQ,EAAE;AACjD;","names":[]} |
+6
-4
@@ -49,3 +49,4 @@ #!/usr/bin/env node | ||
| name: "aigentify", | ||
| version: "0.1.0", | ||
| version: "0.1.1", | ||
| mcpName: "io.github.pooriaarab/aigentify", | ||
| description: "Audit and generate agent-native product surfaces", | ||
@@ -90,3 +91,4 @@ type: "module", | ||
| var CONFIG_FILENAME = `${PKG_NAME}.config.ts`; | ||
| var SERVER_SCHEMA_URL = "https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json"; | ||
| var SERVER_SCHEMA_URL = "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json"; | ||
| var SERVER_SCHEMA_RE = /^https:\/\/static\.modelcontextprotocol\.io\/schemas\/\d{4}-\d{2}-\d{2}\/server\.schema\.json$/; | ||
@@ -159,3 +161,3 @@ // src/audit.ts | ||
| if (!value) return { valid: false, reason: "server.json is not valid JSON." }; | ||
| if (value.$schema !== SERVER_SCHEMA_URL) return { valid: false, reason: `server.json must use the exact schema URL ${SERVER_SCHEMA_URL}.` }; | ||
| if (typeof value.$schema !== "string" || !SERVER_SCHEMA_RE.test(value.$schema)) return { valid: false, reason: `server.json "$schema" must be a dated MCP registry schema like ${SERVER_SCHEMA_URL} (the bare .../server.json 404s).` }; | ||
| const missing = ["name", "description", "repository", "version"].filter((key) => !value[key]); | ||
@@ -383,3 +385,3 @@ if (missing.length) return { valid: false, reason: `server.json is missing: ${missing.join(", ")}.` }; | ||
| if (config.mcpUrl) server.remotes = [{ type: "streamable-http", url: config.mcpUrl }]; | ||
| else server.packages = [{ registry_type: "npm", identifier: config.npmPackage ?? "aigentify", version: config.version ?? "0.1.0", runtime_hint: "npx", transport: { type: "stdio" } }]; | ||
| else server.packages = [{ registryType: "npm", registryBaseUrl: "https://registry.npmjs.org", identifier: config.npmPackage ?? "aigentify", version: config.version ?? "0.1.0", transport: { type: "stdio" }, runtimeHint: "npx", packageArguments: [{ type: "positional", valueHint: "subcommand", value: "mcp" }] }]; | ||
| return `${JSON.stringify(server, null, 2)} | ||
@@ -386,0 +388,0 @@ `; |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/mcp.ts","../src/audit.ts","../package.json","../src/constants.ts","../src/config.ts","../src/generators/agents.ts","../src/generators/agents-route.ts","../src/generators/offer.ts","../src/generators/server.ts","../src/generators/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { auditTarget } from './audit.js';\nimport { PKG_NAME, VERSION } from './constants.js';\nimport { generate, type GenerateParams, type GeneratedArtifact } from './generators/index.js';\n\nconst artifacts = ['agents-md', 'server-json', 'offer', 'agents-route'] as const;\n\nexport function createMcpServer(): McpServer {\n const server = new McpServer({ name: PKG_NAME, version: VERSION });\n server.registerTool('audit', {\n description: 'Audit a local directory or live URL for agent-native readiness.',\n inputSchema: { target: z.string() },\n }, async ({ target }) => ({ content: [{ type: 'text', text: JSON.stringify(await auditTarget(target), null, 2) }] }));\n server.registerTool('gen', {\n description: 'Generate an agent-native artifact as text.',\n inputSchema: { artifact: z.enum(artifacts), params: z.record(z.string(), z.unknown()).optional() },\n }, async ({ artifact, params }) => ({ content: [{ type: 'text', text: generate(artifact as GeneratedArtifact, (params ?? {}) as GenerateParams) }] }));\n return server;\n}\n\nexport async function startMcpServer(): Promise<void> {\n const server = createMcpServer();\n await server.connect(new StdioServerTransport());\n}\n\nif (import.meta.url === `file://${process.argv[1]}`) startMcpServer().catch(error => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n});\n","import { readFile, readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { SERVER_SCHEMA_URL } from './constants.js';\n\nexport type AuditStatus = 'pass' | 'fail' | 'warn' | 'na';\nexport interface AuditCheck { id: string; status: AuditStatus; note: string; weight: number }\nexport interface AuditGap { id: string; note: string; fix: string }\nexport interface AuditReport { target: string; score: number; checks: AuditCheck[]; gaps: AuditGap[] }\nexport interface AuditOptions { fetch?: typeof globalThis.fetch }\n\ninterface Endpoint { status: number; contentType: string; text: string }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n honestText: string; hasMcp: boolean; networkFailure: boolean;\n}\n\nconst SKIPPED = new Set(['.git', 'node_modules', 'dist', 'coverage', '.next', '_reference_geoaeo']);\nconst WEIGHTS: Record<string, number> = {\n 'agents-md': 15, 'agents-md-public-safe': 10, 'server-json': 15, mcp: 15,\n 'offer-jsonld': 15, 'honest-offer': 10, 'llms-txt': 10, sitemap: 10,\n};\nconst FIXES: Record<string, string> = {\n 'agents-md': 'Add a public AGENTS.md at the target root or serve /agents.md as text/markdown.',\n 'agents-md-public-safe': 'Rewrite AGENTS.md as product guidance. Remove repository paths and contributor instructions.',\n 'server-json': `Add server.json and set \"$schema\" to \"${SERVER_SCHEMA_URL}\". Include a repository and a remotes or packages entry.`,\n mcp: 'Publish server.json, .mcp.json, or an MCP entry point.',\n 'offer-jsonld': 'Publish JSON-LD with @type Offer, or a SoftwareApplication with an offers property.',\n 'honest-offer': 'State the real price plainly. Remove scarcity, countdown, and urgency language.',\n 'llms-txt': 'Publish /llms.txt with a concise product description.',\n sitemap: 'Publish /sitemap.xml for URL discovery.',\n};\n\nfunction check(id: string, status: AuditStatus, note: string): AuditCheck { return { id, status, note, weight: WEIGHTS[id] }; }\n\nexport function scoreAuditChecks(checks: AuditCheck[]): number {\n const relevant = checks.filter(item => item.status !== 'na');\n const total = relevant.reduce((sum, item) => sum + item.weight, 0);\n if (!total) return 0;\n const earned = relevant.reduce((sum, item) => sum + (item.status === 'pass' ? item.weight : item.status === 'warn' ? item.weight / 2 : 0), 0);\n return Math.round((earned / total) * 100);\n}\n\nasync function walkFiles(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n if (entry.isDirectory() && !SKIPPED.has(entry.name)) files.push(...await walkFiles(path.join(directory, entry.name)));\n else if (entry.isFile()) files.push(path.join(directory, entry.name));\n }\n return files;\n}\n\nasync function readText(file: string | undefined): Promise<string> {\n if (!file) return '';\n try { return await readFile(file, 'utf8'); } catch { return ''; }\n}\n\nfunction findFile(files: string[], name: string): string | undefined {\n return files.find(file => {\n const normalized = file.replaceAll('\\\\', '/');\n return path.basename(normalized) === name || normalized.endsWith(`/${name}/route.ts`);\n });\n}\n\nfunction parseJson(text: string): Record<string, unknown> | undefined {\n try {\n const value: unknown = JSON.parse(text);\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n } catch { return undefined; }\n}\n\nfunction validServer(text: string): { valid: boolean; reason: string } {\n const value = parseJson(text);\n if (!value) return { valid: false, reason: 'server.json is not valid JSON.' };\n if (value.$schema !== SERVER_SCHEMA_URL) return { valid: false, reason: `server.json must use the exact schema URL ${SERVER_SCHEMA_URL}.` };\n const missing = ['name', 'description', 'repository', 'version'].filter(key => !value[key]);\n if (missing.length) return { valid: false, reason: `server.json is missing: ${missing.join(', ')}.` };\n if (!Array.isArray(value.remotes) && !Array.isArray(value.packages)) return { valid: false, reason: 'server.json needs a remotes or packages entry.' };\n return { valid: true, reason: 'server.json has the required MCP registry fields.' };\n}\n\nfunction hasOffer(texts: string[]): boolean {\n return texts.some(text => /\"@type\"\\s*:\\s*\"Offer\"/i.test(text) || /\"@type\"\\s*:\\s*\"SoftwareApplication\"/i.test(text) && /\"offers\"\\s*:/.test(text));\n}\n\nfunction hasUrgency(text: string): boolean {\n return /limited time|act now|hurry|expires|only\\s+\\d+\\s+left|ends in|sign up now|countdown/i.test(text);\n}\n\nfunction publicSafe(text: string): boolean {\n return !(/\\bsrc\\//i.test(text) || /\\bapps\\//i.test(text) || /\\bpackages\\//i.test(text) || /\\b[\\w.-]+\\.ts\\b/i.test(text) || /npm run build/i.test(text) || /\\btsconfig\\b/i.test(text) || /\\bcontributors?\\b/i.test(text) || /^#+\\s*layout\\b/im.test(text));\n}\n\nfunction offerBlock(text: string): string {\n const match = /^#+\\s*Offer\\b/im.exec(text);\n if (!match || match.index === undefined) return '';\n const rest = text.slice(match.index);\n const nextHeading = /^#+\\s+/m.exec(rest.slice(match[0].length));\n return nextHeading?.index === undefined ? rest : rest.slice(0, match[0].length + nextHeading.index);\n}\n\nasync function directorySnapshot(directory: string): Promise<Snapshot> {\n const files = await walkFiles(directory);\n const agentsFile = findFile(files, 'AGENTS.md');\n const serverFile = findFile(files, 'server.json');\n const mcpFile = files.find(file => /(?:^|\\/)\\.mcp\\.json$/.test(file.replaceAll('\\\\', '/')));\n const packageFile = findFile(files, 'package.json');\n const packageText = await readText(packageFile);\n const hasMcpBin = /\"(?:aigentify|[^\"\\n]*mcp[^\"\\n]*)\"\\s*:/i.test(packageText);\n const agentsText = await readText(agentsFile);\n const offerTexts = [agentsText, ...await Promise.all(files.filter(file => /\\.(html?|json|jsonld|md|mdx|tsx|jsx|js|mjs|ts)$/.test(file)).map(readText))];\n const llmsFile = findFile(files, 'llms.txt');\n const sitemapFile = findFile(files, 'sitemap.xml');\n const offerFiles = files.filter(file => /\\.jsonld$|(?:^|\\/)offer[^/]*\\.(?:json|html?)$/i.test(file));\n const honestText = [offerBlock(agentsText), ...await Promise.all(offerFiles.map(readText))].join('\\n');\n return {\n agents: { status: agentsFile ? 200 : 404, contentType: 'text/markdown', text: agentsText },\n server: { status: serverFile ? 200 : 404, contentType: 'application/json', text: await readText(serverFile) },\n mcp: { status: mcpFile || serverFile || hasMcpBin ? 200 : 404, contentType: '', text: '' },\n home: { status: 200, contentType: 'text/plain', text: offerTexts.join('\\n') },\n llms: { status: llmsFile ? 200 : 404, contentType: 'text/plain', text: await readText(llmsFile) },\n sitemap: { status: sitemapFile ? 200 : 404, contentType: 'application/xml', text: await readText(sitemapFile) },\n honestText, hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), networkFailure: false,\n };\n}\n\nasync function fetchText(fetcher: typeof globalThis.fetch, url: string): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000) });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text() };\n } catch { return { status: 0, contentType: '', text: '' }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n const [agents, server, mcp, home, llms, sitemap] = await Promise.all([\n fetchText(fetcher, `${base}/agents.md`), fetchText(fetcher, `${base}/server.json`), fetchText(fetcher, `${base}/.well-known/mcp`),\n fetchText(fetcher, base), fetchText(fetcher, `${base}/llms.txt`), fetchText(fetcher, `${base}/sitemap.xml`),\n ]);\n const endpoints = [agents, server, mcp, home, llms, sitemap];\n return { agents, server, mcp, home, llms, sitemap, honestText: [home.text, offerBlock(agents.text)].join('\\n'), hasMcp: server.status >= 200 && server.status < 400 || mcp.status >= 200 && mcp.status < 400, networkFailure: endpoints.every(item => item.status === 0) };\n}\n\nfunction buildChecks(snapshot: Snapshot): AuditCheck[] {\n const agentsPresent = snapshot.agents.status === 200 && snapshot.agents.text.trim().length > 0 && /(?:text\\/(?:markdown|plain)|application\\/markdown)/i.test(snapshot.agents.contentType);\n const agentsStatus: AuditStatus = snapshot.agents.status === 0 ? 'warn' : agentsPresent ? 'pass' : 'fail';\n const publicStatus: AuditStatus = !agentsPresent ? (snapshot.agents.status === 0 ? 'warn' : 'na') : publicSafe(snapshot.agents.text) ? 'pass' : 'warn';\n const serverInfo = snapshot.server.status === 200 ? validServer(snapshot.server.text) : undefined;\n const serverStatus: AuditStatus = snapshot.server.status === 0 ? 'warn' : !snapshot.hasMcp ? 'na' : serverInfo?.valid ? 'pass' : 'fail';\n const mcpStatus: AuditStatus = snapshot.networkFailure ? 'warn' : snapshot.hasMcp ? 'pass' : 'fail';\n const offerTexts = [snapshot.home.text, snapshot.agents.text];\n const offerStatus: AuditStatus = snapshot.home.status === 0 ? 'warn' : hasOffer(offerTexts) ? 'pass' : 'fail';\n const honestStatus: AuditStatus = !hasOffer(offerTexts) && !agentsPresent ? (snapshot.home.status === 0 ? 'warn' : 'na') : hasUrgency(snapshot.honestText) ? 'warn' : 'pass';\n const llmsStatus: AuditStatus = snapshot.llms.status === 0 ? 'warn' : snapshot.llms.status >= 200 && snapshot.llms.status < 400 && snapshot.llms.text.trim() ? 'pass' : 'fail';\n const sitemapStatus: AuditStatus = snapshot.sitemap.status === 0 ? 'warn' : snapshot.sitemap.status >= 200 && snapshot.sitemap.status < 400 && snapshot.sitemap.text.trim() ? 'pass' : 'fail';\n return [\n check('agents-md', agentsStatus, agentsPresent ? 'AGENTS.md is available.' : snapshot.agents.status === 0 ? 'The AGENTS.md request failed.' : 'AGENTS.md is missing.'),\n check('agents-md-public-safe', publicStatus, publicStatus === 'pass' ? 'AGENTS.md describes the product as a public surface.' : publicStatus === 'na' ? 'No AGENTS.md is available to inspect.' : 'AGENTS.md contains repository-internal guidance.'),\n check('server-json', serverStatus, serverInfo?.valid ? serverInfo.reason : serverInfo?.reason ?? (!snapshot.hasMcp ? 'No MCP surface was detected.' : 'server.json is missing.')),\n check('mcp', mcpStatus, snapshot.networkFailure ? 'The MCP discovery request failed.' : snapshot.hasMcp ? 'An MCP surface is available.' : 'No MCP surface was found.'),\n check('offer-jsonld', offerStatus, offerStatus === 'pass' ? 'Offer JSON-LD is available.' : offerStatus === 'warn' ? 'The offer could not be checked.' : 'No Offer JSON-LD was found.'),\n check('honest-offer', honestStatus, honestStatus === 'pass' ? 'Offer language states the price without pressure.' : honestStatus === 'na' ? 'No offer or Offer block was found.' : 'Offer language contains scarcity, countdown, or urgency copy.'),\n check('llms-txt', llmsStatus, llmsStatus === 'pass' ? 'llms.txt is available.' : llmsStatus === 'warn' ? 'The llms.txt request failed.' : 'llms.txt is missing.'),\n check('sitemap', sitemapStatus, sitemapStatus === 'pass' ? 'sitemap.xml is available.' : sitemapStatus === 'warn' ? 'The sitemap request failed.' : 'sitemap.xml is missing.'),\n ];\n}\n\nexport async function auditTarget(target: string, options: AuditOptions = {}): Promise<AuditReport> {\n const targetStat = await stat(target).catch(() => undefined);\n const snapshot = targetStat?.isDirectory() ? await directorySnapshot(target) : await urlSnapshot(target, options.fetch ?? globalThis.fetch);\n const checks = buildChecks(snapshot);\n const gaps = checks.filter(item => item.status === 'fail' || item.status === 'warn').map(item => ({ id: item.id, note: item.note, fix: FIXES[item.id] }));\n return { target, score: scoreAuditChecks(checks), checks, gaps };\n}\n\nexport function formatAuditReport(report: AuditReport): string {\n const lines = [`${report.target}: ${report.score}/100`, ''];\n for (const item of report.checks) lines.push(`${item.status.toUpperCase().padEnd(4)} ${item.id}: ${item.note}`);\n lines.push('', 'Gaps:');\n if (!report.gaps.length) lines.push('None.');\n else report.gaps.forEach((gap, index) => lines.push(`${index + 1}. ${gap.id}: ${gap.fix}`));\n return lines.join('\\n');\n}\n","{\n \"name\": \"aigentify\",\n \"version\": \"0.1.0\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\"aigentify\": \"dist/cli.js\", \"aigentify-mcp\": \"dist/mcp.js\"},\n \"exports\": {\".\": {\"types\": \"./dist/index.d.ts\", \"import\": \"./dist/index.js\", \"require\": \"./dist/index.cjs\"}},\n \"files\": [\"dist\"],\n \"repository\": {\"type\": \"git\", \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"},\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\"agents\", \"agentification\", \"mcp\", \"ai\", \"json-ld\"],\n \"publishConfig\": {\"access\": \"public\"},\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"lint\": \"tsc --noEmit --pretty false\",\n \"typecheck\": \"tsc --noEmit\",\n \"verify\": \"npm run typecheck && npm run build && npm run test\",\n \"prepublishOnly\": \"npm run verify\"\n },\n \"engines\": {\"node\": \">=20\"},\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.17.5\",\n \"cheerio\": \"^1.1.2\",\n \"commander\": \"^14.0.0\",\n \"jiti\": \"^2.5.1\",\n \"zod\": \"^4.0.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.15.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.2.4\"\n }\n}\n","import pkg from '../package.json';\n\nexport const PKG_NAME = pkg.name;\nexport const VERSION = pkg.version;\nexport const CONFIG_FILENAME = `${PKG_NAME}.config.ts`;\nexport const SERVER_SCHEMA_URL = 'https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json';\n","export interface OfferConfig {\n name?: string;\n description?: string;\n price?: string | number;\n priceCurrency?: string;\n}\n\nexport interface AigentifyConfig {\n name: string;\n description: string;\n repository: string;\n version?: string;\n mcpUrl?: string;\n npmPackage?: string;\n offer?: OfferConfig;\n}\n\nexport function defineConfig(config: AigentifyConfig): AigentifyConfig {\n return { ...config, repository: config.repository.replace(/\\/+$/, ''), version: config.version ?? '0.1.0' };\n}\n\nexport function defaultConfig(): AigentifyConfig {\n return defineConfig({\n name: 'Your product',\n description: 'A product with an agent-native interface.',\n repository: 'https://github.com/your-org/your-product',\n npmPackage: 'your-package',\n });\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsMd(config: AigentifyConfig): string {\n const packageName = config.npmPackage ?? '<NPM_PACKAGE>';\n const mcp = config.mcpUrl ?? `npx ${packageName}`;\n const offer = config.offer;\n const offerLine = offer?.price === undefined ? 'Price: <PRICE>' : `Price: ${offer.priceCurrency ?? 'USD'} ${offer.price}`;\n return `# ${config.name}\n\n## Mental model\n\n${config.name} is ${config.description}\n\nUse the product interface for product work. Use the agent interface for repeatable tasks that need structured results.\n\n## The faces\n\n- Product: ${config.repository}\n- MCP: ${mcp}\n- Package: ${packageName}\n\n## MCP tools\n\n| Tool | Input | Result |\n| --- | --- | --- |\n| audit | target | An agent-readiness report with a score and gaps. |\n| gen | artifact and params | A generated agent-native artifact. |\n\n## The loop\n\n1. Audit the target.\n2. Fix the highest-impact gap.\n3. Generate or publish the missing artifact.\n4. Audit again and keep the report with the release.\n\n## Rules\n\n- Treat the product description and prices as source facts.\n- Return structured data when a tool provides it.\n- Ask for missing information before making a high-impact change.\n- Keep public agent instructions about the product and its use.\n\n## Offer\n\n${offer?.description ?? '<OFFER_DESCRIPTION>'}\n\n${offerLine}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsRoute(config: AigentifyConfig, framework = 'static'): string {\n if (framework === 'next') {\n return `# Serve /agents.md from a Next route\n\nCopy AGENTS.md to a public directory, or add this force-static route:\n\n\\`\\`\\`ts\nimport { readFile } from 'node:fs/promises';\n\nexport const dynamic = 'force-static';\n\nexport async function GET() {\n const body = await readFile('AGENTS.md', 'utf8');\n return new Response(body, { headers: { 'content-type': 'text/markdown; charset=utf-8' } });\n}\n\\`\\`\\`\n\nProduct: ${config.name}\n`;\n }\n return `# Serve /agents.md\n\nCopy the generated AGENTS.md file to public/agents.md and serve it as a static text/markdown response.\n\nProduct: ${config.name}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateOffer(config: AigentifyConfig): string {\n const offer = config.offer ?? {};\n const data = {\n '@context': 'https://schema.org',\n '@type': 'SoftwareApplication',\n name: config.name,\n description: config.description,\n applicationCategory: 'DeveloperApplication',\n offers: [{\n '@type': 'Offer',\n name: offer.name ?? `${config.name} access`,\n ...(offer.description ? { description: offer.description } : {}),\n ...(offer.price === undefined ? {} : { price: String(offer.price) }),\n priceCurrency: offer.priceCurrency ?? 'USD',\n }],\n };\n return `${JSON.stringify(data, null, 2)}\\n`;\n}\n","import { SERVER_SCHEMA_URL } from '../constants.js';\nimport type { AigentifyConfig } from '../config.js';\n\nexport function generateServerJson(config: AigentifyConfig): string {\n const serverName = config.name.includes('/') ? config.name : `io.github.pooriaarab/${config.name.toLowerCase().replace(/[^a-z0-9._-]+/g, '-')}`;\n const server: Record<string, unknown> = {\n $schema: SERVER_SCHEMA_URL,\n name: serverName,\n description: config.description,\n repository: { url: config.repository, source: 'github' },\n version: config.version ?? '0.1.0',\n };\n if (config.mcpUrl) server.remotes = [{ type: 'streamable-http', url: config.mcpUrl }];\n else server.packages = [{ registry_type: 'npm', identifier: config.npmPackage ?? 'aigentify', version: config.version ?? '0.1.0', runtime_hint: 'npx', transport: { type: 'stdio' } }];\n return `${JSON.stringify(server, null, 2)}\\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\nimport { defaultConfig, defineConfig } from '../config.js';\nimport { generateAgentsMd } from './agents.js';\nimport { generateAgentsRoute } from './agents-route.js';\nimport { generateOffer } from './offer.js';\nimport { generateServerJson } from './server.js';\nexport * from './agents.js';\nexport * from './agents-route.js';\nexport * from './offer.js';\nexport * from './server.js';\n\nexport type GeneratedArtifact = 'agents-md' | 'server-json' | 'offer' | 'agents-route';\nexport type GenerateParams = Partial<AigentifyConfig> & { framework?: string };\n\nfunction configFromParams(params: GenerateParams = {}): AigentifyConfig {\n const base = defaultConfig();\n return defineConfig({ ...base, ...params, offer: { ...(base.offer ?? {}), ...(params.offer ?? {}) } });\n}\n\nexport function generate(artifact: GeneratedArtifact, params: GenerateParams = {}): string {\n const config = configFromParams(params);\n if (artifact === 'agents-md') return generateAgentsMd(config);\n if (artifact === 'server-json') return generateServerJson(config);\n if (artifact === 'offer') return generateOffer(config);\n if (artifact === 'agents-route') return generateAgentsRoute(config, params.framework);\n throw new Error(`Unknown artifact: ${artifact}`);\n}\n"],"mappings":"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","names":["path"]} | ||
| {"version":3,"sources":["../src/mcp.ts","../src/audit.ts","../package.json","../src/constants.ts","../src/config.ts","../src/generators/agents.ts","../src/generators/agents-route.ts","../src/generators/offer.ts","../src/generators/server.ts","../src/generators/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { auditTarget } from './audit.js';\nimport { PKG_NAME, VERSION } from './constants.js';\nimport { generate, type GenerateParams, type GeneratedArtifact } from './generators/index.js';\n\nconst artifacts = ['agents-md', 'server-json', 'offer', 'agents-route'] as const;\n\nexport function createMcpServer(): McpServer {\n const server = new McpServer({ name: PKG_NAME, version: VERSION });\n server.registerTool('audit', {\n description: 'Audit a local directory or live URL for agent-native readiness.',\n inputSchema: { target: z.string() },\n }, async ({ target }) => ({ content: [{ type: 'text', text: JSON.stringify(await auditTarget(target), null, 2) }] }));\n server.registerTool('gen', {\n description: 'Generate an agent-native artifact as text.',\n inputSchema: { artifact: z.enum(artifacts), params: z.record(z.string(), z.unknown()).optional() },\n }, async ({ artifact, params }) => ({ content: [{ type: 'text', text: generate(artifact as GeneratedArtifact, (params ?? {}) as GenerateParams) }] }));\n return server;\n}\n\nexport async function startMcpServer(): Promise<void> {\n const server = createMcpServer();\n await server.connect(new StdioServerTransport());\n}\n\nif (import.meta.url === `file://${process.argv[1]}`) startMcpServer().catch(error => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n});\n","import { readFile, readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { SERVER_SCHEMA_URL, SERVER_SCHEMA_RE } from './constants.js';\n\nexport type AuditStatus = 'pass' | 'fail' | 'warn' | 'na';\nexport interface AuditCheck { id: string; status: AuditStatus; note: string; weight: number }\nexport interface AuditGap { id: string; note: string; fix: string }\nexport interface AuditReport { target: string; score: number; checks: AuditCheck[]; gaps: AuditGap[] }\nexport interface AuditOptions { fetch?: typeof globalThis.fetch }\n\ninterface Endpoint { status: number; contentType: string; text: string }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n honestText: string; hasMcp: boolean; networkFailure: boolean;\n}\n\nconst SKIPPED = new Set(['.git', 'node_modules', 'dist', 'coverage', '.next', '_reference_geoaeo']);\nconst WEIGHTS: Record<string, number> = {\n 'agents-md': 15, 'agents-md-public-safe': 10, 'server-json': 15, mcp: 15,\n 'offer-jsonld': 15, 'honest-offer': 10, 'llms-txt': 10, sitemap: 10,\n};\nconst FIXES: Record<string, string> = {\n 'agents-md': 'Add a public AGENTS.md at the target root or serve /agents.md as text/markdown.',\n 'agents-md-public-safe': 'Rewrite AGENTS.md as product guidance. Remove repository paths and contributor instructions.',\n 'server-json': `Add server.json and set \"$schema\" to \"${SERVER_SCHEMA_URL}\". Include a repository and a remotes or packages entry.`,\n mcp: 'Publish server.json, .mcp.json, or an MCP entry point.',\n 'offer-jsonld': 'Publish JSON-LD with @type Offer, or a SoftwareApplication with an offers property.',\n 'honest-offer': 'State the real price plainly. Remove scarcity, countdown, and urgency language.',\n 'llms-txt': 'Publish /llms.txt with a concise product description.',\n sitemap: 'Publish /sitemap.xml for URL discovery.',\n};\n\nfunction check(id: string, status: AuditStatus, note: string): AuditCheck { return { id, status, note, weight: WEIGHTS[id] }; }\n\nexport function scoreAuditChecks(checks: AuditCheck[]): number {\n const relevant = checks.filter(item => item.status !== 'na');\n const total = relevant.reduce((sum, item) => sum + item.weight, 0);\n if (!total) return 0;\n const earned = relevant.reduce((sum, item) => sum + (item.status === 'pass' ? item.weight : item.status === 'warn' ? item.weight / 2 : 0), 0);\n return Math.round((earned / total) * 100);\n}\n\nasync function walkFiles(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n if (entry.isDirectory() && !SKIPPED.has(entry.name)) files.push(...await walkFiles(path.join(directory, entry.name)));\n else if (entry.isFile()) files.push(path.join(directory, entry.name));\n }\n return files;\n}\n\nasync function readText(file: string | undefined): Promise<string> {\n if (!file) return '';\n try { return await readFile(file, 'utf8'); } catch { return ''; }\n}\n\nfunction findFile(files: string[], name: string): string | undefined {\n return files.find(file => {\n const normalized = file.replaceAll('\\\\', '/');\n return path.basename(normalized) === name || normalized.endsWith(`/${name}/route.ts`);\n });\n}\n\nfunction parseJson(text: string): Record<string, unknown> | undefined {\n try {\n const value: unknown = JSON.parse(text);\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n } catch { return undefined; }\n}\n\nfunction validServer(text: string): { valid: boolean; reason: string } {\n const value = parseJson(text);\n if (!value) return { valid: false, reason: 'server.json is not valid JSON.' };\n if (typeof value.$schema !== 'string' || !SERVER_SCHEMA_RE.test(value.$schema)) return { valid: false, reason: `server.json \"$schema\" must be a dated MCP registry schema like ${SERVER_SCHEMA_URL} (the bare .../server.json 404s).` };\n const missing = ['name', 'description', 'repository', 'version'].filter(key => !value[key]);\n if (missing.length) return { valid: false, reason: `server.json is missing: ${missing.join(', ')}.` };\n if (!Array.isArray(value.remotes) && !Array.isArray(value.packages)) return { valid: false, reason: 'server.json needs a remotes or packages entry.' };\n return { valid: true, reason: 'server.json has the required MCP registry fields.' };\n}\n\nfunction hasOffer(texts: string[]): boolean {\n return texts.some(text => /\"@type\"\\s*:\\s*\"Offer\"/i.test(text) || /\"@type\"\\s*:\\s*\"SoftwareApplication\"/i.test(text) && /\"offers\"\\s*:/.test(text));\n}\n\nfunction hasUrgency(text: string): boolean {\n return /limited time|act now|hurry|expires|only\\s+\\d+\\s+left|ends in|sign up now|countdown/i.test(text);\n}\n\nfunction publicSafe(text: string): boolean {\n return !(/\\bsrc\\//i.test(text) || /\\bapps\\//i.test(text) || /\\bpackages\\//i.test(text) || /\\b[\\w.-]+\\.ts\\b/i.test(text) || /npm run build/i.test(text) || /\\btsconfig\\b/i.test(text) || /\\bcontributors?\\b/i.test(text) || /^#+\\s*layout\\b/im.test(text));\n}\n\nfunction offerBlock(text: string): string {\n const match = /^#+\\s*Offer\\b/im.exec(text);\n if (!match || match.index === undefined) return '';\n const rest = text.slice(match.index);\n const nextHeading = /^#+\\s+/m.exec(rest.slice(match[0].length));\n return nextHeading?.index === undefined ? rest : rest.slice(0, match[0].length + nextHeading.index);\n}\n\nasync function directorySnapshot(directory: string): Promise<Snapshot> {\n const files = await walkFiles(directory);\n const agentsFile = findFile(files, 'AGENTS.md');\n const serverFile = findFile(files, 'server.json');\n const mcpFile = files.find(file => /(?:^|\\/)\\.mcp\\.json$/.test(file.replaceAll('\\\\', '/')));\n const packageFile = findFile(files, 'package.json');\n const packageText = await readText(packageFile);\n const hasMcpBin = /\"(?:aigentify|[^\"\\n]*mcp[^\"\\n]*)\"\\s*:/i.test(packageText);\n const agentsText = await readText(agentsFile);\n const offerTexts = [agentsText, ...await Promise.all(files.filter(file => /\\.(html?|json|jsonld|md|mdx|tsx|jsx|js|mjs|ts)$/.test(file)).map(readText))];\n const llmsFile = findFile(files, 'llms.txt');\n const sitemapFile = findFile(files, 'sitemap.xml');\n const offerFiles = files.filter(file => /\\.jsonld$|(?:^|\\/)offer[^/]*\\.(?:json|html?)$/i.test(file));\n const honestText = [offerBlock(agentsText), ...await Promise.all(offerFiles.map(readText))].join('\\n');\n return {\n agents: { status: agentsFile ? 200 : 404, contentType: 'text/markdown', text: agentsText },\n server: { status: serverFile ? 200 : 404, contentType: 'application/json', text: await readText(serverFile) },\n mcp: { status: mcpFile || serverFile || hasMcpBin ? 200 : 404, contentType: '', text: '' },\n home: { status: 200, contentType: 'text/plain', text: offerTexts.join('\\n') },\n llms: { status: llmsFile ? 200 : 404, contentType: 'text/plain', text: await readText(llmsFile) },\n sitemap: { status: sitemapFile ? 200 : 404, contentType: 'application/xml', text: await readText(sitemapFile) },\n honestText, hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), networkFailure: false,\n };\n}\n\nasync function fetchText(fetcher: typeof globalThis.fetch, url: string): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000) });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text() };\n } catch { return { status: 0, contentType: '', text: '' }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n const [agents, server, mcp, home, llms, sitemap] = await Promise.all([\n fetchText(fetcher, `${base}/agents.md`), fetchText(fetcher, `${base}/server.json`), fetchText(fetcher, `${base}/.well-known/mcp`),\n fetchText(fetcher, base), fetchText(fetcher, `${base}/llms.txt`), fetchText(fetcher, `${base}/sitemap.xml`),\n ]);\n const endpoints = [agents, server, mcp, home, llms, sitemap];\n return { agents, server, mcp, home, llms, sitemap, honestText: [home.text, offerBlock(agents.text)].join('\\n'), hasMcp: server.status >= 200 && server.status < 400 || mcp.status >= 200 && mcp.status < 400, networkFailure: endpoints.every(item => item.status === 0) };\n}\n\nfunction buildChecks(snapshot: Snapshot): AuditCheck[] {\n const agentsPresent = snapshot.agents.status === 200 && snapshot.agents.text.trim().length > 0 && /(?:text\\/(?:markdown|plain)|application\\/markdown)/i.test(snapshot.agents.contentType);\n const agentsStatus: AuditStatus = snapshot.agents.status === 0 ? 'warn' : agentsPresent ? 'pass' : 'fail';\n const publicStatus: AuditStatus = !agentsPresent ? (snapshot.agents.status === 0 ? 'warn' : 'na') : publicSafe(snapshot.agents.text) ? 'pass' : 'warn';\n const serverInfo = snapshot.server.status === 200 ? validServer(snapshot.server.text) : undefined;\n const serverStatus: AuditStatus = snapshot.server.status === 0 ? 'warn' : !snapshot.hasMcp ? 'na' : serverInfo?.valid ? 'pass' : 'fail';\n const mcpStatus: AuditStatus = snapshot.networkFailure ? 'warn' : snapshot.hasMcp ? 'pass' : 'fail';\n const offerTexts = [snapshot.home.text, snapshot.agents.text];\n const offerStatus: AuditStatus = snapshot.home.status === 0 ? 'warn' : hasOffer(offerTexts) ? 'pass' : 'fail';\n const honestStatus: AuditStatus = !hasOffer(offerTexts) && !agentsPresent ? (snapshot.home.status === 0 ? 'warn' : 'na') : hasUrgency(snapshot.honestText) ? 'warn' : 'pass';\n const llmsStatus: AuditStatus = snapshot.llms.status === 0 ? 'warn' : snapshot.llms.status >= 200 && snapshot.llms.status < 400 && snapshot.llms.text.trim() ? 'pass' : 'fail';\n const sitemapStatus: AuditStatus = snapshot.sitemap.status === 0 ? 'warn' : snapshot.sitemap.status >= 200 && snapshot.sitemap.status < 400 && snapshot.sitemap.text.trim() ? 'pass' : 'fail';\n return [\n check('agents-md', agentsStatus, agentsPresent ? 'AGENTS.md is available.' : snapshot.agents.status === 0 ? 'The AGENTS.md request failed.' : 'AGENTS.md is missing.'),\n check('agents-md-public-safe', publicStatus, publicStatus === 'pass' ? 'AGENTS.md describes the product as a public surface.' : publicStatus === 'na' ? 'No AGENTS.md is available to inspect.' : 'AGENTS.md contains repository-internal guidance.'),\n check('server-json', serverStatus, serverInfo?.valid ? serverInfo.reason : serverInfo?.reason ?? (!snapshot.hasMcp ? 'No MCP surface was detected.' : 'server.json is missing.')),\n check('mcp', mcpStatus, snapshot.networkFailure ? 'The MCP discovery request failed.' : snapshot.hasMcp ? 'An MCP surface is available.' : 'No MCP surface was found.'),\n check('offer-jsonld', offerStatus, offerStatus === 'pass' ? 'Offer JSON-LD is available.' : offerStatus === 'warn' ? 'The offer could not be checked.' : 'No Offer JSON-LD was found.'),\n check('honest-offer', honestStatus, honestStatus === 'pass' ? 'Offer language states the price without pressure.' : honestStatus === 'na' ? 'No offer or Offer block was found.' : 'Offer language contains scarcity, countdown, or urgency copy.'),\n check('llms-txt', llmsStatus, llmsStatus === 'pass' ? 'llms.txt is available.' : llmsStatus === 'warn' ? 'The llms.txt request failed.' : 'llms.txt is missing.'),\n check('sitemap', sitemapStatus, sitemapStatus === 'pass' ? 'sitemap.xml is available.' : sitemapStatus === 'warn' ? 'The sitemap request failed.' : 'sitemap.xml is missing.'),\n ];\n}\n\nexport async function auditTarget(target: string, options: AuditOptions = {}): Promise<AuditReport> {\n const targetStat = await stat(target).catch(() => undefined);\n const snapshot = targetStat?.isDirectory() ? await directorySnapshot(target) : await urlSnapshot(target, options.fetch ?? globalThis.fetch);\n const checks = buildChecks(snapshot);\n const gaps = checks.filter(item => item.status === 'fail' || item.status === 'warn').map(item => ({ id: item.id, note: item.note, fix: FIXES[item.id] }));\n return { target, score: scoreAuditChecks(checks), checks, gaps };\n}\n\nexport function formatAuditReport(report: AuditReport): string {\n const lines = [`${report.target}: ${report.score}/100`, ''];\n for (const item of report.checks) lines.push(`${item.status.toUpperCase().padEnd(4)} ${item.id}: ${item.note}`);\n lines.push('', 'Gaps:');\n if (!report.gaps.length) lines.push('None.');\n else report.gaps.forEach((gap, index) => lines.push(`${index + 1}. ${gap.id}: ${gap.fix}`));\n return lines.join('\\n');\n}\n","{\n \"name\": \"aigentify\",\n \"version\": \"0.1.1\",\n \"mcpName\": \"io.github.pooriaarab/aigentify\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\"aigentify\": \"dist/cli.js\", \"aigentify-mcp\": \"dist/mcp.js\"},\n \"exports\": {\".\": {\"types\": \"./dist/index.d.ts\", \"import\": \"./dist/index.js\", \"require\": \"./dist/index.cjs\"}},\n \"files\": [\"dist\"],\n \"repository\": {\"type\": \"git\", \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"},\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\"agents\", \"agentification\", \"mcp\", \"ai\", \"json-ld\"],\n \"publishConfig\": {\"access\": \"public\"},\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"lint\": \"tsc --noEmit --pretty false\",\n \"typecheck\": \"tsc --noEmit\",\n \"verify\": \"npm run typecheck && npm run build && npm run test\",\n \"prepublishOnly\": \"npm run verify\"\n },\n \"engines\": {\"node\": \">=20\"},\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.17.5\",\n \"cheerio\": \"^1.1.2\",\n \"commander\": \"^14.0.0\",\n \"jiti\": \"^2.5.1\",\n \"zod\": \"^4.0.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.15.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.2.4\"\n }\n}\n","import pkg from '../package.json';\n\nexport const PKG_NAME = pkg.name;\nexport const VERSION = pkg.version;\nexport const CONFIG_FILENAME = `${PKG_NAME}.config.ts`;\nexport const SERVER_SCHEMA_URL = 'https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json';\n// Any dated MCP registry schema is valid; only the bare `.../server.json` (no `.schema`) 404s.\nexport const SERVER_SCHEMA_RE = /^https:\\/\\/static\\.modelcontextprotocol\\.io\\/schemas\\/\\d{4}-\\d{2}-\\d{2}\\/server\\.schema\\.json$/;\n","export interface OfferConfig {\n name?: string;\n description?: string;\n price?: string | number;\n priceCurrency?: string;\n}\n\nexport interface AigentifyConfig {\n name: string;\n description: string;\n repository: string;\n version?: string;\n mcpUrl?: string;\n npmPackage?: string;\n offer?: OfferConfig;\n}\n\nexport function defineConfig(config: AigentifyConfig): AigentifyConfig {\n return { ...config, repository: config.repository.replace(/\\/+$/, ''), version: config.version ?? '0.1.0' };\n}\n\nexport function defaultConfig(): AigentifyConfig {\n return defineConfig({\n name: 'Your product',\n description: 'A product with an agent-native interface.',\n repository: 'https://github.com/your-org/your-product',\n npmPackage: 'your-package',\n });\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsMd(config: AigentifyConfig): string {\n const packageName = config.npmPackage ?? '<NPM_PACKAGE>';\n const mcp = config.mcpUrl ?? `npx ${packageName}`;\n const offer = config.offer;\n const offerLine = offer?.price === undefined ? 'Price: <PRICE>' : `Price: ${offer.priceCurrency ?? 'USD'} ${offer.price}`;\n return `# ${config.name}\n\n## Mental model\n\n${config.name} is ${config.description}\n\nUse the product interface for product work. Use the agent interface for repeatable tasks that need structured results.\n\n## The faces\n\n- Product: ${config.repository}\n- MCP: ${mcp}\n- Package: ${packageName}\n\n## MCP tools\n\n| Tool | Input | Result |\n| --- | --- | --- |\n| audit | target | An agent-readiness report with a score and gaps. |\n| gen | artifact and params | A generated agent-native artifact. |\n\n## The loop\n\n1. Audit the target.\n2. Fix the highest-impact gap.\n3. Generate or publish the missing artifact.\n4. Audit again and keep the report with the release.\n\n## Rules\n\n- Treat the product description and prices as source facts.\n- Return structured data when a tool provides it.\n- Ask for missing information before making a high-impact change.\n- Keep public agent instructions about the product and its use.\n\n## Offer\n\n${offer?.description ?? '<OFFER_DESCRIPTION>'}\n\n${offerLine}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsRoute(config: AigentifyConfig, framework = 'static'): string {\n if (framework === 'next') {\n return `# Serve /agents.md from a Next route\n\nCopy AGENTS.md to a public directory, or add this force-static route:\n\n\\`\\`\\`ts\nimport { readFile } from 'node:fs/promises';\n\nexport const dynamic = 'force-static';\n\nexport async function GET() {\n const body = await readFile('AGENTS.md', 'utf8');\n return new Response(body, { headers: { 'content-type': 'text/markdown; charset=utf-8' } });\n}\n\\`\\`\\`\n\nProduct: ${config.name}\n`;\n }\n return `# Serve /agents.md\n\nCopy the generated AGENTS.md file to public/agents.md and serve it as a static text/markdown response.\n\nProduct: ${config.name}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateOffer(config: AigentifyConfig): string {\n const offer = config.offer ?? {};\n const data = {\n '@context': 'https://schema.org',\n '@type': 'SoftwareApplication',\n name: config.name,\n description: config.description,\n applicationCategory: 'DeveloperApplication',\n offers: [{\n '@type': 'Offer',\n name: offer.name ?? `${config.name} access`,\n ...(offer.description ? { description: offer.description } : {}),\n ...(offer.price === undefined ? {} : { price: String(offer.price) }),\n priceCurrency: offer.priceCurrency ?? 'USD',\n }],\n };\n return `${JSON.stringify(data, null, 2)}\\n`;\n}\n","import { SERVER_SCHEMA_URL } from '../constants.js';\nimport type { AigentifyConfig } from '../config.js';\n\nexport function generateServerJson(config: AigentifyConfig): string {\n const serverName = config.name.includes('/') ? config.name : `io.github.pooriaarab/${config.name.toLowerCase().replace(/[^a-z0-9._-]+/g, '-')}`;\n const server: Record<string, unknown> = {\n $schema: SERVER_SCHEMA_URL,\n name: serverName,\n description: config.description,\n repository: { url: config.repository, source: 'github' },\n version: config.version ?? '0.1.0',\n };\n if (config.mcpUrl) server.remotes = [{ type: 'streamable-http', url: config.mcpUrl }];\n else server.packages = [{ registryType: 'npm', registryBaseUrl: 'https://registry.npmjs.org', identifier: config.npmPackage ?? 'aigentify', version: config.version ?? '0.1.0', transport: { type: 'stdio' }, runtimeHint: 'npx', packageArguments: [{ type: 'positional', valueHint: 'subcommand', value: 'mcp' }] }];\n return `${JSON.stringify(server, null, 2)}\\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\nimport { defaultConfig, defineConfig } from '../config.js';\nimport { generateAgentsMd } from './agents.js';\nimport { generateAgentsRoute } from './agents-route.js';\nimport { generateOffer } from './offer.js';\nimport { generateServerJson } from './server.js';\nexport * from './agents.js';\nexport * from './agents-route.js';\nexport * from './offer.js';\nexport * from './server.js';\n\nexport type GeneratedArtifact = 'agents-md' | 'server-json' | 'offer' | 'agents-route';\nexport type GenerateParams = Partial<AigentifyConfig> & { framework?: string };\n\nfunction configFromParams(params: GenerateParams = {}): AigentifyConfig {\n const base = defaultConfig();\n return defineConfig({ ...base, ...params, offer: { ...(base.offer ?? {}), ...(params.offer ?? {}) } });\n}\n\nexport function generate(artifact: GeneratedArtifact, params: GenerateParams = {}): string {\n const config = configFromParams(params);\n if (artifact === 'agents-md') return generateAgentsMd(config);\n if (artifact === 'server-json') return generateServerJson(config);\n if (artifact === 'offer') return generateOffer(config);\n if (artifact === 'agents-route') return generateAgentsRoute(config, params.framework);\n throw new Error(`Unknown artifact: ${artifact}`);\n}\n"],"mappings":"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","names":["path"]} |
+6
-4
@@ -15,3 +15,4 @@ #!/usr/bin/env node | ||
| name: "aigentify", | ||
| version: "0.1.0", | ||
| version: "0.1.1", | ||
| mcpName: "io.github.pooriaarab/aigentify", | ||
| description: "Audit and generate agent-native product surfaces", | ||
@@ -56,3 +57,4 @@ type: "module", | ||
| var CONFIG_FILENAME = `${PKG_NAME}.config.ts`; | ||
| var SERVER_SCHEMA_URL = "https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json"; | ||
| var SERVER_SCHEMA_URL = "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json"; | ||
| var SERVER_SCHEMA_RE = /^https:\/\/static\.modelcontextprotocol\.io\/schemas\/\d{4}-\d{2}-\d{2}\/server\.schema\.json$/; | ||
@@ -125,3 +127,3 @@ // src/audit.ts | ||
| if (!value) return { valid: false, reason: "server.json is not valid JSON." }; | ||
| if (value.$schema !== SERVER_SCHEMA_URL) return { valid: false, reason: `server.json must use the exact schema URL ${SERVER_SCHEMA_URL}.` }; | ||
| if (typeof value.$schema !== "string" || !SERVER_SCHEMA_RE.test(value.$schema)) return { valid: false, reason: `server.json "$schema" must be a dated MCP registry schema like ${SERVER_SCHEMA_URL} (the bare .../server.json 404s).` }; | ||
| const missing = ["name", "description", "repository", "version"].filter((key) => !value[key]); | ||
@@ -349,3 +351,3 @@ if (missing.length) return { valid: false, reason: `server.json is missing: ${missing.join(", ")}.` }; | ||
| if (config.mcpUrl) server.remotes = [{ type: "streamable-http", url: config.mcpUrl }]; | ||
| else server.packages = [{ registry_type: "npm", identifier: config.npmPackage ?? "aigentify", version: config.version ?? "0.1.0", runtime_hint: "npx", transport: { type: "stdio" } }]; | ||
| else server.packages = [{ registryType: "npm", registryBaseUrl: "https://registry.npmjs.org", identifier: config.npmPackage ?? "aigentify", version: config.version ?? "0.1.0", transport: { type: "stdio" }, runtimeHint: "npx", packageArguments: [{ type: "positional", valueHint: "subcommand", value: "mcp" }] }]; | ||
| return `${JSON.stringify(server, null, 2)} | ||
@@ -352,0 +354,0 @@ `; |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/mcp.ts","../src/audit.ts","../package.json","../src/constants.ts","../src/config.ts","../src/generators/agents.ts","../src/generators/agents-route.ts","../src/generators/offer.ts","../src/generators/server.ts","../src/generators/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { auditTarget } from './audit.js';\nimport { PKG_NAME, VERSION } from './constants.js';\nimport { generate, type GenerateParams, type GeneratedArtifact } from './generators/index.js';\n\nconst artifacts = ['agents-md', 'server-json', 'offer', 'agents-route'] as const;\n\nexport function createMcpServer(): McpServer {\n const server = new McpServer({ name: PKG_NAME, version: VERSION });\n server.registerTool('audit', {\n description: 'Audit a local directory or live URL for agent-native readiness.',\n inputSchema: { target: z.string() },\n }, async ({ target }) => ({ content: [{ type: 'text', text: JSON.stringify(await auditTarget(target), null, 2) }] }));\n server.registerTool('gen', {\n description: 'Generate an agent-native artifact as text.',\n inputSchema: { artifact: z.enum(artifacts), params: z.record(z.string(), z.unknown()).optional() },\n }, async ({ artifact, params }) => ({ content: [{ type: 'text', text: generate(artifact as GeneratedArtifact, (params ?? {}) as GenerateParams) }] }));\n return server;\n}\n\nexport async function startMcpServer(): Promise<void> {\n const server = createMcpServer();\n await server.connect(new StdioServerTransport());\n}\n\nif (import.meta.url === `file://${process.argv[1]}`) startMcpServer().catch(error => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n});\n","import { readFile, readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { SERVER_SCHEMA_URL } from './constants.js';\n\nexport type AuditStatus = 'pass' | 'fail' | 'warn' | 'na';\nexport interface AuditCheck { id: string; status: AuditStatus; note: string; weight: number }\nexport interface AuditGap { id: string; note: string; fix: string }\nexport interface AuditReport { target: string; score: number; checks: AuditCheck[]; gaps: AuditGap[] }\nexport interface AuditOptions { fetch?: typeof globalThis.fetch }\n\ninterface Endpoint { status: number; contentType: string; text: string }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n honestText: string; hasMcp: boolean; networkFailure: boolean;\n}\n\nconst SKIPPED = new Set(['.git', 'node_modules', 'dist', 'coverage', '.next', '_reference_geoaeo']);\nconst WEIGHTS: Record<string, number> = {\n 'agents-md': 15, 'agents-md-public-safe': 10, 'server-json': 15, mcp: 15,\n 'offer-jsonld': 15, 'honest-offer': 10, 'llms-txt': 10, sitemap: 10,\n};\nconst FIXES: Record<string, string> = {\n 'agents-md': 'Add a public AGENTS.md at the target root or serve /agents.md as text/markdown.',\n 'agents-md-public-safe': 'Rewrite AGENTS.md as product guidance. Remove repository paths and contributor instructions.',\n 'server-json': `Add server.json and set \"$schema\" to \"${SERVER_SCHEMA_URL}\". Include a repository and a remotes or packages entry.`,\n mcp: 'Publish server.json, .mcp.json, or an MCP entry point.',\n 'offer-jsonld': 'Publish JSON-LD with @type Offer, or a SoftwareApplication with an offers property.',\n 'honest-offer': 'State the real price plainly. Remove scarcity, countdown, and urgency language.',\n 'llms-txt': 'Publish /llms.txt with a concise product description.',\n sitemap: 'Publish /sitemap.xml for URL discovery.',\n};\n\nfunction check(id: string, status: AuditStatus, note: string): AuditCheck { return { id, status, note, weight: WEIGHTS[id] }; }\n\nexport function scoreAuditChecks(checks: AuditCheck[]): number {\n const relevant = checks.filter(item => item.status !== 'na');\n const total = relevant.reduce((sum, item) => sum + item.weight, 0);\n if (!total) return 0;\n const earned = relevant.reduce((sum, item) => sum + (item.status === 'pass' ? item.weight : item.status === 'warn' ? item.weight / 2 : 0), 0);\n return Math.round((earned / total) * 100);\n}\n\nasync function walkFiles(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n if (entry.isDirectory() && !SKIPPED.has(entry.name)) files.push(...await walkFiles(path.join(directory, entry.name)));\n else if (entry.isFile()) files.push(path.join(directory, entry.name));\n }\n return files;\n}\n\nasync function readText(file: string | undefined): Promise<string> {\n if (!file) return '';\n try { return await readFile(file, 'utf8'); } catch { return ''; }\n}\n\nfunction findFile(files: string[], name: string): string | undefined {\n return files.find(file => {\n const normalized = file.replaceAll('\\\\', '/');\n return path.basename(normalized) === name || normalized.endsWith(`/${name}/route.ts`);\n });\n}\n\nfunction parseJson(text: string): Record<string, unknown> | undefined {\n try {\n const value: unknown = JSON.parse(text);\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n } catch { return undefined; }\n}\n\nfunction validServer(text: string): { valid: boolean; reason: string } {\n const value = parseJson(text);\n if (!value) return { valid: false, reason: 'server.json is not valid JSON.' };\n if (value.$schema !== SERVER_SCHEMA_URL) return { valid: false, reason: `server.json must use the exact schema URL ${SERVER_SCHEMA_URL}.` };\n const missing = ['name', 'description', 'repository', 'version'].filter(key => !value[key]);\n if (missing.length) return { valid: false, reason: `server.json is missing: ${missing.join(', ')}.` };\n if (!Array.isArray(value.remotes) && !Array.isArray(value.packages)) return { valid: false, reason: 'server.json needs a remotes or packages entry.' };\n return { valid: true, reason: 'server.json has the required MCP registry fields.' };\n}\n\nfunction hasOffer(texts: string[]): boolean {\n return texts.some(text => /\"@type\"\\s*:\\s*\"Offer\"/i.test(text) || /\"@type\"\\s*:\\s*\"SoftwareApplication\"/i.test(text) && /\"offers\"\\s*:/.test(text));\n}\n\nfunction hasUrgency(text: string): boolean {\n return /limited time|act now|hurry|expires|only\\s+\\d+\\s+left|ends in|sign up now|countdown/i.test(text);\n}\n\nfunction publicSafe(text: string): boolean {\n return !(/\\bsrc\\//i.test(text) || /\\bapps\\//i.test(text) || /\\bpackages\\//i.test(text) || /\\b[\\w.-]+\\.ts\\b/i.test(text) || /npm run build/i.test(text) || /\\btsconfig\\b/i.test(text) || /\\bcontributors?\\b/i.test(text) || /^#+\\s*layout\\b/im.test(text));\n}\n\nfunction offerBlock(text: string): string {\n const match = /^#+\\s*Offer\\b/im.exec(text);\n if (!match || match.index === undefined) return '';\n const rest = text.slice(match.index);\n const nextHeading = /^#+\\s+/m.exec(rest.slice(match[0].length));\n return nextHeading?.index === undefined ? rest : rest.slice(0, match[0].length + nextHeading.index);\n}\n\nasync function directorySnapshot(directory: string): Promise<Snapshot> {\n const files = await walkFiles(directory);\n const agentsFile = findFile(files, 'AGENTS.md');\n const serverFile = findFile(files, 'server.json');\n const mcpFile = files.find(file => /(?:^|\\/)\\.mcp\\.json$/.test(file.replaceAll('\\\\', '/')));\n const packageFile = findFile(files, 'package.json');\n const packageText = await readText(packageFile);\n const hasMcpBin = /\"(?:aigentify|[^\"\\n]*mcp[^\"\\n]*)\"\\s*:/i.test(packageText);\n const agentsText = await readText(agentsFile);\n const offerTexts = [agentsText, ...await Promise.all(files.filter(file => /\\.(html?|json|jsonld|md|mdx|tsx|jsx|js|mjs|ts)$/.test(file)).map(readText))];\n const llmsFile = findFile(files, 'llms.txt');\n const sitemapFile = findFile(files, 'sitemap.xml');\n const offerFiles = files.filter(file => /\\.jsonld$|(?:^|\\/)offer[^/]*\\.(?:json|html?)$/i.test(file));\n const honestText = [offerBlock(agentsText), ...await Promise.all(offerFiles.map(readText))].join('\\n');\n return {\n agents: { status: agentsFile ? 200 : 404, contentType: 'text/markdown', text: agentsText },\n server: { status: serverFile ? 200 : 404, contentType: 'application/json', text: await readText(serverFile) },\n mcp: { status: mcpFile || serverFile || hasMcpBin ? 200 : 404, contentType: '', text: '' },\n home: { status: 200, contentType: 'text/plain', text: offerTexts.join('\\n') },\n llms: { status: llmsFile ? 200 : 404, contentType: 'text/plain', text: await readText(llmsFile) },\n sitemap: { status: sitemapFile ? 200 : 404, contentType: 'application/xml', text: await readText(sitemapFile) },\n honestText, hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), networkFailure: false,\n };\n}\n\nasync function fetchText(fetcher: typeof globalThis.fetch, url: string): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000) });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text() };\n } catch { return { status: 0, contentType: '', text: '' }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n const [agents, server, mcp, home, llms, sitemap] = await Promise.all([\n fetchText(fetcher, `${base}/agents.md`), fetchText(fetcher, `${base}/server.json`), fetchText(fetcher, `${base}/.well-known/mcp`),\n fetchText(fetcher, base), fetchText(fetcher, `${base}/llms.txt`), fetchText(fetcher, `${base}/sitemap.xml`),\n ]);\n const endpoints = [agents, server, mcp, home, llms, sitemap];\n return { agents, server, mcp, home, llms, sitemap, honestText: [home.text, offerBlock(agents.text)].join('\\n'), hasMcp: server.status >= 200 && server.status < 400 || mcp.status >= 200 && mcp.status < 400, networkFailure: endpoints.every(item => item.status === 0) };\n}\n\nfunction buildChecks(snapshot: Snapshot): AuditCheck[] {\n const agentsPresent = snapshot.agents.status === 200 && snapshot.agents.text.trim().length > 0 && /(?:text\\/(?:markdown|plain)|application\\/markdown)/i.test(snapshot.agents.contentType);\n const agentsStatus: AuditStatus = snapshot.agents.status === 0 ? 'warn' : agentsPresent ? 'pass' : 'fail';\n const publicStatus: AuditStatus = !agentsPresent ? (snapshot.agents.status === 0 ? 'warn' : 'na') : publicSafe(snapshot.agents.text) ? 'pass' : 'warn';\n const serverInfo = snapshot.server.status === 200 ? validServer(snapshot.server.text) : undefined;\n const serverStatus: AuditStatus = snapshot.server.status === 0 ? 'warn' : !snapshot.hasMcp ? 'na' : serverInfo?.valid ? 'pass' : 'fail';\n const mcpStatus: AuditStatus = snapshot.networkFailure ? 'warn' : snapshot.hasMcp ? 'pass' : 'fail';\n const offerTexts = [snapshot.home.text, snapshot.agents.text];\n const offerStatus: AuditStatus = snapshot.home.status === 0 ? 'warn' : hasOffer(offerTexts) ? 'pass' : 'fail';\n const honestStatus: AuditStatus = !hasOffer(offerTexts) && !agentsPresent ? (snapshot.home.status === 0 ? 'warn' : 'na') : hasUrgency(snapshot.honestText) ? 'warn' : 'pass';\n const llmsStatus: AuditStatus = snapshot.llms.status === 0 ? 'warn' : snapshot.llms.status >= 200 && snapshot.llms.status < 400 && snapshot.llms.text.trim() ? 'pass' : 'fail';\n const sitemapStatus: AuditStatus = snapshot.sitemap.status === 0 ? 'warn' : snapshot.sitemap.status >= 200 && snapshot.sitemap.status < 400 && snapshot.sitemap.text.trim() ? 'pass' : 'fail';\n return [\n check('agents-md', agentsStatus, agentsPresent ? 'AGENTS.md is available.' : snapshot.agents.status === 0 ? 'The AGENTS.md request failed.' : 'AGENTS.md is missing.'),\n check('agents-md-public-safe', publicStatus, publicStatus === 'pass' ? 'AGENTS.md describes the product as a public surface.' : publicStatus === 'na' ? 'No AGENTS.md is available to inspect.' : 'AGENTS.md contains repository-internal guidance.'),\n check('server-json', serverStatus, serverInfo?.valid ? serverInfo.reason : serverInfo?.reason ?? (!snapshot.hasMcp ? 'No MCP surface was detected.' : 'server.json is missing.')),\n check('mcp', mcpStatus, snapshot.networkFailure ? 'The MCP discovery request failed.' : snapshot.hasMcp ? 'An MCP surface is available.' : 'No MCP surface was found.'),\n check('offer-jsonld', offerStatus, offerStatus === 'pass' ? 'Offer JSON-LD is available.' : offerStatus === 'warn' ? 'The offer could not be checked.' : 'No Offer JSON-LD was found.'),\n check('honest-offer', honestStatus, honestStatus === 'pass' ? 'Offer language states the price without pressure.' : honestStatus === 'na' ? 'No offer or Offer block was found.' : 'Offer language contains scarcity, countdown, or urgency copy.'),\n check('llms-txt', llmsStatus, llmsStatus === 'pass' ? 'llms.txt is available.' : llmsStatus === 'warn' ? 'The llms.txt request failed.' : 'llms.txt is missing.'),\n check('sitemap', sitemapStatus, sitemapStatus === 'pass' ? 'sitemap.xml is available.' : sitemapStatus === 'warn' ? 'The sitemap request failed.' : 'sitemap.xml is missing.'),\n ];\n}\n\nexport async function auditTarget(target: string, options: AuditOptions = {}): Promise<AuditReport> {\n const targetStat = await stat(target).catch(() => undefined);\n const snapshot = targetStat?.isDirectory() ? await directorySnapshot(target) : await urlSnapshot(target, options.fetch ?? globalThis.fetch);\n const checks = buildChecks(snapshot);\n const gaps = checks.filter(item => item.status === 'fail' || item.status === 'warn').map(item => ({ id: item.id, note: item.note, fix: FIXES[item.id] }));\n return { target, score: scoreAuditChecks(checks), checks, gaps };\n}\n\nexport function formatAuditReport(report: AuditReport): string {\n const lines = [`${report.target}: ${report.score}/100`, ''];\n for (const item of report.checks) lines.push(`${item.status.toUpperCase().padEnd(4)} ${item.id}: ${item.note}`);\n lines.push('', 'Gaps:');\n if (!report.gaps.length) lines.push('None.');\n else report.gaps.forEach((gap, index) => lines.push(`${index + 1}. ${gap.id}: ${gap.fix}`));\n return lines.join('\\n');\n}\n","{\n \"name\": \"aigentify\",\n \"version\": \"0.1.0\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\"aigentify\": \"dist/cli.js\", \"aigentify-mcp\": \"dist/mcp.js\"},\n \"exports\": {\".\": {\"types\": \"./dist/index.d.ts\", \"import\": \"./dist/index.js\", \"require\": \"./dist/index.cjs\"}},\n \"files\": [\"dist\"],\n \"repository\": {\"type\": \"git\", \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"},\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\"agents\", \"agentification\", \"mcp\", \"ai\", \"json-ld\"],\n \"publishConfig\": {\"access\": \"public\"},\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"lint\": \"tsc --noEmit --pretty false\",\n \"typecheck\": \"tsc --noEmit\",\n \"verify\": \"npm run typecheck && npm run build && npm run test\",\n \"prepublishOnly\": \"npm run verify\"\n },\n \"engines\": {\"node\": \">=20\"},\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.17.5\",\n \"cheerio\": \"^1.1.2\",\n \"commander\": \"^14.0.0\",\n \"jiti\": \"^2.5.1\",\n \"zod\": \"^4.0.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.15.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.2.4\"\n }\n}\n","import pkg from '../package.json';\n\nexport const PKG_NAME = pkg.name;\nexport const VERSION = pkg.version;\nexport const CONFIG_FILENAME = `${PKG_NAME}.config.ts`;\nexport const SERVER_SCHEMA_URL = 'https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json';\n","export interface OfferConfig {\n name?: string;\n description?: string;\n price?: string | number;\n priceCurrency?: string;\n}\n\nexport interface AigentifyConfig {\n name: string;\n description: string;\n repository: string;\n version?: string;\n mcpUrl?: string;\n npmPackage?: string;\n offer?: OfferConfig;\n}\n\nexport function defineConfig(config: AigentifyConfig): AigentifyConfig {\n return { ...config, repository: config.repository.replace(/\\/+$/, ''), version: config.version ?? '0.1.0' };\n}\n\nexport function defaultConfig(): AigentifyConfig {\n return defineConfig({\n name: 'Your product',\n description: 'A product with an agent-native interface.',\n repository: 'https://github.com/your-org/your-product',\n npmPackage: 'your-package',\n });\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsMd(config: AigentifyConfig): string {\n const packageName = config.npmPackage ?? '<NPM_PACKAGE>';\n const mcp = config.mcpUrl ?? `npx ${packageName}`;\n const offer = config.offer;\n const offerLine = offer?.price === undefined ? 'Price: <PRICE>' : `Price: ${offer.priceCurrency ?? 'USD'} ${offer.price}`;\n return `# ${config.name}\n\n## Mental model\n\n${config.name} is ${config.description}\n\nUse the product interface for product work. Use the agent interface for repeatable tasks that need structured results.\n\n## The faces\n\n- Product: ${config.repository}\n- MCP: ${mcp}\n- Package: ${packageName}\n\n## MCP tools\n\n| Tool | Input | Result |\n| --- | --- | --- |\n| audit | target | An agent-readiness report with a score and gaps. |\n| gen | artifact and params | A generated agent-native artifact. |\n\n## The loop\n\n1. Audit the target.\n2. Fix the highest-impact gap.\n3. Generate or publish the missing artifact.\n4. Audit again and keep the report with the release.\n\n## Rules\n\n- Treat the product description and prices as source facts.\n- Return structured data when a tool provides it.\n- Ask for missing information before making a high-impact change.\n- Keep public agent instructions about the product and its use.\n\n## Offer\n\n${offer?.description ?? '<OFFER_DESCRIPTION>'}\n\n${offerLine}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsRoute(config: AigentifyConfig, framework = 'static'): string {\n if (framework === 'next') {\n return `# Serve /agents.md from a Next route\n\nCopy AGENTS.md to a public directory, or add this force-static route:\n\n\\`\\`\\`ts\nimport { readFile } from 'node:fs/promises';\n\nexport const dynamic = 'force-static';\n\nexport async function GET() {\n const body = await readFile('AGENTS.md', 'utf8');\n return new Response(body, { headers: { 'content-type': 'text/markdown; charset=utf-8' } });\n}\n\\`\\`\\`\n\nProduct: ${config.name}\n`;\n }\n return `# Serve /agents.md\n\nCopy the generated AGENTS.md file to public/agents.md and serve it as a static text/markdown response.\n\nProduct: ${config.name}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateOffer(config: AigentifyConfig): string {\n const offer = config.offer ?? {};\n const data = {\n '@context': 'https://schema.org',\n '@type': 'SoftwareApplication',\n name: config.name,\n description: config.description,\n applicationCategory: 'DeveloperApplication',\n offers: [{\n '@type': 'Offer',\n name: offer.name ?? `${config.name} access`,\n ...(offer.description ? { description: offer.description } : {}),\n ...(offer.price === undefined ? {} : { price: String(offer.price) }),\n priceCurrency: offer.priceCurrency ?? 'USD',\n }],\n };\n return `${JSON.stringify(data, null, 2)}\\n`;\n}\n","import { SERVER_SCHEMA_URL } from '../constants.js';\nimport type { AigentifyConfig } from '../config.js';\n\nexport function generateServerJson(config: AigentifyConfig): string {\n const serverName = config.name.includes('/') ? config.name : `io.github.pooriaarab/${config.name.toLowerCase().replace(/[^a-z0-9._-]+/g, '-')}`;\n const server: Record<string, unknown> = {\n $schema: SERVER_SCHEMA_URL,\n name: serverName,\n description: config.description,\n repository: { url: config.repository, source: 'github' },\n version: config.version ?? '0.1.0',\n };\n if (config.mcpUrl) server.remotes = [{ type: 'streamable-http', url: config.mcpUrl }];\n else server.packages = [{ registry_type: 'npm', identifier: config.npmPackage ?? 'aigentify', version: config.version ?? '0.1.0', runtime_hint: 'npx', transport: { type: 'stdio' } }];\n return `${JSON.stringify(server, null, 2)}\\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\nimport { defaultConfig, defineConfig } from '../config.js';\nimport { generateAgentsMd } from './agents.js';\nimport { generateAgentsRoute } from './agents-route.js';\nimport { generateOffer } from './offer.js';\nimport { generateServerJson } from './server.js';\nexport * from './agents.js';\nexport * from './agents-route.js';\nexport * from './offer.js';\nexport * from './server.js';\n\nexport type GeneratedArtifact = 'agents-md' | 'server-json' | 'offer' | 'agents-route';\nexport type GenerateParams = Partial<AigentifyConfig> & { framework?: string };\n\nfunction configFromParams(params: GenerateParams = {}): AigentifyConfig {\n const base = defaultConfig();\n return defineConfig({ ...base, ...params, offer: { ...(base.offer ?? {}), ...(params.offer ?? {}) } });\n}\n\nexport function generate(artifact: GeneratedArtifact, params: GenerateParams = {}): string {\n const config = configFromParams(params);\n if (artifact === 'agents-md') return generateAgentsMd(config);\n if (artifact === 'server-json') return generateServerJson(config);\n if (artifact === 'offer') return generateOffer(config);\n if (artifact === 'agents-route') return generateAgentsRoute(config, params.framework);\n throw new Error(`Unknown artifact: ${artifact}`);\n}\n"],"mappings":"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","names":[]} | ||
| {"version":3,"sources":["../src/mcp.ts","../src/audit.ts","../package.json","../src/constants.ts","../src/config.ts","../src/generators/agents.ts","../src/generators/agents-route.ts","../src/generators/offer.ts","../src/generators/server.ts","../src/generators/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { auditTarget } from './audit.js';\nimport { PKG_NAME, VERSION } from './constants.js';\nimport { generate, type GenerateParams, type GeneratedArtifact } from './generators/index.js';\n\nconst artifacts = ['agents-md', 'server-json', 'offer', 'agents-route'] as const;\n\nexport function createMcpServer(): McpServer {\n const server = new McpServer({ name: PKG_NAME, version: VERSION });\n server.registerTool('audit', {\n description: 'Audit a local directory or live URL for agent-native readiness.',\n inputSchema: { target: z.string() },\n }, async ({ target }) => ({ content: [{ type: 'text', text: JSON.stringify(await auditTarget(target), null, 2) }] }));\n server.registerTool('gen', {\n description: 'Generate an agent-native artifact as text.',\n inputSchema: { artifact: z.enum(artifacts), params: z.record(z.string(), z.unknown()).optional() },\n }, async ({ artifact, params }) => ({ content: [{ type: 'text', text: generate(artifact as GeneratedArtifact, (params ?? {}) as GenerateParams) }] }));\n return server;\n}\n\nexport async function startMcpServer(): Promise<void> {\n const server = createMcpServer();\n await server.connect(new StdioServerTransport());\n}\n\nif (import.meta.url === `file://${process.argv[1]}`) startMcpServer().catch(error => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n});\n","import { readFile, readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { SERVER_SCHEMA_URL, SERVER_SCHEMA_RE } from './constants.js';\n\nexport type AuditStatus = 'pass' | 'fail' | 'warn' | 'na';\nexport interface AuditCheck { id: string; status: AuditStatus; note: string; weight: number }\nexport interface AuditGap { id: string; note: string; fix: string }\nexport interface AuditReport { target: string; score: number; checks: AuditCheck[]; gaps: AuditGap[] }\nexport interface AuditOptions { fetch?: typeof globalThis.fetch }\n\ninterface Endpoint { status: number; contentType: string; text: string }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n honestText: string; hasMcp: boolean; networkFailure: boolean;\n}\n\nconst SKIPPED = new Set(['.git', 'node_modules', 'dist', 'coverage', '.next', '_reference_geoaeo']);\nconst WEIGHTS: Record<string, number> = {\n 'agents-md': 15, 'agents-md-public-safe': 10, 'server-json': 15, mcp: 15,\n 'offer-jsonld': 15, 'honest-offer': 10, 'llms-txt': 10, sitemap: 10,\n};\nconst FIXES: Record<string, string> = {\n 'agents-md': 'Add a public AGENTS.md at the target root or serve /agents.md as text/markdown.',\n 'agents-md-public-safe': 'Rewrite AGENTS.md as product guidance. Remove repository paths and contributor instructions.',\n 'server-json': `Add server.json and set \"$schema\" to \"${SERVER_SCHEMA_URL}\". Include a repository and a remotes or packages entry.`,\n mcp: 'Publish server.json, .mcp.json, or an MCP entry point.',\n 'offer-jsonld': 'Publish JSON-LD with @type Offer, or a SoftwareApplication with an offers property.',\n 'honest-offer': 'State the real price plainly. Remove scarcity, countdown, and urgency language.',\n 'llms-txt': 'Publish /llms.txt with a concise product description.',\n sitemap: 'Publish /sitemap.xml for URL discovery.',\n};\n\nfunction check(id: string, status: AuditStatus, note: string): AuditCheck { return { id, status, note, weight: WEIGHTS[id] }; }\n\nexport function scoreAuditChecks(checks: AuditCheck[]): number {\n const relevant = checks.filter(item => item.status !== 'na');\n const total = relevant.reduce((sum, item) => sum + item.weight, 0);\n if (!total) return 0;\n const earned = relevant.reduce((sum, item) => sum + (item.status === 'pass' ? item.weight : item.status === 'warn' ? item.weight / 2 : 0), 0);\n return Math.round((earned / total) * 100);\n}\n\nasync function walkFiles(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n if (entry.isDirectory() && !SKIPPED.has(entry.name)) files.push(...await walkFiles(path.join(directory, entry.name)));\n else if (entry.isFile()) files.push(path.join(directory, entry.name));\n }\n return files;\n}\n\nasync function readText(file: string | undefined): Promise<string> {\n if (!file) return '';\n try { return await readFile(file, 'utf8'); } catch { return ''; }\n}\n\nfunction findFile(files: string[], name: string): string | undefined {\n return files.find(file => {\n const normalized = file.replaceAll('\\\\', '/');\n return path.basename(normalized) === name || normalized.endsWith(`/${name}/route.ts`);\n });\n}\n\nfunction parseJson(text: string): Record<string, unknown> | undefined {\n try {\n const value: unknown = JSON.parse(text);\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n } catch { return undefined; }\n}\n\nfunction validServer(text: string): { valid: boolean; reason: string } {\n const value = parseJson(text);\n if (!value) return { valid: false, reason: 'server.json is not valid JSON.' };\n if (typeof value.$schema !== 'string' || !SERVER_SCHEMA_RE.test(value.$schema)) return { valid: false, reason: `server.json \"$schema\" must be a dated MCP registry schema like ${SERVER_SCHEMA_URL} (the bare .../server.json 404s).` };\n const missing = ['name', 'description', 'repository', 'version'].filter(key => !value[key]);\n if (missing.length) return { valid: false, reason: `server.json is missing: ${missing.join(', ')}.` };\n if (!Array.isArray(value.remotes) && !Array.isArray(value.packages)) return { valid: false, reason: 'server.json needs a remotes or packages entry.' };\n return { valid: true, reason: 'server.json has the required MCP registry fields.' };\n}\n\nfunction hasOffer(texts: string[]): boolean {\n return texts.some(text => /\"@type\"\\s*:\\s*\"Offer\"/i.test(text) || /\"@type\"\\s*:\\s*\"SoftwareApplication\"/i.test(text) && /\"offers\"\\s*:/.test(text));\n}\n\nfunction hasUrgency(text: string): boolean {\n return /limited time|act now|hurry|expires|only\\s+\\d+\\s+left|ends in|sign up now|countdown/i.test(text);\n}\n\nfunction publicSafe(text: string): boolean {\n return !(/\\bsrc\\//i.test(text) || /\\bapps\\//i.test(text) || /\\bpackages\\//i.test(text) || /\\b[\\w.-]+\\.ts\\b/i.test(text) || /npm run build/i.test(text) || /\\btsconfig\\b/i.test(text) || /\\bcontributors?\\b/i.test(text) || /^#+\\s*layout\\b/im.test(text));\n}\n\nfunction offerBlock(text: string): string {\n const match = /^#+\\s*Offer\\b/im.exec(text);\n if (!match || match.index === undefined) return '';\n const rest = text.slice(match.index);\n const nextHeading = /^#+\\s+/m.exec(rest.slice(match[0].length));\n return nextHeading?.index === undefined ? rest : rest.slice(0, match[0].length + nextHeading.index);\n}\n\nasync function directorySnapshot(directory: string): Promise<Snapshot> {\n const files = await walkFiles(directory);\n const agentsFile = findFile(files, 'AGENTS.md');\n const serverFile = findFile(files, 'server.json');\n const mcpFile = files.find(file => /(?:^|\\/)\\.mcp\\.json$/.test(file.replaceAll('\\\\', '/')));\n const packageFile = findFile(files, 'package.json');\n const packageText = await readText(packageFile);\n const hasMcpBin = /\"(?:aigentify|[^\"\\n]*mcp[^\"\\n]*)\"\\s*:/i.test(packageText);\n const agentsText = await readText(agentsFile);\n const offerTexts = [agentsText, ...await Promise.all(files.filter(file => /\\.(html?|json|jsonld|md|mdx|tsx|jsx|js|mjs|ts)$/.test(file)).map(readText))];\n const llmsFile = findFile(files, 'llms.txt');\n const sitemapFile = findFile(files, 'sitemap.xml');\n const offerFiles = files.filter(file => /\\.jsonld$|(?:^|\\/)offer[^/]*\\.(?:json|html?)$/i.test(file));\n const honestText = [offerBlock(agentsText), ...await Promise.all(offerFiles.map(readText))].join('\\n');\n return {\n agents: { status: agentsFile ? 200 : 404, contentType: 'text/markdown', text: agentsText },\n server: { status: serverFile ? 200 : 404, contentType: 'application/json', text: await readText(serverFile) },\n mcp: { status: mcpFile || serverFile || hasMcpBin ? 200 : 404, contentType: '', text: '' },\n home: { status: 200, contentType: 'text/plain', text: offerTexts.join('\\n') },\n llms: { status: llmsFile ? 200 : 404, contentType: 'text/plain', text: await readText(llmsFile) },\n sitemap: { status: sitemapFile ? 200 : 404, contentType: 'application/xml', text: await readText(sitemapFile) },\n honestText, hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), networkFailure: false,\n };\n}\n\nasync function fetchText(fetcher: typeof globalThis.fetch, url: string): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000) });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text() };\n } catch { return { status: 0, contentType: '', text: '' }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n const [agents, server, mcp, home, llms, sitemap] = await Promise.all([\n fetchText(fetcher, `${base}/agents.md`), fetchText(fetcher, `${base}/server.json`), fetchText(fetcher, `${base}/.well-known/mcp`),\n fetchText(fetcher, base), fetchText(fetcher, `${base}/llms.txt`), fetchText(fetcher, `${base}/sitemap.xml`),\n ]);\n const endpoints = [agents, server, mcp, home, llms, sitemap];\n return { agents, server, mcp, home, llms, sitemap, honestText: [home.text, offerBlock(agents.text)].join('\\n'), hasMcp: server.status >= 200 && server.status < 400 || mcp.status >= 200 && mcp.status < 400, networkFailure: endpoints.every(item => item.status === 0) };\n}\n\nfunction buildChecks(snapshot: Snapshot): AuditCheck[] {\n const agentsPresent = snapshot.agents.status === 200 && snapshot.agents.text.trim().length > 0 && /(?:text\\/(?:markdown|plain)|application\\/markdown)/i.test(snapshot.agents.contentType);\n const agentsStatus: AuditStatus = snapshot.agents.status === 0 ? 'warn' : agentsPresent ? 'pass' : 'fail';\n const publicStatus: AuditStatus = !agentsPresent ? (snapshot.agents.status === 0 ? 'warn' : 'na') : publicSafe(snapshot.agents.text) ? 'pass' : 'warn';\n const serverInfo = snapshot.server.status === 200 ? validServer(snapshot.server.text) : undefined;\n const serverStatus: AuditStatus = snapshot.server.status === 0 ? 'warn' : !snapshot.hasMcp ? 'na' : serverInfo?.valid ? 'pass' : 'fail';\n const mcpStatus: AuditStatus = snapshot.networkFailure ? 'warn' : snapshot.hasMcp ? 'pass' : 'fail';\n const offerTexts = [snapshot.home.text, snapshot.agents.text];\n const offerStatus: AuditStatus = snapshot.home.status === 0 ? 'warn' : hasOffer(offerTexts) ? 'pass' : 'fail';\n const honestStatus: AuditStatus = !hasOffer(offerTexts) && !agentsPresent ? (snapshot.home.status === 0 ? 'warn' : 'na') : hasUrgency(snapshot.honestText) ? 'warn' : 'pass';\n const llmsStatus: AuditStatus = snapshot.llms.status === 0 ? 'warn' : snapshot.llms.status >= 200 && snapshot.llms.status < 400 && snapshot.llms.text.trim() ? 'pass' : 'fail';\n const sitemapStatus: AuditStatus = snapshot.sitemap.status === 0 ? 'warn' : snapshot.sitemap.status >= 200 && snapshot.sitemap.status < 400 && snapshot.sitemap.text.trim() ? 'pass' : 'fail';\n return [\n check('agents-md', agentsStatus, agentsPresent ? 'AGENTS.md is available.' : snapshot.agents.status === 0 ? 'The AGENTS.md request failed.' : 'AGENTS.md is missing.'),\n check('agents-md-public-safe', publicStatus, publicStatus === 'pass' ? 'AGENTS.md describes the product as a public surface.' : publicStatus === 'na' ? 'No AGENTS.md is available to inspect.' : 'AGENTS.md contains repository-internal guidance.'),\n check('server-json', serverStatus, serverInfo?.valid ? serverInfo.reason : serverInfo?.reason ?? (!snapshot.hasMcp ? 'No MCP surface was detected.' : 'server.json is missing.')),\n check('mcp', mcpStatus, snapshot.networkFailure ? 'The MCP discovery request failed.' : snapshot.hasMcp ? 'An MCP surface is available.' : 'No MCP surface was found.'),\n check('offer-jsonld', offerStatus, offerStatus === 'pass' ? 'Offer JSON-LD is available.' : offerStatus === 'warn' ? 'The offer could not be checked.' : 'No Offer JSON-LD was found.'),\n check('honest-offer', honestStatus, honestStatus === 'pass' ? 'Offer language states the price without pressure.' : honestStatus === 'na' ? 'No offer or Offer block was found.' : 'Offer language contains scarcity, countdown, or urgency copy.'),\n check('llms-txt', llmsStatus, llmsStatus === 'pass' ? 'llms.txt is available.' : llmsStatus === 'warn' ? 'The llms.txt request failed.' : 'llms.txt is missing.'),\n check('sitemap', sitemapStatus, sitemapStatus === 'pass' ? 'sitemap.xml is available.' : sitemapStatus === 'warn' ? 'The sitemap request failed.' : 'sitemap.xml is missing.'),\n ];\n}\n\nexport async function auditTarget(target: string, options: AuditOptions = {}): Promise<AuditReport> {\n const targetStat = await stat(target).catch(() => undefined);\n const snapshot = targetStat?.isDirectory() ? await directorySnapshot(target) : await urlSnapshot(target, options.fetch ?? globalThis.fetch);\n const checks = buildChecks(snapshot);\n const gaps = checks.filter(item => item.status === 'fail' || item.status === 'warn').map(item => ({ id: item.id, note: item.note, fix: FIXES[item.id] }));\n return { target, score: scoreAuditChecks(checks), checks, gaps };\n}\n\nexport function formatAuditReport(report: AuditReport): string {\n const lines = [`${report.target}: ${report.score}/100`, ''];\n for (const item of report.checks) lines.push(`${item.status.toUpperCase().padEnd(4)} ${item.id}: ${item.note}`);\n lines.push('', 'Gaps:');\n if (!report.gaps.length) lines.push('None.');\n else report.gaps.forEach((gap, index) => lines.push(`${index + 1}. ${gap.id}: ${gap.fix}`));\n return lines.join('\\n');\n}\n","{\n \"name\": \"aigentify\",\n \"version\": \"0.1.1\",\n \"mcpName\": \"io.github.pooriaarab/aigentify\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\"aigentify\": \"dist/cli.js\", \"aigentify-mcp\": \"dist/mcp.js\"},\n \"exports\": {\".\": {\"types\": \"./dist/index.d.ts\", \"import\": \"./dist/index.js\", \"require\": \"./dist/index.cjs\"}},\n \"files\": [\"dist\"],\n \"repository\": {\"type\": \"git\", \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"},\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\"agents\", \"agentification\", \"mcp\", \"ai\", \"json-ld\"],\n \"publishConfig\": {\"access\": \"public\"},\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"lint\": \"tsc --noEmit --pretty false\",\n \"typecheck\": \"tsc --noEmit\",\n \"verify\": \"npm run typecheck && npm run build && npm run test\",\n \"prepublishOnly\": \"npm run verify\"\n },\n \"engines\": {\"node\": \">=20\"},\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.17.5\",\n \"cheerio\": \"^1.1.2\",\n \"commander\": \"^14.0.0\",\n \"jiti\": \"^2.5.1\",\n \"zod\": \"^4.0.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.15.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.2.4\"\n }\n}\n","import pkg from '../package.json';\n\nexport const PKG_NAME = pkg.name;\nexport const VERSION = pkg.version;\nexport const CONFIG_FILENAME = `${PKG_NAME}.config.ts`;\nexport const SERVER_SCHEMA_URL = 'https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json';\n// Any dated MCP registry schema is valid; only the bare `.../server.json` (no `.schema`) 404s.\nexport const SERVER_SCHEMA_RE = /^https:\\/\\/static\\.modelcontextprotocol\\.io\\/schemas\\/\\d{4}-\\d{2}-\\d{2}\\/server\\.schema\\.json$/;\n","export interface OfferConfig {\n name?: string;\n description?: string;\n price?: string | number;\n priceCurrency?: string;\n}\n\nexport interface AigentifyConfig {\n name: string;\n description: string;\n repository: string;\n version?: string;\n mcpUrl?: string;\n npmPackage?: string;\n offer?: OfferConfig;\n}\n\nexport function defineConfig(config: AigentifyConfig): AigentifyConfig {\n return { ...config, repository: config.repository.replace(/\\/+$/, ''), version: config.version ?? '0.1.0' };\n}\n\nexport function defaultConfig(): AigentifyConfig {\n return defineConfig({\n name: 'Your product',\n description: 'A product with an agent-native interface.',\n repository: 'https://github.com/your-org/your-product',\n npmPackage: 'your-package',\n });\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsMd(config: AigentifyConfig): string {\n const packageName = config.npmPackage ?? '<NPM_PACKAGE>';\n const mcp = config.mcpUrl ?? `npx ${packageName}`;\n const offer = config.offer;\n const offerLine = offer?.price === undefined ? 'Price: <PRICE>' : `Price: ${offer.priceCurrency ?? 'USD'} ${offer.price}`;\n return `# ${config.name}\n\n## Mental model\n\n${config.name} is ${config.description}\n\nUse the product interface for product work. Use the agent interface for repeatable tasks that need structured results.\n\n## The faces\n\n- Product: ${config.repository}\n- MCP: ${mcp}\n- Package: ${packageName}\n\n## MCP tools\n\n| Tool | Input | Result |\n| --- | --- | --- |\n| audit | target | An agent-readiness report with a score and gaps. |\n| gen | artifact and params | A generated agent-native artifact. |\n\n## The loop\n\n1. Audit the target.\n2. Fix the highest-impact gap.\n3. Generate or publish the missing artifact.\n4. Audit again and keep the report with the release.\n\n## Rules\n\n- Treat the product description and prices as source facts.\n- Return structured data when a tool provides it.\n- Ask for missing information before making a high-impact change.\n- Keep public agent instructions about the product and its use.\n\n## Offer\n\n${offer?.description ?? '<OFFER_DESCRIPTION>'}\n\n${offerLine}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateAgentsRoute(config: AigentifyConfig, framework = 'static'): string {\n if (framework === 'next') {\n return `# Serve /agents.md from a Next route\n\nCopy AGENTS.md to a public directory, or add this force-static route:\n\n\\`\\`\\`ts\nimport { readFile } from 'node:fs/promises';\n\nexport const dynamic = 'force-static';\n\nexport async function GET() {\n const body = await readFile('AGENTS.md', 'utf8');\n return new Response(body, { headers: { 'content-type': 'text/markdown; charset=utf-8' } });\n}\n\\`\\`\\`\n\nProduct: ${config.name}\n`;\n }\n return `# Serve /agents.md\n\nCopy the generated AGENTS.md file to public/agents.md and serve it as a static text/markdown response.\n\nProduct: ${config.name}\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\n\nexport function generateOffer(config: AigentifyConfig): string {\n const offer = config.offer ?? {};\n const data = {\n '@context': 'https://schema.org',\n '@type': 'SoftwareApplication',\n name: config.name,\n description: config.description,\n applicationCategory: 'DeveloperApplication',\n offers: [{\n '@type': 'Offer',\n name: offer.name ?? `${config.name} access`,\n ...(offer.description ? { description: offer.description } : {}),\n ...(offer.price === undefined ? {} : { price: String(offer.price) }),\n priceCurrency: offer.priceCurrency ?? 'USD',\n }],\n };\n return `${JSON.stringify(data, null, 2)}\\n`;\n}\n","import { SERVER_SCHEMA_URL } from '../constants.js';\nimport type { AigentifyConfig } from '../config.js';\n\nexport function generateServerJson(config: AigentifyConfig): string {\n const serverName = config.name.includes('/') ? config.name : `io.github.pooriaarab/${config.name.toLowerCase().replace(/[^a-z0-9._-]+/g, '-')}`;\n const server: Record<string, unknown> = {\n $schema: SERVER_SCHEMA_URL,\n name: serverName,\n description: config.description,\n repository: { url: config.repository, source: 'github' },\n version: config.version ?? '0.1.0',\n };\n if (config.mcpUrl) server.remotes = [{ type: 'streamable-http', url: config.mcpUrl }];\n else server.packages = [{ registryType: 'npm', registryBaseUrl: 'https://registry.npmjs.org', identifier: config.npmPackage ?? 'aigentify', version: config.version ?? '0.1.0', transport: { type: 'stdio' }, runtimeHint: 'npx', packageArguments: [{ type: 'positional', valueHint: 'subcommand', value: 'mcp' }] }];\n return `${JSON.stringify(server, null, 2)}\\n`;\n}\n","import type { AigentifyConfig } from '../config.js';\nimport { defaultConfig, defineConfig } from '../config.js';\nimport { generateAgentsMd } from './agents.js';\nimport { generateAgentsRoute } from './agents-route.js';\nimport { generateOffer } from './offer.js';\nimport { generateServerJson } from './server.js';\nexport * from './agents.js';\nexport * from './agents-route.js';\nexport * from './offer.js';\nexport * from './server.js';\n\nexport type GeneratedArtifact = 'agents-md' | 'server-json' | 'offer' | 'agents-route';\nexport type GenerateParams = Partial<AigentifyConfig> & { framework?: string };\n\nfunction configFromParams(params: GenerateParams = {}): AigentifyConfig {\n const base = defaultConfig();\n return defineConfig({ ...base, ...params, offer: { ...(base.offer ?? {}), ...(params.offer ?? {}) } });\n}\n\nexport function generate(artifact: GeneratedArtifact, params: GenerateParams = {}): string {\n const config = configFromParams(params);\n if (artifact === 'agents-md') return generateAgentsMd(config);\n if (artifact === 'server-json') return generateServerJson(config);\n if (artifact === 'offer') return generateOffer(config);\n if (artifact === 'agents-route') return generateAgentsRoute(config, params.framework);\n throw new Error(`Unknown artifact: ${artifact}`);\n}\n"],"mappings":"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","names":[]} |
+2
-1
| { | ||
| "name": "aigentify", | ||
| "version": "0.1.0", | ||
| "version": "0.1.1", | ||
| "mcpName": "io.github.pooriaarab/aigentify", | ||
| "description": "Audit and generate agent-native product surfaces", | ||
@@ -5,0 +6,0 @@ "type": "module", |
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
357477
1.9%2687
0.83%