+35
-8
@@ -39,3 +39,3 @@ #!/usr/bin/env node | ||
| name: "aigentify", | ||
| version: "0.1.1", | ||
| version: "0.1.2", | ||
| mcpName: "io.github.pooriaarab/aigentify", | ||
@@ -94,2 +94,5 @@ description: "Audit and generate agent-native product surfaces", | ||
| // src/audit.ts | ||
| function ok(status) { | ||
| return status >= 200 && status < 400; | ||
| } | ||
| function check(id, status, note) { | ||
@@ -182,5 +185,10 @@ return { id, status, note, weight: WEIGHTS[id] }; | ||
| sitemap: { status: sitemapFile ? 200 : 404, contentType: "application/xml", text: await readText(sitemapFile) }, | ||
| // advanced web signals are not meaningful for a repo directory — audited only for URL targets | ||
| wellKnown: { status: 404, contentType: "", text: "" }, | ||
| openapi: { status: 404, contentType: "", text: "" }, | ||
| agentsPage: { status: 404, contentType: "", text: "" }, | ||
| honestText, | ||
| hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), | ||
| networkFailure: false | ||
| networkFailure: false, | ||
| isUrl: false | ||
| }; | ||
@@ -198,3 +206,3 @@ } | ||
| const base = target.replace(/\/+$/, ""); | ||
| const [agents, server, mcp, home, llms, sitemap] = await Promise.all([ | ||
| const [agents, server, mcp, home, llms, sitemap, wellKnown, wellKnownCard, openapi, agentsPage] = await Promise.all([ | ||
| fetchText(fetcher, `${base}/agents.md`), | ||
@@ -205,6 +213,11 @@ fetchText(fetcher, `${base}/server.json`), | ||
| fetchText(fetcher, `${base}/llms.txt`), | ||
| fetchText(fetcher, `${base}/sitemap.xml`) | ||
| fetchText(fetcher, `${base}/sitemap.xml`), | ||
| fetchText(fetcher, `${base}/.well-known/agent.json`), | ||
| fetchText(fetcher, `${base}/.well-known/agent-card.json`), | ||
| fetchText(fetcher, `${base}/openapi.json`), | ||
| fetchText(fetcher, `${base}/agents`) | ||
| ]); | ||
| const endpoints = [agents, server, mcp, home, llms, sitemap]; | ||
| 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) }; | ||
| const wk = ok(wellKnown.status) ? wellKnown : wellKnownCard; | ||
| return { agents, server, mcp, home, llms, sitemap, wellKnown: wk, openapi, agentsPage, 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), isUrl: true }; | ||
| } | ||
@@ -223,2 +236,6 @@ function buildChecks(snapshot) { | ||
| const sitemapStatus = snapshot.sitemap.status === 0 ? "warn" : snapshot.sitemap.status >= 200 && snapshot.sitemap.status < 400 && snapshot.sitemap.text.trim() ? "pass" : "fail"; | ||
| const advanced = (endpoint) => !snapshot.isUrl || snapshot.networkFailure ? "na" : ok(endpoint.status) ? "pass" : "warn"; | ||
| const wellKnownStatus = advanced(snapshot.wellKnown); | ||
| const openapiStatus = advanced(snapshot.openapi); | ||
| const agentsPageStatus = advanced(snapshot.agentsPage); | ||
| return [ | ||
@@ -232,3 +249,6 @@ check("agents-md", agentsStatus, agentsPresent ? "AGENTS.md is available." : snapshot.agents.status === 0 ? "The AGENTS.md request failed." : "AGENTS.md is missing."), | ||
| check("llms-txt", llmsStatus, llmsStatus === "pass" ? "llms.txt is available." : llmsStatus === "warn" ? "The llms.txt request failed." : "llms.txt is missing."), | ||
| check("sitemap", sitemapStatus, sitemapStatus === "pass" ? "sitemap.xml is available." : sitemapStatus === "warn" ? "The sitemap request failed." : "sitemap.xml is missing.") | ||
| check("sitemap", sitemapStatus, sitemapStatus === "pass" ? "sitemap.xml is available." : sitemapStatus === "warn" ? "The sitemap request failed." : "sitemap.xml is missing."), | ||
| check("well-known-agent", wellKnownStatus, wellKnownStatus === "pass" ? "A .well-known agent manifest is available." : wellKnownStatus === "na" ? "Not audited (no served web surface)." : "No /.well-known/agent.json manifest was found."), | ||
| check("openapi", openapiStatus, openapiStatus === "pass" ? "openapi.json is available." : openapiStatus === "na" ? "Not audited (no served web surface)." : "No /openapi.json was found."), | ||
| check("agents-page", agentsPageStatus, agentsPageStatus === "pass" ? "An /agents page is available." : agentsPageStatus === "na" ? "Not audited (no served web surface)." : "No /agents onboarding page was found.") | ||
| ]; | ||
@@ -267,3 +287,7 @@ } | ||
| "llms-txt": 10, | ||
| sitemap: 10 | ||
| sitemap: 10, | ||
| // advanced ("world-class") web signals — na for CLI/dir targets, low weight | ||
| "well-known-agent": 5, | ||
| openapi: 5, | ||
| "agents-page": 5 | ||
| }; | ||
@@ -278,3 +302,6 @@ FIXES = { | ||
| "llms-txt": "Publish /llms.txt with a concise product description.", | ||
| sitemap: "Publish /sitemap.xml for URL discovery." | ||
| sitemap: "Publish /sitemap.xml for URL discovery.", | ||
| "well-known-agent": "Publish /.well-known/agent.json (or agent-card.json) so agents can discover capabilities.", | ||
| openapi: "Publish /openapi.json so agents have a machine-readable API reference.", | ||
| "agents-page": "Publish an /agents page with agent-specific onboarding (self-serve key, sandbox, quickstart)." | ||
| }; | ||
@@ -281,0 +308,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.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"]} | ||
| {"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.2\",\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 wellKnown: Endpoint; openapi: Endpoint; agentsPage: Endpoint;\n honestText: string; hasMcp: boolean; networkFailure: boolean; isUrl: boolean;\n}\n\nfunction ok(status: number): boolean { return status >= 200 && status < 400; }\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 // advanced (\"world-class\") web signals — na for CLI/dir targets, low weight\n 'well-known-agent': 5, openapi: 5, 'agents-page': 5,\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 'well-known-agent': 'Publish /.well-known/agent.json (or agent-card.json) so agents can discover capabilities.',\n openapi: 'Publish /openapi.json so agents have a machine-readable API reference.',\n 'agents-page': 'Publish an /agents page with agent-specific onboarding (self-serve key, sandbox, quickstart).',\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 // advanced web signals are not meaningful for a repo directory — audited only for URL targets\n wellKnown: { status: 404, contentType: '', text: '' }, openapi: { status: 404, contentType: '', text: '' }, agentsPage: { status: 404, contentType: '', text: '' },\n honestText, hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), networkFailure: false, isUrl: 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, wellKnown, wellKnownCard, openapi, agentsPage] = 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 fetchText(fetcher, `${base}/.well-known/agent.json`), fetchText(fetcher, `${base}/.well-known/agent-card.json`),\n fetchText(fetcher, `${base}/openapi.json`), fetchText(fetcher, `${base}/agents`),\n ]);\n const endpoints = [agents, server, mcp, home, llms, sitemap];\n // either well-known agent manifest counts\n const wk = ok(wellKnown.status) ? wellKnown : wellKnownCard;\n return { agents, server, mcp, home, llms, sitemap, wellKnown: wk, openapi, agentsPage, 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), isUrl: true };\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 // advanced world-class signals: only meaningful for a served web product (URL target)\n const advanced = (endpoint: Endpoint): AuditStatus => !snapshot.isUrl || snapshot.networkFailure ? 'na' : ok(endpoint.status) ? 'pass' : 'warn';\n const wellKnownStatus = advanced(snapshot.wellKnown);\n const openapiStatus = advanced(snapshot.openapi);\n const agentsPageStatus = advanced(snapshot.agentsPage);\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 check('well-known-agent', wellKnownStatus, wellKnownStatus === 'pass' ? 'A .well-known agent manifest is available.' : wellKnownStatus === 'na' ? 'Not audited (no served web surface).' : 'No /.well-known/agent.json manifest was found.'),\n check('openapi', openapiStatus, openapiStatus === 'pass' ? 'openapi.json is available.' : openapiStatus === 'na' ? 'Not audited (no served web surface).' : 'No /openapi.json was found.'),\n check('agents-page', agentsPageStatus, agentsPageStatus === 'pass' ? 'An /agents page is available.' : agentsPageStatus === 'na' ? 'Not audited (no served web surface).' : 'No /agents onboarding page was found.'),\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"]} |
+35
-8
@@ -18,3 +18,3 @@ #!/usr/bin/env node | ||
| name: "aigentify", | ||
| version: "0.1.1", | ||
| version: "0.1.2", | ||
| mcpName: "io.github.pooriaarab/aigentify", | ||
@@ -75,2 +75,5 @@ description: "Audit and generate agent-native product surfaces", | ||
| import path from "path"; | ||
| function ok(status) { | ||
| return status >= 200 && status < 400; | ||
| } | ||
| function check(id, status, note) { | ||
@@ -163,5 +166,10 @@ return { id, status, note, weight: WEIGHTS[id] }; | ||
| sitemap: { status: sitemapFile ? 200 : 404, contentType: "application/xml", text: await readText(sitemapFile) }, | ||
| // advanced web signals are not meaningful for a repo directory — audited only for URL targets | ||
| wellKnown: { status: 404, contentType: "", text: "" }, | ||
| openapi: { status: 404, contentType: "", text: "" }, | ||
| agentsPage: { status: 404, contentType: "", text: "" }, | ||
| honestText, | ||
| hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), | ||
| networkFailure: false | ||
| networkFailure: false, | ||
| isUrl: false | ||
| }; | ||
@@ -179,3 +187,3 @@ } | ||
| const base = target.replace(/\/+$/, ""); | ||
| const [agents, server, mcp, home, llms, sitemap] = await Promise.all([ | ||
| const [agents, server, mcp, home, llms, sitemap, wellKnown, wellKnownCard, openapi, agentsPage] = await Promise.all([ | ||
| fetchText(fetcher, `${base}/agents.md`), | ||
@@ -186,6 +194,11 @@ fetchText(fetcher, `${base}/server.json`), | ||
| fetchText(fetcher, `${base}/llms.txt`), | ||
| fetchText(fetcher, `${base}/sitemap.xml`) | ||
| fetchText(fetcher, `${base}/sitemap.xml`), | ||
| fetchText(fetcher, `${base}/.well-known/agent.json`), | ||
| fetchText(fetcher, `${base}/.well-known/agent-card.json`), | ||
| fetchText(fetcher, `${base}/openapi.json`), | ||
| fetchText(fetcher, `${base}/agents`) | ||
| ]); | ||
| const endpoints = [agents, server, mcp, home, llms, sitemap]; | ||
| 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) }; | ||
| const wk = ok(wellKnown.status) ? wellKnown : wellKnownCard; | ||
| return { agents, server, mcp, home, llms, sitemap, wellKnown: wk, openapi, agentsPage, 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), isUrl: true }; | ||
| } | ||
@@ -204,2 +217,6 @@ function buildChecks(snapshot) { | ||
| const sitemapStatus = snapshot.sitemap.status === 0 ? "warn" : snapshot.sitemap.status >= 200 && snapshot.sitemap.status < 400 && snapshot.sitemap.text.trim() ? "pass" : "fail"; | ||
| const advanced = (endpoint) => !snapshot.isUrl || snapshot.networkFailure ? "na" : ok(endpoint.status) ? "pass" : "warn"; | ||
| const wellKnownStatus = advanced(snapshot.wellKnown); | ||
| const openapiStatus = advanced(snapshot.openapi); | ||
| const agentsPageStatus = advanced(snapshot.agentsPage); | ||
| return [ | ||
@@ -213,3 +230,6 @@ check("agents-md", agentsStatus, agentsPresent ? "AGENTS.md is available." : snapshot.agents.status === 0 ? "The AGENTS.md request failed." : "AGENTS.md is missing."), | ||
| check("llms-txt", llmsStatus, llmsStatus === "pass" ? "llms.txt is available." : llmsStatus === "warn" ? "The llms.txt request failed." : "llms.txt is missing."), | ||
| check("sitemap", sitemapStatus, sitemapStatus === "pass" ? "sitemap.xml is available." : sitemapStatus === "warn" ? "The sitemap request failed." : "sitemap.xml is missing.") | ||
| check("sitemap", sitemapStatus, sitemapStatus === "pass" ? "sitemap.xml is available." : sitemapStatus === "warn" ? "The sitemap request failed." : "sitemap.xml is missing."), | ||
| check("well-known-agent", wellKnownStatus, wellKnownStatus === "pass" ? "A .well-known agent manifest is available." : wellKnownStatus === "na" ? "Not audited (no served web surface)." : "No /.well-known/agent.json manifest was found."), | ||
| check("openapi", openapiStatus, openapiStatus === "pass" ? "openapi.json is available." : openapiStatus === "na" ? "Not audited (no served web surface)." : "No /openapi.json was found."), | ||
| check("agents-page", agentsPageStatus, agentsPageStatus === "pass" ? "An /agents page is available." : agentsPageStatus === "na" ? "Not audited (no served web surface)." : "No /agents onboarding page was found.") | ||
| ]; | ||
@@ -246,3 +266,7 @@ } | ||
| "llms-txt": 10, | ||
| sitemap: 10 | ||
| sitemap: 10, | ||
| // advanced ("world-class") web signals — na for CLI/dir targets, low weight | ||
| "well-known-agent": 5, | ||
| openapi: 5, | ||
| "agents-page": 5 | ||
| }; | ||
@@ -257,3 +281,6 @@ FIXES = { | ||
| "llms-txt": "Publish /llms.txt with a concise product description.", | ||
| sitemap: "Publish /sitemap.xml for URL discovery." | ||
| sitemap: "Publish /sitemap.xml for URL discovery.", | ||
| "well-known-agent": "Publish /.well-known/agent.json (or agent-card.json) so agents can discover capabilities.", | ||
| openapi: "Publish /openapi.json so agents have a machine-readable API reference.", | ||
| "agents-page": "Publish an /agents page with agent-specific onboarding (self-serve key, sandbox, quickstart)." | ||
| }; | ||
@@ -260,0 +287,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.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"]} | ||
| {"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.2\",\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 wellKnown: Endpoint; openapi: Endpoint; agentsPage: Endpoint;\n honestText: string; hasMcp: boolean; networkFailure: boolean; isUrl: boolean;\n}\n\nfunction ok(status: number): boolean { return status >= 200 && status < 400; }\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 // advanced (\"world-class\") web signals — na for CLI/dir targets, low weight\n 'well-known-agent': 5, openapi: 5, 'agents-page': 5,\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 'well-known-agent': 'Publish /.well-known/agent.json (or agent-card.json) so agents can discover capabilities.',\n openapi: 'Publish /openapi.json so agents have a machine-readable API reference.',\n 'agents-page': 'Publish an /agents page with agent-specific onboarding (self-serve key, sandbox, quickstart).',\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 // advanced web signals are not meaningful for a repo directory — audited only for URL targets\n wellKnown: { status: 404, contentType: '', text: '' }, openapi: { status: 404, contentType: '', text: '' }, agentsPage: { status: 404, contentType: '', text: '' },\n honestText, hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), networkFailure: false, isUrl: 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, wellKnown, wellKnownCard, openapi, agentsPage] = 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 fetchText(fetcher, `${base}/.well-known/agent.json`), fetchText(fetcher, `${base}/.well-known/agent-card.json`),\n fetchText(fetcher, `${base}/openapi.json`), fetchText(fetcher, `${base}/agents`),\n ]);\n const endpoints = [agents, server, mcp, home, llms, sitemap];\n // either well-known agent manifest counts\n const wk = ok(wellKnown.status) ? wellKnown : wellKnownCard;\n return { agents, server, mcp, home, llms, sitemap, wellKnown: wk, openapi, agentsPage, 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), isUrl: true };\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 // advanced world-class signals: only meaningful for a served web product (URL target)\n const advanced = (endpoint: Endpoint): AuditStatus => !snapshot.isUrl || snapshot.networkFailure ? 'na' : ok(endpoint.status) ? 'pass' : 'warn';\n const wellKnownStatus = advanced(snapshot.wellKnown);\n const openapiStatus = advanced(snapshot.openapi);\n const agentsPageStatus = advanced(snapshot.agentsPage);\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 check('well-known-agent', wellKnownStatus, wellKnownStatus === 'pass' ? 'A .well-known agent manifest is available.' : wellKnownStatus === 'na' ? 'Not audited (no served web surface).' : 'No /.well-known/agent.json manifest was found.'),\n check('openapi', openapiStatus, openapiStatus === 'pass' ? 'openapi.json is available.' : openapiStatus === 'na' ? 'Not audited (no served web surface).' : 'No /openapi.json was found.'),\n check('agents-page', agentsPageStatus, agentsPageStatus === 'pass' ? 'An /agents page is available.' : agentsPageStatus === 'na' ? 'Not audited (no served web surface).' : 'No /agents onboarding page was found.'),\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"]} |
+35
-8
@@ -58,3 +58,3 @@ "use strict"; | ||
| name: "aigentify", | ||
| version: "0.1.1", | ||
| version: "0.1.2", | ||
| mcpName: "io.github.pooriaarab/aigentify", | ||
@@ -104,2 +104,5 @@ description: "Audit and generate agent-native product surfaces", | ||
| // src/audit.ts | ||
| function ok(status) { | ||
| return status >= 200 && status < 400; | ||
| } | ||
| var SKIPPED = /* @__PURE__ */ new Set([".git", "node_modules", "dist", "coverage", ".next", "_reference_geoaeo"]); | ||
@@ -114,3 +117,7 @@ var WEIGHTS = { | ||
| "llms-txt": 10, | ||
| sitemap: 10 | ||
| sitemap: 10, | ||
| // advanced ("world-class") web signals — na for CLI/dir targets, low weight | ||
| "well-known-agent": 5, | ||
| openapi: 5, | ||
| "agents-page": 5 | ||
| }; | ||
@@ -125,3 +132,6 @@ var FIXES = { | ||
| "llms-txt": "Publish /llms.txt with a concise product description.", | ||
| sitemap: "Publish /sitemap.xml for URL discovery." | ||
| sitemap: "Publish /sitemap.xml for URL discovery.", | ||
| "well-known-agent": "Publish /.well-known/agent.json (or agent-card.json) so agents can discover capabilities.", | ||
| openapi: "Publish /openapi.json so agents have a machine-readable API reference.", | ||
| "agents-page": "Publish an /agents page with agent-specific onboarding (self-serve key, sandbox, quickstart)." | ||
| }; | ||
@@ -215,5 +225,10 @@ function check(id, status, note) { | ||
| sitemap: { status: sitemapFile ? 200 : 404, contentType: "application/xml", text: await readText(sitemapFile) }, | ||
| // advanced web signals are not meaningful for a repo directory — audited only for URL targets | ||
| wellKnown: { status: 404, contentType: "", text: "" }, | ||
| openapi: { status: 404, contentType: "", text: "" }, | ||
| agentsPage: { status: 404, contentType: "", text: "" }, | ||
| honestText, | ||
| hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), | ||
| networkFailure: false | ||
| networkFailure: false, | ||
| isUrl: false | ||
| }; | ||
@@ -231,3 +246,3 @@ } | ||
| const base = target.replace(/\/+$/, ""); | ||
| const [agents, server, mcp, home, llms, sitemap] = await Promise.all([ | ||
| const [agents, server, mcp, home, llms, sitemap, wellKnown, wellKnownCard, openapi, agentsPage] = await Promise.all([ | ||
| fetchText(fetcher, `${base}/agents.md`), | ||
@@ -238,6 +253,11 @@ fetchText(fetcher, `${base}/server.json`), | ||
| fetchText(fetcher, `${base}/llms.txt`), | ||
| fetchText(fetcher, `${base}/sitemap.xml`) | ||
| fetchText(fetcher, `${base}/sitemap.xml`), | ||
| fetchText(fetcher, `${base}/.well-known/agent.json`), | ||
| fetchText(fetcher, `${base}/.well-known/agent-card.json`), | ||
| fetchText(fetcher, `${base}/openapi.json`), | ||
| fetchText(fetcher, `${base}/agents`) | ||
| ]); | ||
| const endpoints = [agents, server, mcp, home, llms, sitemap]; | ||
| 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) }; | ||
| const wk = ok(wellKnown.status) ? wellKnown : wellKnownCard; | ||
| return { agents, server, mcp, home, llms, sitemap, wellKnown: wk, openapi, agentsPage, 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), isUrl: true }; | ||
| } | ||
@@ -256,2 +276,6 @@ function buildChecks(snapshot) { | ||
| const sitemapStatus = snapshot.sitemap.status === 0 ? "warn" : snapshot.sitemap.status >= 200 && snapshot.sitemap.status < 400 && snapshot.sitemap.text.trim() ? "pass" : "fail"; | ||
| const advanced = (endpoint) => !snapshot.isUrl || snapshot.networkFailure ? "na" : ok(endpoint.status) ? "pass" : "warn"; | ||
| const wellKnownStatus = advanced(snapshot.wellKnown); | ||
| const openapiStatus = advanced(snapshot.openapi); | ||
| const agentsPageStatus = advanced(snapshot.agentsPage); | ||
| return [ | ||
@@ -265,3 +289,6 @@ check("agents-md", agentsStatus, agentsPresent ? "AGENTS.md is available." : snapshot.agents.status === 0 ? "The AGENTS.md request failed." : "AGENTS.md is missing."), | ||
| check("llms-txt", llmsStatus, llmsStatus === "pass" ? "llms.txt is available." : llmsStatus === "warn" ? "The llms.txt request failed." : "llms.txt is missing."), | ||
| check("sitemap", sitemapStatus, sitemapStatus === "pass" ? "sitemap.xml is available." : sitemapStatus === "warn" ? "The sitemap request failed." : "sitemap.xml is missing.") | ||
| check("sitemap", sitemapStatus, sitemapStatus === "pass" ? "sitemap.xml is available." : sitemapStatus === "warn" ? "The sitemap request failed." : "sitemap.xml is missing."), | ||
| check("well-known-agent", wellKnownStatus, wellKnownStatus === "pass" ? "A .well-known agent manifest is available." : wellKnownStatus === "na" ? "Not audited (no served web surface)." : "No /.well-known/agent.json manifest was found."), | ||
| check("openapi", openapiStatus, openapiStatus === "pass" ? "openapi.json is available." : openapiStatus === "na" ? "Not audited (no served web surface)." : "No /openapi.json was found."), | ||
| check("agents-page", agentsPageStatus, agentsPageStatus === "pass" ? "An /agents page is available." : agentsPageStatus === "na" ? "Not audited (no served web surface)." : "No /agents onboarding page was found.") | ||
| ]; | ||
@@ -268,0 +295,0 @@ } |
@@ -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, 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"]} | ||
| {"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 wellKnown: Endpoint; openapi: Endpoint; agentsPage: Endpoint;\n honestText: string; hasMcp: boolean; networkFailure: boolean; isUrl: boolean;\n}\n\nfunction ok(status: number): boolean { return status >= 200 && status < 400; }\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 // advanced (\"world-class\") web signals — na for CLI/dir targets, low weight\n 'well-known-agent': 5, openapi: 5, 'agents-page': 5,\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 'well-known-agent': 'Publish /.well-known/agent.json (or agent-card.json) so agents can discover capabilities.',\n openapi: 'Publish /openapi.json so agents have a machine-readable API reference.',\n 'agents-page': 'Publish an /agents page with agent-specific onboarding (self-serve key, sandbox, quickstart).',\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 // advanced web signals are not meaningful for a repo directory — audited only for URL targets\n wellKnown: { status: 404, contentType: '', text: '' }, openapi: { status: 404, contentType: '', text: '' }, agentsPage: { status: 404, contentType: '', text: '' },\n honestText, hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), networkFailure: false, isUrl: 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, wellKnown, wellKnownCard, openapi, agentsPage] = 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 fetchText(fetcher, `${base}/.well-known/agent.json`), fetchText(fetcher, `${base}/.well-known/agent-card.json`),\n fetchText(fetcher, `${base}/openapi.json`), fetchText(fetcher, `${base}/agents`),\n ]);\n const endpoints = [agents, server, mcp, home, llms, sitemap];\n // either well-known agent manifest counts\n const wk = ok(wellKnown.status) ? wellKnown : wellKnownCard;\n return { agents, server, mcp, home, llms, sitemap, wellKnown: wk, openapi, agentsPage, 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), isUrl: true };\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 // advanced world-class signals: only meaningful for a served web product (URL target)\n const advanced = (endpoint: Endpoint): AuditStatus => !snapshot.isUrl || snapshot.networkFailure ? 'na' : ok(endpoint.status) ? 'pass' : 'warn';\n const wellKnownStatus = advanced(snapshot.wellKnown);\n const openapiStatus = advanced(snapshot.openapi);\n const agentsPageStatus = advanced(snapshot.agentsPage);\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 check('well-known-agent', wellKnownStatus, wellKnownStatus === 'pass' ? 'A .well-known agent manifest is available.' : wellKnownStatus === 'na' ? 'Not audited (no served web surface).' : 'No /.well-known/agent.json manifest was found.'),\n check('openapi', openapiStatus, openapiStatus === 'pass' ? 'openapi.json is available.' : openapiStatus === 'na' ? 'Not audited (no served web surface).' : 'No /openapi.json was found.'),\n check('agents-page', agentsPageStatus, agentsPageStatus === 'pass' ? 'An /agents page is available.' : agentsPageStatus === 'na' ? 'Not audited (no served web surface).' : 'No /agents onboarding page was found.'),\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.2\",\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"]} |
+35
-8
@@ -8,3 +8,3 @@ // src/audit.ts | ||
| name: "aigentify", | ||
| version: "0.1.1", | ||
| version: "0.1.2", | ||
| mcpName: "io.github.pooriaarab/aigentify", | ||
@@ -54,2 +54,5 @@ description: "Audit and generate agent-native product surfaces", | ||
| // src/audit.ts | ||
| function ok(status) { | ||
| return status >= 200 && status < 400; | ||
| } | ||
| var SKIPPED = /* @__PURE__ */ new Set([".git", "node_modules", "dist", "coverage", ".next", "_reference_geoaeo"]); | ||
@@ -64,3 +67,7 @@ var WEIGHTS = { | ||
| "llms-txt": 10, | ||
| sitemap: 10 | ||
| sitemap: 10, | ||
| // advanced ("world-class") web signals — na for CLI/dir targets, low weight | ||
| "well-known-agent": 5, | ||
| openapi: 5, | ||
| "agents-page": 5 | ||
| }; | ||
@@ -75,3 +82,6 @@ var FIXES = { | ||
| "llms-txt": "Publish /llms.txt with a concise product description.", | ||
| sitemap: "Publish /sitemap.xml for URL discovery." | ||
| sitemap: "Publish /sitemap.xml for URL discovery.", | ||
| "well-known-agent": "Publish /.well-known/agent.json (or agent-card.json) so agents can discover capabilities.", | ||
| openapi: "Publish /openapi.json so agents have a machine-readable API reference.", | ||
| "agents-page": "Publish an /agents page with agent-specific onboarding (self-serve key, sandbox, quickstart)." | ||
| }; | ||
@@ -165,5 +175,10 @@ function check(id, status, note) { | ||
| sitemap: { status: sitemapFile ? 200 : 404, contentType: "application/xml", text: await readText(sitemapFile) }, | ||
| // advanced web signals are not meaningful for a repo directory — audited only for URL targets | ||
| wellKnown: { status: 404, contentType: "", text: "" }, | ||
| openapi: { status: 404, contentType: "", text: "" }, | ||
| agentsPage: { status: 404, contentType: "", text: "" }, | ||
| honestText, | ||
| hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), | ||
| networkFailure: false | ||
| networkFailure: false, | ||
| isUrl: false | ||
| }; | ||
@@ -181,3 +196,3 @@ } | ||
| const base = target.replace(/\/+$/, ""); | ||
| const [agents, server, mcp, home, llms, sitemap] = await Promise.all([ | ||
| const [agents, server, mcp, home, llms, sitemap, wellKnown, wellKnownCard, openapi, agentsPage] = await Promise.all([ | ||
| fetchText(fetcher, `${base}/agents.md`), | ||
@@ -188,6 +203,11 @@ fetchText(fetcher, `${base}/server.json`), | ||
| fetchText(fetcher, `${base}/llms.txt`), | ||
| fetchText(fetcher, `${base}/sitemap.xml`) | ||
| fetchText(fetcher, `${base}/sitemap.xml`), | ||
| fetchText(fetcher, `${base}/.well-known/agent.json`), | ||
| fetchText(fetcher, `${base}/.well-known/agent-card.json`), | ||
| fetchText(fetcher, `${base}/openapi.json`), | ||
| fetchText(fetcher, `${base}/agents`) | ||
| ]); | ||
| const endpoints = [agents, server, mcp, home, llms, sitemap]; | ||
| 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) }; | ||
| const wk = ok(wellKnown.status) ? wellKnown : wellKnownCard; | ||
| return { agents, server, mcp, home, llms, sitemap, wellKnown: wk, openapi, agentsPage, 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), isUrl: true }; | ||
| } | ||
@@ -206,2 +226,6 @@ function buildChecks(snapshot) { | ||
| const sitemapStatus = snapshot.sitemap.status === 0 ? "warn" : snapshot.sitemap.status >= 200 && snapshot.sitemap.status < 400 && snapshot.sitemap.text.trim() ? "pass" : "fail"; | ||
| const advanced = (endpoint) => !snapshot.isUrl || snapshot.networkFailure ? "na" : ok(endpoint.status) ? "pass" : "warn"; | ||
| const wellKnownStatus = advanced(snapshot.wellKnown); | ||
| const openapiStatus = advanced(snapshot.openapi); | ||
| const agentsPageStatus = advanced(snapshot.agentsPage); | ||
| return [ | ||
@@ -215,3 +239,6 @@ check("agents-md", agentsStatus, agentsPresent ? "AGENTS.md is available." : snapshot.agents.status === 0 ? "The AGENTS.md request failed." : "AGENTS.md is missing."), | ||
| check("llms-txt", llmsStatus, llmsStatus === "pass" ? "llms.txt is available." : llmsStatus === "warn" ? "The llms.txt request failed." : "llms.txt is missing."), | ||
| check("sitemap", sitemapStatus, sitemapStatus === "pass" ? "sitemap.xml is available." : sitemapStatus === "warn" ? "The sitemap request failed." : "sitemap.xml is missing.") | ||
| check("sitemap", sitemapStatus, sitemapStatus === "pass" ? "sitemap.xml is available." : sitemapStatus === "warn" ? "The sitemap request failed." : "sitemap.xml is missing."), | ||
| check("well-known-agent", wellKnownStatus, wellKnownStatus === "pass" ? "A .well-known agent manifest is available." : wellKnownStatus === "na" ? "Not audited (no served web surface)." : "No /.well-known/agent.json manifest was found."), | ||
| check("openapi", openapiStatus, openapiStatus === "pass" ? "openapi.json is available." : openapiStatus === "na" ? "Not audited (no served web surface)." : "No /openapi.json was found."), | ||
| check("agents-page", agentsPageStatus, agentsPageStatus === "pass" ? "An /agents page is available." : agentsPageStatus === "na" ? "Not audited (no served web surface)." : "No /agents onboarding page was found.") | ||
| ]; | ||
@@ -218,0 +245,0 @@ } |
@@ -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, 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":[]} | ||
| {"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 wellKnown: Endpoint; openapi: Endpoint; agentsPage: Endpoint;\n honestText: string; hasMcp: boolean; networkFailure: boolean; isUrl: boolean;\n}\n\nfunction ok(status: number): boolean { return status >= 200 && status < 400; }\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 // advanced (\"world-class\") web signals — na for CLI/dir targets, low weight\n 'well-known-agent': 5, openapi: 5, 'agents-page': 5,\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 'well-known-agent': 'Publish /.well-known/agent.json (or agent-card.json) so agents can discover capabilities.',\n openapi: 'Publish /openapi.json so agents have a machine-readable API reference.',\n 'agents-page': 'Publish an /agents page with agent-specific onboarding (self-serve key, sandbox, quickstart).',\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 // advanced web signals are not meaningful for a repo directory — audited only for URL targets\n wellKnown: { status: 404, contentType: '', text: '' }, openapi: { status: 404, contentType: '', text: '' }, agentsPage: { status: 404, contentType: '', text: '' },\n honestText, hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), networkFailure: false, isUrl: 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, wellKnown, wellKnownCard, openapi, agentsPage] = 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 fetchText(fetcher, `${base}/.well-known/agent.json`), fetchText(fetcher, `${base}/.well-known/agent-card.json`),\n fetchText(fetcher, `${base}/openapi.json`), fetchText(fetcher, `${base}/agents`),\n ]);\n const endpoints = [agents, server, mcp, home, llms, sitemap];\n // either well-known agent manifest counts\n const wk = ok(wellKnown.status) ? wellKnown : wellKnownCard;\n return { agents, server, mcp, home, llms, sitemap, wellKnown: wk, openapi, agentsPage, 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), isUrl: true };\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 // advanced world-class signals: only meaningful for a served web product (URL target)\n const advanced = (endpoint: Endpoint): AuditStatus => !snapshot.isUrl || snapshot.networkFailure ? 'na' : ok(endpoint.status) ? 'pass' : 'warn';\n const wellKnownStatus = advanced(snapshot.wellKnown);\n const openapiStatus = advanced(snapshot.openapi);\n const agentsPageStatus = advanced(snapshot.agentsPage);\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 check('well-known-agent', wellKnownStatus, wellKnownStatus === 'pass' ? 'A .well-known agent manifest is available.' : wellKnownStatus === 'na' ? 'Not audited (no served web surface).' : 'No /.well-known/agent.json manifest was found.'),\n check('openapi', openapiStatus, openapiStatus === 'pass' ? 'openapi.json is available.' : openapiStatus === 'na' ? 'Not audited (no served web surface).' : 'No /openapi.json was found.'),\n check('agents-page', agentsPageStatus, agentsPageStatus === 'pass' ? 'An /agents page is available.' : agentsPageStatus === 'na' ? 'Not audited (no served web surface).' : 'No /agents onboarding page was found.'),\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.2\",\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":[]} |
+35
-8
@@ -49,3 +49,3 @@ #!/usr/bin/env node | ||
| name: "aigentify", | ||
| version: "0.1.1", | ||
| version: "0.1.2", | ||
| mcpName: "io.github.pooriaarab/aigentify", | ||
@@ -95,2 +95,5 @@ description: "Audit and generate agent-native product surfaces", | ||
| // src/audit.ts | ||
| function ok(status) { | ||
| return status >= 200 && status < 400; | ||
| } | ||
| var SKIPPED = /* @__PURE__ */ new Set([".git", "node_modules", "dist", "coverage", ".next", "_reference_geoaeo"]); | ||
@@ -105,3 +108,7 @@ var WEIGHTS = { | ||
| "llms-txt": 10, | ||
| sitemap: 10 | ||
| sitemap: 10, | ||
| // advanced ("world-class") web signals — na for CLI/dir targets, low weight | ||
| "well-known-agent": 5, | ||
| openapi: 5, | ||
| "agents-page": 5 | ||
| }; | ||
@@ -116,3 +123,6 @@ var FIXES = { | ||
| "llms-txt": "Publish /llms.txt with a concise product description.", | ||
| sitemap: "Publish /sitemap.xml for URL discovery." | ||
| sitemap: "Publish /sitemap.xml for URL discovery.", | ||
| "well-known-agent": "Publish /.well-known/agent.json (or agent-card.json) so agents can discover capabilities.", | ||
| openapi: "Publish /openapi.json so agents have a machine-readable API reference.", | ||
| "agents-page": "Publish an /agents page with agent-specific onboarding (self-serve key, sandbox, quickstart)." | ||
| }; | ||
@@ -206,5 +216,10 @@ function check(id, status, note) { | ||
| sitemap: { status: sitemapFile ? 200 : 404, contentType: "application/xml", text: await readText(sitemapFile) }, | ||
| // advanced web signals are not meaningful for a repo directory — audited only for URL targets | ||
| wellKnown: { status: 404, contentType: "", text: "" }, | ||
| openapi: { status: 404, contentType: "", text: "" }, | ||
| agentsPage: { status: 404, contentType: "", text: "" }, | ||
| honestText, | ||
| hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), | ||
| networkFailure: false | ||
| networkFailure: false, | ||
| isUrl: false | ||
| }; | ||
@@ -222,3 +237,3 @@ } | ||
| const base = target.replace(/\/+$/, ""); | ||
| const [agents, server, mcp, home, llms, sitemap] = await Promise.all([ | ||
| const [agents, server, mcp, home, llms, sitemap, wellKnown, wellKnownCard, openapi, agentsPage] = await Promise.all([ | ||
| fetchText(fetcher, `${base}/agents.md`), | ||
@@ -229,6 +244,11 @@ fetchText(fetcher, `${base}/server.json`), | ||
| fetchText(fetcher, `${base}/llms.txt`), | ||
| fetchText(fetcher, `${base}/sitemap.xml`) | ||
| fetchText(fetcher, `${base}/sitemap.xml`), | ||
| fetchText(fetcher, `${base}/.well-known/agent.json`), | ||
| fetchText(fetcher, `${base}/.well-known/agent-card.json`), | ||
| fetchText(fetcher, `${base}/openapi.json`), | ||
| fetchText(fetcher, `${base}/agents`) | ||
| ]); | ||
| const endpoints = [agents, server, mcp, home, llms, sitemap]; | ||
| 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) }; | ||
| const wk = ok(wellKnown.status) ? wellKnown : wellKnownCard; | ||
| return { agents, server, mcp, home, llms, sitemap, wellKnown: wk, openapi, agentsPage, 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), isUrl: true }; | ||
| } | ||
@@ -247,2 +267,6 @@ function buildChecks(snapshot) { | ||
| const sitemapStatus = snapshot.sitemap.status === 0 ? "warn" : snapshot.sitemap.status >= 200 && snapshot.sitemap.status < 400 && snapshot.sitemap.text.trim() ? "pass" : "fail"; | ||
| const advanced = (endpoint) => !snapshot.isUrl || snapshot.networkFailure ? "na" : ok(endpoint.status) ? "pass" : "warn"; | ||
| const wellKnownStatus = advanced(snapshot.wellKnown); | ||
| const openapiStatus = advanced(snapshot.openapi); | ||
| const agentsPageStatus = advanced(snapshot.agentsPage); | ||
| return [ | ||
@@ -256,3 +280,6 @@ check("agents-md", agentsStatus, agentsPresent ? "AGENTS.md is available." : snapshot.agents.status === 0 ? "The AGENTS.md request failed." : "AGENTS.md is missing."), | ||
| check("llms-txt", llmsStatus, llmsStatus === "pass" ? "llms.txt is available." : llmsStatus === "warn" ? "The llms.txt request failed." : "llms.txt is missing."), | ||
| check("sitemap", sitemapStatus, sitemapStatus === "pass" ? "sitemap.xml is available." : sitemapStatus === "warn" ? "The sitemap request failed." : "sitemap.xml is missing.") | ||
| check("sitemap", sitemapStatus, sitemapStatus === "pass" ? "sitemap.xml is available." : sitemapStatus === "warn" ? "The sitemap request failed." : "sitemap.xml is missing."), | ||
| check("well-known-agent", wellKnownStatus, wellKnownStatus === "pass" ? "A .well-known agent manifest is available." : wellKnownStatus === "na" ? "Not audited (no served web surface)." : "No /.well-known/agent.json manifest was found."), | ||
| check("openapi", openapiStatus, openapiStatus === "pass" ? "openapi.json is available." : openapiStatus === "na" ? "Not audited (no served web surface)." : "No /openapi.json was found."), | ||
| check("agents-page", agentsPageStatus, agentsPageStatus === "pass" ? "An /agents page is available." : agentsPageStatus === "na" ? "Not audited (no served web surface)." : "No /agents onboarding page was found.") | ||
| ]; | ||
@@ -259,0 +286,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, 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"]} | ||
| {"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 wellKnown: Endpoint; openapi: Endpoint; agentsPage: Endpoint;\n honestText: string; hasMcp: boolean; networkFailure: boolean; isUrl: boolean;\n}\n\nfunction ok(status: number): boolean { return status >= 200 && status < 400; }\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 // advanced (\"world-class\") web signals — na for CLI/dir targets, low weight\n 'well-known-agent': 5, openapi: 5, 'agents-page': 5,\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 'well-known-agent': 'Publish /.well-known/agent.json (or agent-card.json) so agents can discover capabilities.',\n openapi: 'Publish /openapi.json so agents have a machine-readable API reference.',\n 'agents-page': 'Publish an /agents page with agent-specific onboarding (self-serve key, sandbox, quickstart).',\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 // advanced web signals are not meaningful for a repo directory — audited only for URL targets\n wellKnown: { status: 404, contentType: '', text: '' }, openapi: { status: 404, contentType: '', text: '' }, agentsPage: { status: 404, contentType: '', text: '' },\n honestText, hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), networkFailure: false, isUrl: 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, wellKnown, wellKnownCard, openapi, agentsPage] = 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 fetchText(fetcher, `${base}/.well-known/agent.json`), fetchText(fetcher, `${base}/.well-known/agent-card.json`),\n fetchText(fetcher, `${base}/openapi.json`), fetchText(fetcher, `${base}/agents`),\n ]);\n const endpoints = [agents, server, mcp, home, llms, sitemap];\n // either well-known agent manifest counts\n const wk = ok(wellKnown.status) ? wellKnown : wellKnownCard;\n return { agents, server, mcp, home, llms, sitemap, wellKnown: wk, openapi, agentsPage, 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), isUrl: true };\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 // advanced world-class signals: only meaningful for a served web product (URL target)\n const advanced = (endpoint: Endpoint): AuditStatus => !snapshot.isUrl || snapshot.networkFailure ? 'na' : ok(endpoint.status) ? 'pass' : 'warn';\n const wellKnownStatus = advanced(snapshot.wellKnown);\n const openapiStatus = advanced(snapshot.openapi);\n const agentsPageStatus = advanced(snapshot.agentsPage);\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 check('well-known-agent', wellKnownStatus, wellKnownStatus === 'pass' ? 'A .well-known agent manifest is available.' : wellKnownStatus === 'na' ? 'Not audited (no served web surface).' : 'No /.well-known/agent.json manifest was found.'),\n check('openapi', openapiStatus, openapiStatus === 'pass' ? 'openapi.json is available.' : openapiStatus === 'na' ? 'Not audited (no served web surface).' : 'No /openapi.json was found.'),\n check('agents-page', agentsPageStatus, agentsPageStatus === 'pass' ? 'An /agents page is available.' : agentsPageStatus === 'na' ? 'Not audited (no served web surface).' : 'No /agents onboarding page was found.'),\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.2\",\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"]} |
+35
-8
@@ -15,3 +15,3 @@ #!/usr/bin/env node | ||
| name: "aigentify", | ||
| version: "0.1.1", | ||
| version: "0.1.2", | ||
| mcpName: "io.github.pooriaarab/aigentify", | ||
@@ -61,2 +61,5 @@ description: "Audit and generate agent-native product surfaces", | ||
| // src/audit.ts | ||
| function ok(status) { | ||
| return status >= 200 && status < 400; | ||
| } | ||
| var SKIPPED = /* @__PURE__ */ new Set([".git", "node_modules", "dist", "coverage", ".next", "_reference_geoaeo"]); | ||
@@ -71,3 +74,7 @@ var WEIGHTS = { | ||
| "llms-txt": 10, | ||
| sitemap: 10 | ||
| sitemap: 10, | ||
| // advanced ("world-class") web signals — na for CLI/dir targets, low weight | ||
| "well-known-agent": 5, | ||
| openapi: 5, | ||
| "agents-page": 5 | ||
| }; | ||
@@ -82,3 +89,6 @@ var FIXES = { | ||
| "llms-txt": "Publish /llms.txt with a concise product description.", | ||
| sitemap: "Publish /sitemap.xml for URL discovery." | ||
| sitemap: "Publish /sitemap.xml for URL discovery.", | ||
| "well-known-agent": "Publish /.well-known/agent.json (or agent-card.json) so agents can discover capabilities.", | ||
| openapi: "Publish /openapi.json so agents have a machine-readable API reference.", | ||
| "agents-page": "Publish an /agents page with agent-specific onboarding (self-serve key, sandbox, quickstart)." | ||
| }; | ||
@@ -172,5 +182,10 @@ function check(id, status, note) { | ||
| sitemap: { status: sitemapFile ? 200 : 404, contentType: "application/xml", text: await readText(sitemapFile) }, | ||
| // advanced web signals are not meaningful for a repo directory — audited only for URL targets | ||
| wellKnown: { status: 404, contentType: "", text: "" }, | ||
| openapi: { status: 404, contentType: "", text: "" }, | ||
| agentsPage: { status: 404, contentType: "", text: "" }, | ||
| honestText, | ||
| hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), | ||
| networkFailure: false | ||
| networkFailure: false, | ||
| isUrl: false | ||
| }; | ||
@@ -188,3 +203,3 @@ } | ||
| const base = target.replace(/\/+$/, ""); | ||
| const [agents, server, mcp, home, llms, sitemap] = await Promise.all([ | ||
| const [agents, server, mcp, home, llms, sitemap, wellKnown, wellKnownCard, openapi, agentsPage] = await Promise.all([ | ||
| fetchText(fetcher, `${base}/agents.md`), | ||
@@ -195,6 +210,11 @@ fetchText(fetcher, `${base}/server.json`), | ||
| fetchText(fetcher, `${base}/llms.txt`), | ||
| fetchText(fetcher, `${base}/sitemap.xml`) | ||
| fetchText(fetcher, `${base}/sitemap.xml`), | ||
| fetchText(fetcher, `${base}/.well-known/agent.json`), | ||
| fetchText(fetcher, `${base}/.well-known/agent-card.json`), | ||
| fetchText(fetcher, `${base}/openapi.json`), | ||
| fetchText(fetcher, `${base}/agents`) | ||
| ]); | ||
| const endpoints = [agents, server, mcp, home, llms, sitemap]; | ||
| 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) }; | ||
| const wk = ok(wellKnown.status) ? wellKnown : wellKnownCard; | ||
| return { agents, server, mcp, home, llms, sitemap, wellKnown: wk, openapi, agentsPage, 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), isUrl: true }; | ||
| } | ||
@@ -213,2 +233,6 @@ function buildChecks(snapshot) { | ||
| const sitemapStatus = snapshot.sitemap.status === 0 ? "warn" : snapshot.sitemap.status >= 200 && snapshot.sitemap.status < 400 && snapshot.sitemap.text.trim() ? "pass" : "fail"; | ||
| const advanced = (endpoint) => !snapshot.isUrl || snapshot.networkFailure ? "na" : ok(endpoint.status) ? "pass" : "warn"; | ||
| const wellKnownStatus = advanced(snapshot.wellKnown); | ||
| const openapiStatus = advanced(snapshot.openapi); | ||
| const agentsPageStatus = advanced(snapshot.agentsPage); | ||
| return [ | ||
@@ -222,3 +246,6 @@ check("agents-md", agentsStatus, agentsPresent ? "AGENTS.md is available." : snapshot.agents.status === 0 ? "The AGENTS.md request failed." : "AGENTS.md is missing."), | ||
| check("llms-txt", llmsStatus, llmsStatus === "pass" ? "llms.txt is available." : llmsStatus === "warn" ? "The llms.txt request failed." : "llms.txt is missing."), | ||
| check("sitemap", sitemapStatus, sitemapStatus === "pass" ? "sitemap.xml is available." : sitemapStatus === "warn" ? "The sitemap request failed." : "sitemap.xml is missing.") | ||
| check("sitemap", sitemapStatus, sitemapStatus === "pass" ? "sitemap.xml is available." : sitemapStatus === "warn" ? "The sitemap request failed." : "sitemap.xml is missing."), | ||
| check("well-known-agent", wellKnownStatus, wellKnownStatus === "pass" ? "A .well-known agent manifest is available." : wellKnownStatus === "na" ? "Not audited (no served web surface)." : "No /.well-known/agent.json manifest was found."), | ||
| check("openapi", openapiStatus, openapiStatus === "pass" ? "openapi.json is available." : openapiStatus === "na" ? "Not audited (no served web surface)." : "No /openapi.json was found."), | ||
| check("agents-page", agentsPageStatus, agentsPageStatus === "pass" ? "An /agents page is available." : agentsPageStatus === "na" ? "Not audited (no served web surface)." : "No /agents onboarding page was found.") | ||
| ]; | ||
@@ -225,0 +252,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, 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":[]} | ||
| {"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 wellKnown: Endpoint; openapi: Endpoint; agentsPage: Endpoint;\n honestText: string; hasMcp: boolean; networkFailure: boolean; isUrl: boolean;\n}\n\nfunction ok(status: number): boolean { return status >= 200 && status < 400; }\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 // advanced (\"world-class\") web signals — na for CLI/dir targets, low weight\n 'well-known-agent': 5, openapi: 5, 'agents-page': 5,\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 'well-known-agent': 'Publish /.well-known/agent.json (or agent-card.json) so agents can discover capabilities.',\n openapi: 'Publish /openapi.json so agents have a machine-readable API reference.',\n 'agents-page': 'Publish an /agents page with agent-specific onboarding (self-serve key, sandbox, quickstart).',\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 // advanced web signals are not meaningful for a repo directory — audited only for URL targets\n wellKnown: { status: 404, contentType: '', text: '' }, openapi: { status: 404, contentType: '', text: '' }, agentsPage: { status: 404, contentType: '', text: '' },\n honestText, hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), networkFailure: false, isUrl: 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, wellKnown, wellKnownCard, openapi, agentsPage] = 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 fetchText(fetcher, `${base}/.well-known/agent.json`), fetchText(fetcher, `${base}/.well-known/agent-card.json`),\n fetchText(fetcher, `${base}/openapi.json`), fetchText(fetcher, `${base}/agents`),\n ]);\n const endpoints = [agents, server, mcp, home, llms, sitemap];\n // either well-known agent manifest counts\n const wk = ok(wellKnown.status) ? wellKnown : wellKnownCard;\n return { agents, server, mcp, home, llms, sitemap, wellKnown: wk, openapi, agentsPage, 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), isUrl: true };\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 // advanced world-class signals: only meaningful for a served web product (URL target)\n const advanced = (endpoint: Endpoint): AuditStatus => !snapshot.isUrl || snapshot.networkFailure ? 'na' : ok(endpoint.status) ? 'pass' : 'warn';\n const wellKnownStatus = advanced(snapshot.wellKnown);\n const openapiStatus = advanced(snapshot.openapi);\n const agentsPageStatus = advanced(snapshot.agentsPage);\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 check('well-known-agent', wellKnownStatus, wellKnownStatus === 'pass' ? 'A .well-known agent manifest is available.' : wellKnownStatus === 'na' ? 'Not audited (no served web surface).' : 'No /.well-known/agent.json manifest was found.'),\n check('openapi', openapiStatus, openapiStatus === 'pass' ? 'openapi.json is available.' : openapiStatus === 'na' ? 'Not audited (no served web surface).' : 'No /openapi.json was found.'),\n check('agents-page', agentsPageStatus, agentsPageStatus === 'pass' ? 'An /agents page is available.' : agentsPageStatus === 'na' ? 'Not audited (no served web surface).' : 'No /agents onboarding page was found.'),\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.2\",\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":[]} |
+1
-1
| { | ||
| "name": "aigentify", | ||
| "version": "0.1.1", | ||
| "version": "0.1.2", | ||
| "mcpName": "io.github.pooriaarab/aigentify", | ||
@@ -5,0 +5,0 @@ "description": "Audit and generate agent-native product surfaces", |
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
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.
390341
9.19%2855
6.25%14
7.69%