+42
-6
@@ -39,3 +39,3 @@ #!/usr/bin/env node | ||
| name: "aigentify", | ||
| version: "0.2.0", | ||
| version: "0.3.0", | ||
| mcpName: "io.github.pooriaarab/aigentify", | ||
@@ -215,2 +215,5 @@ description: "Audit and generate agent-native product surfaces", | ||
| homeAsAgent: { status: 404, contentType: "", text: "" }, | ||
| authMd: { status: 404, contentType: "", text: "" }, | ||
| apiCatalog: { status: 404, contentType: "", text: "" }, | ||
| agentCard: { status: 404, contentType: "", text: "" }, | ||
| honestText, | ||
@@ -250,3 +253,5 @@ hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), | ||
| homeMarkdown, | ||
| homeAsAgent | ||
| homeAsAgent, | ||
| authMd, | ||
| apiCatalog | ||
| ] = await Promise.all([ | ||
@@ -265,4 +270,7 @@ fetchText(fetcher, `${base}/agents.md`), | ||
| fetchText(fetcher, base, { headers: { accept: "text/markdown" } }), | ||
| fetchText(fetcher, base, { headers: { "user-agent": "ora-agent" } }) | ||
| fetchText(fetcher, base, { headers: { "user-agent": "ora-agent" } }), | ||
| fetchText(fetcher, `${base}/auth.md`), | ||
| fetchText(fetcher, `${base}/.well-known/api-catalog`) | ||
| ]); | ||
| const agentCard = wellKnownCard; | ||
| const endpoints = [agents, server, mcp, home, llms, sitemap]; | ||
@@ -283,2 +291,5 @@ const wk = ok(wellKnown.status) ? wellKnown : wellKnownCard; | ||
| homeAsAgent, | ||
| authMd, | ||
| apiCatalog, | ||
| agentCard, | ||
| honestText: [home.text, offerBlock(agents.text)].join("\n"), | ||
@@ -369,2 +380,11 @@ hasMcp: server.status >= 200 && server.status < 400 || mcp.status >= 200 && mcp.status < 400, | ||
| const rateLimitStatus = !urlOnly ? "na" : hasRateLimitHeaders([snapshot.openapi, snapshot.server, snapshot.home]) ? "pass" : "warn"; | ||
| const authMdStatus = !urlOnly ? "na" : ok(snapshot.authMd.status) && snapshot.authMd.text.trim().length > 0 && (/text\/markdown/i.test(snapshot.authMd.contentType) || snapshot.authMd.text.trimStart().startsWith("#")) ? "pass" : "warn"; | ||
| const apiCatalogStatus = !urlOnly ? "na" : ok(snapshot.apiCatalog.status) && Array.isArray(parseJson(snapshot.apiCatalog.text)?.linkset) ? "pass" : "warn"; | ||
| const agentCardStatus = !urlOnly ? "na" : (() => { | ||
| if (!ok(snapshot.agentCard.status)) return "warn"; | ||
| const card = parseJson(snapshot.agentCard.text); | ||
| return card && typeof card.name === "string" && card.name.trim().length > 0 && typeof card.url === "string" && card.url.trim().length > 0 ? "pass" : "warn"; | ||
| })(); | ||
| const linkHeadersStatus = !urlOnly ? "na" : /llms\.txt|openapi\.json|agent-card|\.well-known/i.test(snapshot.home.headers?.link ?? "") ? "pass" : "warn"; | ||
| const markdownAltStatus = !urlOnly ? "na" : [...snapshot.home.text.matchAll(/<link\b[^>]*>/gi)].some(([tag]) => /rel=["']?alternate["']?/i.test(tag) && /type=["']?text\/markdown/i.test(tag)) ? "pass" : "warn"; | ||
| return [ | ||
@@ -387,3 +407,8 @@ check("agents-md", agentsStatus, agentsPresent ? "AGENTS.md is available." : snapshot.agents.status === 0 ? "The AGENTS.md request failed." : "AGENTS.md is missing."), | ||
| check("crawler-reachable", crawlerStatus, crawlerStatus === "pass" ? "The homepage is reachable by an agent User-Agent." : crawlerStatus === "na" ? "Not audited (no served web surface)." : "An agent User-Agent could not reach the homepage."), | ||
| check("rate-limit-headers", rateLimitStatus, rateLimitStatus === "pass" ? "Standard rate-limit headers are present." : rateLimitStatus === "na" ? "Not audited (no served web surface)." : "No RateLimit-* headers were found on probed endpoints.") | ||
| check("rate-limit-headers", rateLimitStatus, rateLimitStatus === "pass" ? "Standard rate-limit headers are present." : rateLimitStatus === "na" ? "Not audited (no served web surface)." : "No RateLimit-* headers were found on probed endpoints."), | ||
| check("auth-md", authMdStatus, authMdStatus === "pass" ? "/auth.md is available." : authMdStatus === "na" ? "Not audited (no served web surface)." : "No /auth.md agent-auth guide was found."), | ||
| check("api-catalog", apiCatalogStatus, apiCatalogStatus === "pass" ? "/.well-known/api-catalog is available." : apiCatalogStatus === "na" ? "Not audited (no served web surface)." : "No /.well-known/api-catalog (RFC 9727) was found."), | ||
| check("agent-card-a2a", agentCardStatus, agentCardStatus === "pass" ? "An A2A agent-card.json is available." : agentCardStatus === "na" ? "Not audited (no served web surface)." : "No valid /.well-known/agent-card.json (A2A) was found."), | ||
| check("link-headers", linkHeadersStatus, linkHeadersStatus === "pass" ? "The homepage returns RFC 8288 Link headers." : linkHeadersStatus === "na" ? "Not audited (no served web surface)." : "No Link header was found on the homepage."), | ||
| check("markdown-alt", markdownAltStatus, markdownAltStatus === "pass" ? "The homepage advertises a markdown alternate link." : markdownAltStatus === "na" ? "Not audited (no served web surface)." : 'No <link rel="alternate" type="text/markdown"> was found.') | ||
| ]; | ||
@@ -433,3 +458,9 @@ } | ||
| "crawler-reachable": 5, | ||
| "rate-limit-headers": 5 | ||
| "rate-limit-headers": 5, | ||
| // Ora-parity round 2 web signals | ||
| "auth-md": 5, | ||
| "api-catalog": 5, | ||
| "agent-card-a2a": 5, | ||
| "link-headers": 5, | ||
| "markdown-alt": 5 | ||
| }; | ||
@@ -453,3 +484,8 @@ FIXES = { | ||
| "crawler-reachable": "Let major agent User-Agents (GPTBot, ClaudeBot, ora-agent, ...) reach the homepage. Narrow WAF/bot rules that block them.", | ||
| "rate-limit-headers": "Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle." | ||
| "rate-limit-headers": "Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle.", | ||
| "auth-md": "Publish /auth.md \u2014 a markdown guide describing how an agent authenticates (API key or OAuth) and where to get credentials.", | ||
| "api-catalog": "Publish /.well-known/api-catalog (RFC 9727 linkset) pointing agents at your OpenAPI spec(s) and API docs.", | ||
| "agent-card-a2a": "Publish /.well-known/agent-card.json (A2A agent card) with at least name and url so A2A clients can discover the agent.", | ||
| "link-headers": "Return RFC 8288 Link headers on the homepage pointing at llms.txt, openapi.json, and the agent card so agents discover descriptors without parsing HTML.", | ||
| "markdown-alt": 'Add a <link rel="alternate" type="text/markdown"> to the homepage so agents can find the markdown representation.' | ||
| }; | ||
@@ -456,0 +492,0 @@ } |
+42
-6
@@ -18,3 +18,3 @@ #!/usr/bin/env node | ||
| name: "aigentify", | ||
| version: "0.2.0", | ||
| version: "0.3.0", | ||
| mcpName: "io.github.pooriaarab/aigentify", | ||
@@ -196,2 +196,5 @@ description: "Audit and generate agent-native product surfaces", | ||
| homeAsAgent: { status: 404, contentType: "", text: "" }, | ||
| authMd: { status: 404, contentType: "", text: "" }, | ||
| apiCatalog: { status: 404, contentType: "", text: "" }, | ||
| agentCard: { status: 404, contentType: "", text: "" }, | ||
| honestText, | ||
@@ -231,3 +234,5 @@ hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), | ||
| homeMarkdown, | ||
| homeAsAgent | ||
| homeAsAgent, | ||
| authMd, | ||
| apiCatalog | ||
| ] = await Promise.all([ | ||
@@ -246,4 +251,7 @@ fetchText(fetcher, `${base}/agents.md`), | ||
| fetchText(fetcher, base, { headers: { accept: "text/markdown" } }), | ||
| fetchText(fetcher, base, { headers: { "user-agent": "ora-agent" } }) | ||
| fetchText(fetcher, base, { headers: { "user-agent": "ora-agent" } }), | ||
| fetchText(fetcher, `${base}/auth.md`), | ||
| fetchText(fetcher, `${base}/.well-known/api-catalog`) | ||
| ]); | ||
| const agentCard = wellKnownCard; | ||
| const endpoints = [agents, server, mcp, home, llms, sitemap]; | ||
@@ -264,2 +272,5 @@ const wk = ok(wellKnown.status) ? wellKnown : wellKnownCard; | ||
| homeAsAgent, | ||
| authMd, | ||
| apiCatalog, | ||
| agentCard, | ||
| honestText: [home.text, offerBlock(agents.text)].join("\n"), | ||
@@ -350,2 +361,11 @@ hasMcp: server.status >= 200 && server.status < 400 || mcp.status >= 200 && mcp.status < 400, | ||
| const rateLimitStatus = !urlOnly ? "na" : hasRateLimitHeaders([snapshot.openapi, snapshot.server, snapshot.home]) ? "pass" : "warn"; | ||
| const authMdStatus = !urlOnly ? "na" : ok(snapshot.authMd.status) && snapshot.authMd.text.trim().length > 0 && (/text\/markdown/i.test(snapshot.authMd.contentType) || snapshot.authMd.text.trimStart().startsWith("#")) ? "pass" : "warn"; | ||
| const apiCatalogStatus = !urlOnly ? "na" : ok(snapshot.apiCatalog.status) && Array.isArray(parseJson(snapshot.apiCatalog.text)?.linkset) ? "pass" : "warn"; | ||
| const agentCardStatus = !urlOnly ? "na" : (() => { | ||
| if (!ok(snapshot.agentCard.status)) return "warn"; | ||
| const card = parseJson(snapshot.agentCard.text); | ||
| return card && typeof card.name === "string" && card.name.trim().length > 0 && typeof card.url === "string" && card.url.trim().length > 0 ? "pass" : "warn"; | ||
| })(); | ||
| const linkHeadersStatus = !urlOnly ? "na" : /llms\.txt|openapi\.json|agent-card|\.well-known/i.test(snapshot.home.headers?.link ?? "") ? "pass" : "warn"; | ||
| const markdownAltStatus = !urlOnly ? "na" : [...snapshot.home.text.matchAll(/<link\b[^>]*>/gi)].some(([tag]) => /rel=["']?alternate["']?/i.test(tag) && /type=["']?text\/markdown/i.test(tag)) ? "pass" : "warn"; | ||
| return [ | ||
@@ -368,3 +388,8 @@ check("agents-md", agentsStatus, agentsPresent ? "AGENTS.md is available." : snapshot.agents.status === 0 ? "The AGENTS.md request failed." : "AGENTS.md is missing."), | ||
| check("crawler-reachable", crawlerStatus, crawlerStatus === "pass" ? "The homepage is reachable by an agent User-Agent." : crawlerStatus === "na" ? "Not audited (no served web surface)." : "An agent User-Agent could not reach the homepage."), | ||
| check("rate-limit-headers", rateLimitStatus, rateLimitStatus === "pass" ? "Standard rate-limit headers are present." : rateLimitStatus === "na" ? "Not audited (no served web surface)." : "No RateLimit-* headers were found on probed endpoints.") | ||
| check("rate-limit-headers", rateLimitStatus, rateLimitStatus === "pass" ? "Standard rate-limit headers are present." : rateLimitStatus === "na" ? "Not audited (no served web surface)." : "No RateLimit-* headers were found on probed endpoints."), | ||
| check("auth-md", authMdStatus, authMdStatus === "pass" ? "/auth.md is available." : authMdStatus === "na" ? "Not audited (no served web surface)." : "No /auth.md agent-auth guide was found."), | ||
| check("api-catalog", apiCatalogStatus, apiCatalogStatus === "pass" ? "/.well-known/api-catalog is available." : apiCatalogStatus === "na" ? "Not audited (no served web surface)." : "No /.well-known/api-catalog (RFC 9727) was found."), | ||
| check("agent-card-a2a", agentCardStatus, agentCardStatus === "pass" ? "An A2A agent-card.json is available." : agentCardStatus === "na" ? "Not audited (no served web surface)." : "No valid /.well-known/agent-card.json (A2A) was found."), | ||
| check("link-headers", linkHeadersStatus, linkHeadersStatus === "pass" ? "The homepage returns RFC 8288 Link headers." : linkHeadersStatus === "na" ? "Not audited (no served web surface)." : "No Link header was found on the homepage."), | ||
| check("markdown-alt", markdownAltStatus, markdownAltStatus === "pass" ? "The homepage advertises a markdown alternate link." : markdownAltStatus === "na" ? "Not audited (no served web surface)." : 'No <link rel="alternate" type="text/markdown"> was found.') | ||
| ]; | ||
@@ -412,3 +437,9 @@ } | ||
| "crawler-reachable": 5, | ||
| "rate-limit-headers": 5 | ||
| "rate-limit-headers": 5, | ||
| // Ora-parity round 2 web signals | ||
| "auth-md": 5, | ||
| "api-catalog": 5, | ||
| "agent-card-a2a": 5, | ||
| "link-headers": 5, | ||
| "markdown-alt": 5 | ||
| }; | ||
@@ -432,3 +463,8 @@ FIXES = { | ||
| "crawler-reachable": "Let major agent User-Agents (GPTBot, ClaudeBot, ora-agent, ...) reach the homepage. Narrow WAF/bot rules that block them.", | ||
| "rate-limit-headers": "Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle." | ||
| "rate-limit-headers": "Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle.", | ||
| "auth-md": "Publish /auth.md \u2014 a markdown guide describing how an agent authenticates (API key or OAuth) and where to get credentials.", | ||
| "api-catalog": "Publish /.well-known/api-catalog (RFC 9727 linkset) pointing agents at your OpenAPI spec(s) and API docs.", | ||
| "agent-card-a2a": "Publish /.well-known/agent-card.json (A2A agent card) with at least name and url so A2A clients can discover the agent.", | ||
| "link-headers": "Return RFC 8288 Link headers on the homepage pointing at llms.txt, openapi.json, and the agent card so agents discover descriptors without parsing HTML.", | ||
| "markdown-alt": 'Add a <link rel="alternate" type="text/markdown"> to the homepage so agents can find the markdown representation.' | ||
| }; | ||
@@ -435,0 +471,0 @@ } |
+42
-6
@@ -58,3 +58,3 @@ "use strict"; | ||
| name: "aigentify", | ||
| version: "0.2.0", | ||
| version: "0.3.0", | ||
| mcpName: "io.github.pooriaarab/aigentify", | ||
@@ -151,3 +151,9 @@ description: "Audit and generate agent-native product surfaces", | ||
| "crawler-reachable": 5, | ||
| "rate-limit-headers": 5 | ||
| "rate-limit-headers": 5, | ||
| // Ora-parity round 2 web signals | ||
| "auth-md": 5, | ||
| "api-catalog": 5, | ||
| "agent-card-a2a": 5, | ||
| "link-headers": 5, | ||
| "markdown-alt": 5 | ||
| }; | ||
@@ -171,3 +177,8 @@ var FIXES = { | ||
| "crawler-reachable": "Let major agent User-Agents (GPTBot, ClaudeBot, ora-agent, ...) reach the homepage. Narrow WAF/bot rules that block them.", | ||
| "rate-limit-headers": "Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle." | ||
| "rate-limit-headers": "Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle.", | ||
| "auth-md": "Publish /auth.md \u2014 a markdown guide describing how an agent authenticates (API key or OAuth) and where to get credentials.", | ||
| "api-catalog": "Publish /.well-known/api-catalog (RFC 9727 linkset) pointing agents at your OpenAPI spec(s) and API docs.", | ||
| "agent-card-a2a": "Publish /.well-known/agent-card.json (A2A agent card) with at least name and url so A2A clients can discover the agent.", | ||
| "link-headers": "Return RFC 8288 Link headers on the homepage pointing at llms.txt, openapi.json, and the agent card so agents discover descriptors without parsing HTML.", | ||
| "markdown-alt": 'Add a <link rel="alternate" type="text/markdown"> to the homepage so agents can find the markdown representation.' | ||
| }; | ||
@@ -268,2 +279,5 @@ function check(id, status, note) { | ||
| homeAsAgent: { status: 404, contentType: "", text: "" }, | ||
| authMd: { status: 404, contentType: "", text: "" }, | ||
| apiCatalog: { status: 404, contentType: "", text: "" }, | ||
| agentCard: { status: 404, contentType: "", text: "" }, | ||
| honestText, | ||
@@ -303,3 +317,5 @@ hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), | ||
| homeMarkdown, | ||
| homeAsAgent | ||
| homeAsAgent, | ||
| authMd, | ||
| apiCatalog | ||
| ] = await Promise.all([ | ||
@@ -318,4 +334,7 @@ fetchText(fetcher, `${base}/agents.md`), | ||
| fetchText(fetcher, base, { headers: { accept: "text/markdown" } }), | ||
| fetchText(fetcher, base, { headers: { "user-agent": "ora-agent" } }) | ||
| fetchText(fetcher, base, { headers: { "user-agent": "ora-agent" } }), | ||
| fetchText(fetcher, `${base}/auth.md`), | ||
| fetchText(fetcher, `${base}/.well-known/api-catalog`) | ||
| ]); | ||
| const agentCard = wellKnownCard; | ||
| const endpoints = [agents, server, mcp, home, llms, sitemap]; | ||
@@ -336,2 +355,5 @@ const wk = ok(wellKnown.status) ? wellKnown : wellKnownCard; | ||
| homeAsAgent, | ||
| authMd, | ||
| apiCatalog, | ||
| agentCard, | ||
| honestText: [home.text, offerBlock(agents.text)].join("\n"), | ||
@@ -422,2 +444,11 @@ hasMcp: server.status >= 200 && server.status < 400 || mcp.status >= 200 && mcp.status < 400, | ||
| const rateLimitStatus = !urlOnly ? "na" : hasRateLimitHeaders([snapshot.openapi, snapshot.server, snapshot.home]) ? "pass" : "warn"; | ||
| const authMdStatus = !urlOnly ? "na" : ok(snapshot.authMd.status) && snapshot.authMd.text.trim().length > 0 && (/text\/markdown/i.test(snapshot.authMd.contentType) || snapshot.authMd.text.trimStart().startsWith("#")) ? "pass" : "warn"; | ||
| const apiCatalogStatus = !urlOnly ? "na" : ok(snapshot.apiCatalog.status) && Array.isArray(parseJson(snapshot.apiCatalog.text)?.linkset) ? "pass" : "warn"; | ||
| const agentCardStatus = !urlOnly ? "na" : (() => { | ||
| if (!ok(snapshot.agentCard.status)) return "warn"; | ||
| const card = parseJson(snapshot.agentCard.text); | ||
| return card && typeof card.name === "string" && card.name.trim().length > 0 && typeof card.url === "string" && card.url.trim().length > 0 ? "pass" : "warn"; | ||
| })(); | ||
| const linkHeadersStatus = !urlOnly ? "na" : /llms\.txt|openapi\.json|agent-card|\.well-known/i.test(snapshot.home.headers?.link ?? "") ? "pass" : "warn"; | ||
| const markdownAltStatus = !urlOnly ? "na" : [...snapshot.home.text.matchAll(/<link\b[^>]*>/gi)].some(([tag]) => /rel=["']?alternate["']?/i.test(tag) && /type=["']?text\/markdown/i.test(tag)) ? "pass" : "warn"; | ||
| return [ | ||
@@ -440,3 +471,8 @@ check("agents-md", agentsStatus, agentsPresent ? "AGENTS.md is available." : snapshot.agents.status === 0 ? "The AGENTS.md request failed." : "AGENTS.md is missing."), | ||
| check("crawler-reachable", crawlerStatus, crawlerStatus === "pass" ? "The homepage is reachable by an agent User-Agent." : crawlerStatus === "na" ? "Not audited (no served web surface)." : "An agent User-Agent could not reach the homepage."), | ||
| check("rate-limit-headers", rateLimitStatus, rateLimitStatus === "pass" ? "Standard rate-limit headers are present." : rateLimitStatus === "na" ? "Not audited (no served web surface)." : "No RateLimit-* headers were found on probed endpoints.") | ||
| check("rate-limit-headers", rateLimitStatus, rateLimitStatus === "pass" ? "Standard rate-limit headers are present." : rateLimitStatus === "na" ? "Not audited (no served web surface)." : "No RateLimit-* headers were found on probed endpoints."), | ||
| check("auth-md", authMdStatus, authMdStatus === "pass" ? "/auth.md is available." : authMdStatus === "na" ? "Not audited (no served web surface)." : "No /auth.md agent-auth guide was found."), | ||
| check("api-catalog", apiCatalogStatus, apiCatalogStatus === "pass" ? "/.well-known/api-catalog is available." : apiCatalogStatus === "na" ? "Not audited (no served web surface)." : "No /.well-known/api-catalog (RFC 9727) was found."), | ||
| check("agent-card-a2a", agentCardStatus, agentCardStatus === "pass" ? "An A2A agent-card.json is available." : agentCardStatus === "na" ? "Not audited (no served web surface)." : "No valid /.well-known/agent-card.json (A2A) was found."), | ||
| check("link-headers", linkHeadersStatus, linkHeadersStatus === "pass" ? "The homepage returns RFC 8288 Link headers." : linkHeadersStatus === "na" ? "Not audited (no served web surface)." : "No Link header was found on the homepage."), | ||
| check("markdown-alt", markdownAltStatus, markdownAltStatus === "pass" ? "The homepage advertises a markdown alternate link." : markdownAltStatus === "na" ? "Not audited (no served web surface)." : 'No <link rel="alternate" type="text/markdown"> was found.') | ||
| ]; | ||
@@ -443,0 +479,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; headers?: Record<string, string> }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n wellKnown: Endpoint; openapi: Endpoint; agentsPage: Endpoint;\n // is-agentic-parity signals (URL targets only)\n notFound: Endpoint; homeMarkdown: Endpoint; homeAsAgent: 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 // is-agentic-parity web signals — na for CLI/dir targets, low weight\n 'soft-404': 5, 'markdown-negotiation': 5, 'content-without-js': 5,\n 'org-schema': 5, 'crawler-reachable': 5, 'rate-limit-headers': 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 'soft-404': 'Return a real HTTP 404 (or 410) for unknown paths — never a 200 with your app shell, which tells agents every path exists.',\n 'markdown-negotiation': 'Serve text/markdown on `Accept: text/markdown` and add `Accept` to the Vary header (Vary: Accept, Accept-Encoding) so CDNs key the variants apart.',\n 'content-without-js': 'Server-side render the homepage so crawlers without JS see an <h1> and 500+ characters of real text.',\n 'org-schema': 'Add Organization JSON-LD with both contactPoint (email/phone + contactType) and address (PostalAddress).',\n 'crawler-reachable': 'Let major agent User-Agents (GPTBot, ClaudeBot, ora-agent, ...) reach the homepage. Narrow WAF/bot rules that block them.',\n 'rate-limit-headers': 'Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle.',\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 notFound: { status: 404, contentType: '', text: '' }, homeMarkdown: { status: 404, contentType: '', text: '' }, homeAsAgent: { 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, init?: RequestInit): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000), ...init });\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => { headers[key.toLowerCase()] = value; });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text(), headers };\n } catch { return { status: 0, contentType: '', text: '', headers: {} }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n // A path no real site serves — used to detect soft-404s (200 + app shell).\n const missingPath = `${base}/aigentify-probe-${'x'.repeat(8)}-404`;\n const [agents, server, mcp, home, llms, sitemap, wellKnown, wellKnownCard, openapi, agentsPage,\n notFound, homeMarkdown, homeAsAgent] = 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 fetchText(fetcher, missingPath),\n fetchText(fetcher, base, { headers: { accept: 'text/markdown' } }),\n fetchText(fetcher, base, { headers: { 'user-agent': 'ora-agent' } }),\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,\n notFound, homeMarkdown, homeAsAgent,\n 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 looksMarkdown(endpoint: Endpoint): boolean {\n const varyAccept = /(^|,)\\s*accept\\s*($|,)/i.test(endpoint.headers?.vary ?? '');\n return ok(endpoint.status) && /text\\/markdown/i.test(endpoint.contentType) && varyAccept;\n}\n\nfunction hasBodyContent(html: string): boolean {\n const stripped = html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n .replace(/<!--[\\s\\S]*?-->/g, '');\n const hasH1 = /<h1[\\s>]/i.test(stripped);\n const textOnly = stripped.replace(/<[^>]+>/g, ' ').replace(/\\s+/g, ' ').trim();\n return hasH1 && textOnly.length >= 500;\n}\n\nfunction collectJsonLdNodes(value: unknown): Record<string, unknown>[] {\n if (Array.isArray(value)) return value.flatMap(collectJsonLdNodes);\n if (value && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n const graph = record['@graph'];\n return Array.isArray(graph) ? graph.flatMap(collectJsonLdNodes) : [record];\n }\n return [];\n}\n\nfunction isMeaningfulValue(value: unknown): boolean {\n if (value === null || value === undefined) return false;\n if (typeof value === 'string') return value.trim().length > 0;\n if (typeof value === 'object') return Object.keys(value as Record<string, unknown>).length > 0;\n return true;\n}\n\nfunction isOrganizationNode(node: Record<string, unknown>): boolean {\n const type = node['@type'];\n return type === 'Organization' || (Array.isArray(type) && type.includes('Organization'));\n}\n\nfunction orgSchemaStatus(html: string): 'pass' | 'warn' {\n const blocks = [...html.matchAll(/<script[^>]*application\\/ld\\+json[^>]*>([\\s\\S]*?)<\\/script>/gi)].map(m => m[1]);\n const nodes = blocks.flatMap(block => {\n try { return collectJsonLdNodes(JSON.parse(block)); } catch { return []; }\n });\n const orgNodes = nodes.filter(isOrganizationNode);\n if (!orgNodes.length) return 'warn';\n return orgNodes.some(node => isMeaningfulValue(node.contactPoint) && isMeaningfulValue(node.address)) ? 'pass' : 'warn';\n}\n\nfunction looksLikeHomepage(agentResponse: Endpoint, home: Endpoint): boolean {\n if (!ok(agentResponse.status)) return false;\n if (/captcha|access denied|are you a (?:human|robot)|checking your browser|request blocked/i.test(agentResponse.text)) return false;\n if (!ok(home.status) || !home.text.trim()) return agentResponse.text.trim().length > 0;\n return agentResponse.text.length >= home.text.length * 0.5;\n}\n\nfunction hasRateLimitHeaders(endpoints: Endpoint[]): boolean {\n return endpoints.some(endpoint => {\n if (!ok(endpoint.status)) return false;\n const keys = Object.keys(endpoint.headers ?? {});\n const has = (name: string) => keys.some(key => new RegExp(`^(x-)?ratelimit-${name}$`, 'i').test(key));\n return has('limit') && has('remaining') && has('reset');\n });\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 // is-agentic-parity signals: URL-only. na for directories or total network failure.\n const urlOnly = snapshot.isUrl && !snapshot.networkFailure;\n const soft404Status: AuditStatus = !urlOnly ? 'na'\n : snapshot.notFound.status === 404 || snapshot.notFound.status === 410 ? 'pass'\n : ok(snapshot.notFound.status) ? 'fail'\n : 'warn';\n const markdownStatus: AuditStatus = !urlOnly ? 'na' : looksMarkdown(snapshot.homeMarkdown) ? 'pass' : 'warn';\n const contentStatus: AuditStatus = !urlOnly ? 'na' : !ok(snapshot.home.status) ? 'warn' : hasBodyContent(snapshot.home.text) ? 'pass' : 'warn';\n const orgStatus: AuditStatus = !urlOnly ? 'na' : !ok(snapshot.home.status) ? 'warn' : orgSchemaStatus(snapshot.home.text);\n const crawlerStatus: AuditStatus = !urlOnly ? 'na' : looksLikeHomepage(snapshot.homeAsAgent, snapshot.home) ? 'pass' : 'warn';\n const rateLimitStatus: AuditStatus = !urlOnly ? 'na' : hasRateLimitHeaders([snapshot.openapi, snapshot.server, snapshot.home]) ? 'pass' : 'warn';\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 check('soft-404', soft404Status, soft404Status === 'pass' ? 'Unknown paths return a real 404.' : soft404Status === 'na' ? 'Not audited (no served web surface).' : soft404Status === 'warn' ? 'The 404 probe was inconclusive (no response, or a non-404/410 error status).' : 'Unknown paths return 200 with the app shell (soft-404).'),\n check('markdown-negotiation', markdownStatus, markdownStatus === 'pass' ? 'The homepage serves text/markdown with Vary: Accept.' : markdownStatus === 'na' ? 'Not audited (no served web surface).' : 'The homepage does not serve markdown on Accept: text/markdown with a Vary: Accept header.'),\n check('content-without-js', contentStatus, contentStatus === 'pass' ? 'The homepage renders an H1 and substantial text without JS.' : contentStatus === 'na' ? 'Not audited (no served web surface).' : 'The homepage lacks an H1 or enough server-rendered text.'),\n check('org-schema', orgStatus, orgStatus === 'pass' ? 'Organization JSON-LD includes contactPoint and address.' : orgStatus === 'na' ? 'Not audited (no served web surface).' : 'Organization JSON-LD is missing or lacks contactPoint/address.'),\n check('crawler-reachable', crawlerStatus, crawlerStatus === 'pass' ? 'The homepage is reachable by an agent User-Agent.' : crawlerStatus === 'na' ? 'Not audited (no served web surface).' : 'An agent User-Agent could not reach the homepage.'),\n check('rate-limit-headers', rateLimitStatus, rateLimitStatus === 'pass' ? 'Standard rate-limit headers are present.' : rateLimitStatus === 'na' ? 'Not audited (no served web surface).' : 'No RateLimit-* headers were found on probed endpoints.'),\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.2.0\",\n \"mcpName\": \"io.github.pooriaarab/aigentify\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\n \"aigentify\": \"dist/cli.js\",\n \"aigentify-mcp\": \"dist/mcp.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"\n },\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\n \"agents\",\n \"agentification\",\n \"mcp\",\n \"ai\",\n \"json-ld\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\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\": {\n \"node\": \">=20\"\n },\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; headers?: Record<string, string> }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n wellKnown: Endpoint; openapi: Endpoint; agentsPage: Endpoint;\n // is-agentic-parity signals (URL targets only)\n notFound: Endpoint; homeMarkdown: Endpoint; homeAsAgent: Endpoint;\n // Ora-parity round 2 (URL targets only)\n authMd: Endpoint; apiCatalog: Endpoint; agentCard: 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 // is-agentic-parity web signals — na for CLI/dir targets, low weight\n 'soft-404': 5, 'markdown-negotiation': 5, 'content-without-js': 5,\n 'org-schema': 5, 'crawler-reachable': 5, 'rate-limit-headers': 5,\n // Ora-parity round 2 web signals\n 'auth-md': 5, 'api-catalog': 5, 'agent-card-a2a': 5, 'link-headers': 5, 'markdown-alt': 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 'soft-404': 'Return a real HTTP 404 (or 410) for unknown paths — never a 200 with your app shell, which tells agents every path exists.',\n 'markdown-negotiation': 'Serve text/markdown on `Accept: text/markdown` and add `Accept` to the Vary header (Vary: Accept, Accept-Encoding) so CDNs key the variants apart.',\n 'content-without-js': 'Server-side render the homepage so crawlers without JS see an <h1> and 500+ characters of real text.',\n 'org-schema': 'Add Organization JSON-LD with both contactPoint (email/phone + contactType) and address (PostalAddress).',\n 'crawler-reachable': 'Let major agent User-Agents (GPTBot, ClaudeBot, ora-agent, ...) reach the homepage. Narrow WAF/bot rules that block them.',\n 'rate-limit-headers': 'Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle.',\n 'auth-md': 'Publish /auth.md — a markdown guide describing how an agent authenticates (API key or OAuth) and where to get credentials.',\n 'api-catalog': 'Publish /.well-known/api-catalog (RFC 9727 linkset) pointing agents at your OpenAPI spec(s) and API docs.',\n 'agent-card-a2a': 'Publish /.well-known/agent-card.json (A2A agent card) with at least name and url so A2A clients can discover the agent.',\n 'link-headers': 'Return RFC 8288 Link headers on the homepage pointing at llms.txt, openapi.json, and the agent card so agents discover descriptors without parsing HTML.',\n 'markdown-alt': 'Add a <link rel=\"alternate\" type=\"text/markdown\"> to the homepage so agents can find the markdown representation.',\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 notFound: { status: 404, contentType: '', text: '' }, homeMarkdown: { status: 404, contentType: '', text: '' }, homeAsAgent: { status: 404, contentType: '', text: '' },\n authMd: { status: 404, contentType: '', text: '' }, apiCatalog: { status: 404, contentType: '', text: '' }, agentCard: { 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, init?: RequestInit): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000), ...init });\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => { headers[key.toLowerCase()] = value; });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text(), headers };\n } catch { return { status: 0, contentType: '', text: '', headers: {} }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n // A path no real site serves — used to detect soft-404s (200 + app shell).\n const missingPath = `${base}/aigentify-probe-${'x'.repeat(8)}-404`;\n const [agents, server, mcp, home, llms, sitemap, wellKnown, wellKnownCard, openapi, agentsPage,\n notFound, homeMarkdown, homeAsAgent, authMd, apiCatalog] = 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 fetchText(fetcher, missingPath),\n fetchText(fetcher, base, { headers: { accept: 'text/markdown' } }),\n fetchText(fetcher, base, { headers: { 'user-agent': 'ora-agent' } }),\n fetchText(fetcher, `${base}/auth.md`),\n fetchText(fetcher, `${base}/.well-known/api-catalog`),\n ]);\n // agent-card.json is the same URL as the well-known probe above — reuse the response instead of fetching twice.\n const agentCard = wellKnownCard;\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,\n notFound, homeMarkdown, homeAsAgent, authMd, apiCatalog, agentCard,\n 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 looksMarkdown(endpoint: Endpoint): boolean {\n const varyAccept = /(^|,)\\s*accept\\s*($|,)/i.test(endpoint.headers?.vary ?? '');\n return ok(endpoint.status) && /text\\/markdown/i.test(endpoint.contentType) && varyAccept;\n}\n\nfunction hasBodyContent(html: string): boolean {\n const stripped = html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n .replace(/<!--[\\s\\S]*?-->/g, '');\n const hasH1 = /<h1[\\s>]/i.test(stripped);\n const textOnly = stripped.replace(/<[^>]+>/g, ' ').replace(/\\s+/g, ' ').trim();\n return hasH1 && textOnly.length >= 500;\n}\n\nfunction collectJsonLdNodes(value: unknown): Record<string, unknown>[] {\n if (Array.isArray(value)) return value.flatMap(collectJsonLdNodes);\n if (value && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n const graph = record['@graph'];\n return Array.isArray(graph) ? graph.flatMap(collectJsonLdNodes) : [record];\n }\n return [];\n}\n\nfunction isMeaningfulValue(value: unknown): boolean {\n if (value === null || value === undefined) return false;\n if (typeof value === 'string') return value.trim().length > 0;\n if (typeof value === 'object') return Object.keys(value as Record<string, unknown>).length > 0;\n return true;\n}\n\nfunction isOrganizationNode(node: Record<string, unknown>): boolean {\n const type = node['@type'];\n return type === 'Organization' || (Array.isArray(type) && type.includes('Organization'));\n}\n\nfunction orgSchemaStatus(html: string): 'pass' | 'warn' {\n const blocks = [...html.matchAll(/<script[^>]*application\\/ld\\+json[^>]*>([\\s\\S]*?)<\\/script>/gi)].map(m => m[1]);\n const nodes = blocks.flatMap(block => {\n try { return collectJsonLdNodes(JSON.parse(block)); } catch { return []; }\n });\n const orgNodes = nodes.filter(isOrganizationNode);\n if (!orgNodes.length) return 'warn';\n return orgNodes.some(node => isMeaningfulValue(node.contactPoint) && isMeaningfulValue(node.address)) ? 'pass' : 'warn';\n}\n\nfunction looksLikeHomepage(agentResponse: Endpoint, home: Endpoint): boolean {\n if (!ok(agentResponse.status)) return false;\n if (/captcha|access denied|are you a (?:human|robot)|checking your browser|request blocked/i.test(agentResponse.text)) return false;\n if (!ok(home.status) || !home.text.trim()) return agentResponse.text.trim().length > 0;\n return agentResponse.text.length >= home.text.length * 0.5;\n}\n\nfunction hasRateLimitHeaders(endpoints: Endpoint[]): boolean {\n return endpoints.some(endpoint => {\n if (!ok(endpoint.status)) return false;\n const keys = Object.keys(endpoint.headers ?? {});\n const has = (name: string) => keys.some(key => new RegExp(`^(x-)?ratelimit-${name}$`, 'i').test(key));\n return has('limit') && has('remaining') && has('reset');\n });\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 // is-agentic-parity signals: URL-only. na for directories or total network failure.\n const urlOnly = snapshot.isUrl && !snapshot.networkFailure;\n const soft404Status: AuditStatus = !urlOnly ? 'na'\n : snapshot.notFound.status === 404 || snapshot.notFound.status === 410 ? 'pass'\n : ok(snapshot.notFound.status) ? 'fail'\n : 'warn';\n const markdownStatus: AuditStatus = !urlOnly ? 'na' : looksMarkdown(snapshot.homeMarkdown) ? 'pass' : 'warn';\n const contentStatus: AuditStatus = !urlOnly ? 'na' : !ok(snapshot.home.status) ? 'warn' : hasBodyContent(snapshot.home.text) ? 'pass' : 'warn';\n const orgStatus: AuditStatus = !urlOnly ? 'na' : !ok(snapshot.home.status) ? 'warn' : orgSchemaStatus(snapshot.home.text);\n const crawlerStatus: AuditStatus = !urlOnly ? 'na' : looksLikeHomepage(snapshot.homeAsAgent, snapshot.home) ? 'pass' : 'warn';\n const rateLimitStatus: AuditStatus = !urlOnly ? 'na' : hasRateLimitHeaders([snapshot.openapi, snapshot.server, snapshot.home]) ? 'pass' : 'warn';\n const authMdStatus: AuditStatus = !urlOnly ? 'na'\n : ok(snapshot.authMd.status) && snapshot.authMd.text.trim().length > 0\n && (/text\\/markdown/i.test(snapshot.authMd.contentType) || snapshot.authMd.text.trimStart().startsWith('#')) ? 'pass' : 'warn';\n const apiCatalogStatus: AuditStatus = !urlOnly ? 'na'\n : ok(snapshot.apiCatalog.status) && Array.isArray(parseJson(snapshot.apiCatalog.text)?.linkset) ? 'pass' : 'warn';\n const agentCardStatus: AuditStatus = !urlOnly ? 'na' : (() => {\n if (!ok(snapshot.agentCard.status)) return 'warn';\n const card = parseJson(snapshot.agentCard.text);\n return card && typeof card.name === 'string' && card.name.trim().length > 0\n && typeof card.url === 'string' && card.url.trim().length > 0 ? 'pass' : 'warn';\n })();\n const linkHeadersStatus: AuditStatus = !urlOnly ? 'na'\n : /llms\\.txt|openapi\\.json|agent-card|\\.well-known/i.test(snapshot.home.headers?.link ?? '') ? 'pass' : 'warn';\n const markdownAltStatus: AuditStatus = !urlOnly ? 'na'\n : [...snapshot.home.text.matchAll(/<link\\b[^>]*>/gi)].some(([tag]) =>\n /rel=[\"']?alternate[\"']?/i.test(tag) && /type=[\"']?text\\/markdown/i.test(tag)) ? 'pass' : 'warn';\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 check('soft-404', soft404Status, soft404Status === 'pass' ? 'Unknown paths return a real 404.' : soft404Status === 'na' ? 'Not audited (no served web surface).' : soft404Status === 'warn' ? 'The 404 probe was inconclusive (no response, or a non-404/410 error status).' : 'Unknown paths return 200 with the app shell (soft-404).'),\n check('markdown-negotiation', markdownStatus, markdownStatus === 'pass' ? 'The homepage serves text/markdown with Vary: Accept.' : markdownStatus === 'na' ? 'Not audited (no served web surface).' : 'The homepage does not serve markdown on Accept: text/markdown with a Vary: Accept header.'),\n check('content-without-js', contentStatus, contentStatus === 'pass' ? 'The homepage renders an H1 and substantial text without JS.' : contentStatus === 'na' ? 'Not audited (no served web surface).' : 'The homepage lacks an H1 or enough server-rendered text.'),\n check('org-schema', orgStatus, orgStatus === 'pass' ? 'Organization JSON-LD includes contactPoint and address.' : orgStatus === 'na' ? 'Not audited (no served web surface).' : 'Organization JSON-LD is missing or lacks contactPoint/address.'),\n check('crawler-reachable', crawlerStatus, crawlerStatus === 'pass' ? 'The homepage is reachable by an agent User-Agent.' : crawlerStatus === 'na' ? 'Not audited (no served web surface).' : 'An agent User-Agent could not reach the homepage.'),\n check('rate-limit-headers', rateLimitStatus, rateLimitStatus === 'pass' ? 'Standard rate-limit headers are present.' : rateLimitStatus === 'na' ? 'Not audited (no served web surface).' : 'No RateLimit-* headers were found on probed endpoints.'),\n check('auth-md', authMdStatus, authMdStatus === 'pass' ? '/auth.md is available.' : authMdStatus === 'na' ? 'Not audited (no served web surface).' : 'No /auth.md agent-auth guide was found.'),\n check('api-catalog', apiCatalogStatus, apiCatalogStatus === 'pass' ? '/.well-known/api-catalog is available.' : apiCatalogStatus === 'na' ? 'Not audited (no served web surface).' : 'No /.well-known/api-catalog (RFC 9727) was found.'),\n check('agent-card-a2a', agentCardStatus, agentCardStatus === 'pass' ? 'An A2A agent-card.json is available.' : agentCardStatus === 'na' ? 'Not audited (no served web surface).' : 'No valid /.well-known/agent-card.json (A2A) was found.'),\n check('link-headers', linkHeadersStatus, linkHeadersStatus === 'pass' ? 'The homepage returns RFC 8288 Link headers.' : linkHeadersStatus === 'na' ? 'Not audited (no served web surface).' : 'No Link header was found on the homepage.'),\n check('markdown-alt', markdownAltStatus, markdownAltStatus === 'pass' ? 'The homepage advertises a markdown alternate link.' : markdownAltStatus === 'na' ? 'Not audited (no served web surface).' : 'No <link rel=\"alternate\" type=\"text/markdown\"> 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.3.0\",\n \"mcpName\": \"io.github.pooriaarab/aigentify\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\n \"aigentify\": \"dist/cli.js\",\n \"aigentify-mcp\": \"dist/mcp.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"\n },\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\n \"agents\",\n \"agentification\",\n \"mcp\",\n \"ai\",\n \"json-ld\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\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\": {\n \"node\": \">=20\"\n },\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"]} |
+42
-6
@@ -8,3 +8,3 @@ // src/audit.ts | ||
| name: "aigentify", | ||
| version: "0.2.0", | ||
| version: "0.3.0", | ||
| mcpName: "io.github.pooriaarab/aigentify", | ||
@@ -101,3 +101,9 @@ description: "Audit and generate agent-native product surfaces", | ||
| "crawler-reachable": 5, | ||
| "rate-limit-headers": 5 | ||
| "rate-limit-headers": 5, | ||
| // Ora-parity round 2 web signals | ||
| "auth-md": 5, | ||
| "api-catalog": 5, | ||
| "agent-card-a2a": 5, | ||
| "link-headers": 5, | ||
| "markdown-alt": 5 | ||
| }; | ||
@@ -121,3 +127,8 @@ var FIXES = { | ||
| "crawler-reachable": "Let major agent User-Agents (GPTBot, ClaudeBot, ora-agent, ...) reach the homepage. Narrow WAF/bot rules that block them.", | ||
| "rate-limit-headers": "Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle." | ||
| "rate-limit-headers": "Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle.", | ||
| "auth-md": "Publish /auth.md \u2014 a markdown guide describing how an agent authenticates (API key or OAuth) and where to get credentials.", | ||
| "api-catalog": "Publish /.well-known/api-catalog (RFC 9727 linkset) pointing agents at your OpenAPI spec(s) and API docs.", | ||
| "agent-card-a2a": "Publish /.well-known/agent-card.json (A2A agent card) with at least name and url so A2A clients can discover the agent.", | ||
| "link-headers": "Return RFC 8288 Link headers on the homepage pointing at llms.txt, openapi.json, and the agent card so agents discover descriptors without parsing HTML.", | ||
| "markdown-alt": 'Add a <link rel="alternate" type="text/markdown"> to the homepage so agents can find the markdown representation.' | ||
| }; | ||
@@ -218,2 +229,5 @@ function check(id, status, note) { | ||
| homeAsAgent: { status: 404, contentType: "", text: "" }, | ||
| authMd: { status: 404, contentType: "", text: "" }, | ||
| apiCatalog: { status: 404, contentType: "", text: "" }, | ||
| agentCard: { status: 404, contentType: "", text: "" }, | ||
| honestText, | ||
@@ -253,3 +267,5 @@ hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), | ||
| homeMarkdown, | ||
| homeAsAgent | ||
| homeAsAgent, | ||
| authMd, | ||
| apiCatalog | ||
| ] = await Promise.all([ | ||
@@ -268,4 +284,7 @@ fetchText(fetcher, `${base}/agents.md`), | ||
| fetchText(fetcher, base, { headers: { accept: "text/markdown" } }), | ||
| fetchText(fetcher, base, { headers: { "user-agent": "ora-agent" } }) | ||
| fetchText(fetcher, base, { headers: { "user-agent": "ora-agent" } }), | ||
| fetchText(fetcher, `${base}/auth.md`), | ||
| fetchText(fetcher, `${base}/.well-known/api-catalog`) | ||
| ]); | ||
| const agentCard = wellKnownCard; | ||
| const endpoints = [agents, server, mcp, home, llms, sitemap]; | ||
@@ -286,2 +305,5 @@ const wk = ok(wellKnown.status) ? wellKnown : wellKnownCard; | ||
| homeAsAgent, | ||
| authMd, | ||
| apiCatalog, | ||
| agentCard, | ||
| honestText: [home.text, offerBlock(agents.text)].join("\n"), | ||
@@ -372,2 +394,11 @@ hasMcp: server.status >= 200 && server.status < 400 || mcp.status >= 200 && mcp.status < 400, | ||
| const rateLimitStatus = !urlOnly ? "na" : hasRateLimitHeaders([snapshot.openapi, snapshot.server, snapshot.home]) ? "pass" : "warn"; | ||
| const authMdStatus = !urlOnly ? "na" : ok(snapshot.authMd.status) && snapshot.authMd.text.trim().length > 0 && (/text\/markdown/i.test(snapshot.authMd.contentType) || snapshot.authMd.text.trimStart().startsWith("#")) ? "pass" : "warn"; | ||
| const apiCatalogStatus = !urlOnly ? "na" : ok(snapshot.apiCatalog.status) && Array.isArray(parseJson(snapshot.apiCatalog.text)?.linkset) ? "pass" : "warn"; | ||
| const agentCardStatus = !urlOnly ? "na" : (() => { | ||
| if (!ok(snapshot.agentCard.status)) return "warn"; | ||
| const card = parseJson(snapshot.agentCard.text); | ||
| return card && typeof card.name === "string" && card.name.trim().length > 0 && typeof card.url === "string" && card.url.trim().length > 0 ? "pass" : "warn"; | ||
| })(); | ||
| const linkHeadersStatus = !urlOnly ? "na" : /llms\.txt|openapi\.json|agent-card|\.well-known/i.test(snapshot.home.headers?.link ?? "") ? "pass" : "warn"; | ||
| const markdownAltStatus = !urlOnly ? "na" : [...snapshot.home.text.matchAll(/<link\b[^>]*>/gi)].some(([tag]) => /rel=["']?alternate["']?/i.test(tag) && /type=["']?text\/markdown/i.test(tag)) ? "pass" : "warn"; | ||
| return [ | ||
@@ -390,3 +421,8 @@ check("agents-md", agentsStatus, agentsPresent ? "AGENTS.md is available." : snapshot.agents.status === 0 ? "The AGENTS.md request failed." : "AGENTS.md is missing."), | ||
| check("crawler-reachable", crawlerStatus, crawlerStatus === "pass" ? "The homepage is reachable by an agent User-Agent." : crawlerStatus === "na" ? "Not audited (no served web surface)." : "An agent User-Agent could not reach the homepage."), | ||
| check("rate-limit-headers", rateLimitStatus, rateLimitStatus === "pass" ? "Standard rate-limit headers are present." : rateLimitStatus === "na" ? "Not audited (no served web surface)." : "No RateLimit-* headers were found on probed endpoints.") | ||
| check("rate-limit-headers", rateLimitStatus, rateLimitStatus === "pass" ? "Standard rate-limit headers are present." : rateLimitStatus === "na" ? "Not audited (no served web surface)." : "No RateLimit-* headers were found on probed endpoints."), | ||
| check("auth-md", authMdStatus, authMdStatus === "pass" ? "/auth.md is available." : authMdStatus === "na" ? "Not audited (no served web surface)." : "No /auth.md agent-auth guide was found."), | ||
| check("api-catalog", apiCatalogStatus, apiCatalogStatus === "pass" ? "/.well-known/api-catalog is available." : apiCatalogStatus === "na" ? "Not audited (no served web surface)." : "No /.well-known/api-catalog (RFC 9727) was found."), | ||
| check("agent-card-a2a", agentCardStatus, agentCardStatus === "pass" ? "An A2A agent-card.json is available." : agentCardStatus === "na" ? "Not audited (no served web surface)." : "No valid /.well-known/agent-card.json (A2A) was found."), | ||
| check("link-headers", linkHeadersStatus, linkHeadersStatus === "pass" ? "The homepage returns RFC 8288 Link headers." : linkHeadersStatus === "na" ? "Not audited (no served web surface)." : "No Link header was found on the homepage."), | ||
| check("markdown-alt", markdownAltStatus, markdownAltStatus === "pass" ? "The homepage advertises a markdown alternate link." : markdownAltStatus === "na" ? "Not audited (no served web surface)." : 'No <link rel="alternate" type="text/markdown"> was found.') | ||
| ]; | ||
@@ -393,0 +429,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; headers?: Record<string, string> }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n wellKnown: Endpoint; openapi: Endpoint; agentsPage: Endpoint;\n // is-agentic-parity signals (URL targets only)\n notFound: Endpoint; homeMarkdown: Endpoint; homeAsAgent: 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 // is-agentic-parity web signals — na for CLI/dir targets, low weight\n 'soft-404': 5, 'markdown-negotiation': 5, 'content-without-js': 5,\n 'org-schema': 5, 'crawler-reachable': 5, 'rate-limit-headers': 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 'soft-404': 'Return a real HTTP 404 (or 410) for unknown paths — never a 200 with your app shell, which tells agents every path exists.',\n 'markdown-negotiation': 'Serve text/markdown on `Accept: text/markdown` and add `Accept` to the Vary header (Vary: Accept, Accept-Encoding) so CDNs key the variants apart.',\n 'content-without-js': 'Server-side render the homepage so crawlers without JS see an <h1> and 500+ characters of real text.',\n 'org-schema': 'Add Organization JSON-LD with both contactPoint (email/phone + contactType) and address (PostalAddress).',\n 'crawler-reachable': 'Let major agent User-Agents (GPTBot, ClaudeBot, ora-agent, ...) reach the homepage. Narrow WAF/bot rules that block them.',\n 'rate-limit-headers': 'Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle.',\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 notFound: { status: 404, contentType: '', text: '' }, homeMarkdown: { status: 404, contentType: '', text: '' }, homeAsAgent: { 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, init?: RequestInit): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000), ...init });\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => { headers[key.toLowerCase()] = value; });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text(), headers };\n } catch { return { status: 0, contentType: '', text: '', headers: {} }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n // A path no real site serves — used to detect soft-404s (200 + app shell).\n const missingPath = `${base}/aigentify-probe-${'x'.repeat(8)}-404`;\n const [agents, server, mcp, home, llms, sitemap, wellKnown, wellKnownCard, openapi, agentsPage,\n notFound, homeMarkdown, homeAsAgent] = 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 fetchText(fetcher, missingPath),\n fetchText(fetcher, base, { headers: { accept: 'text/markdown' } }),\n fetchText(fetcher, base, { headers: { 'user-agent': 'ora-agent' } }),\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,\n notFound, homeMarkdown, homeAsAgent,\n 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 looksMarkdown(endpoint: Endpoint): boolean {\n const varyAccept = /(^|,)\\s*accept\\s*($|,)/i.test(endpoint.headers?.vary ?? '');\n return ok(endpoint.status) && /text\\/markdown/i.test(endpoint.contentType) && varyAccept;\n}\n\nfunction hasBodyContent(html: string): boolean {\n const stripped = html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n .replace(/<!--[\\s\\S]*?-->/g, '');\n const hasH1 = /<h1[\\s>]/i.test(stripped);\n const textOnly = stripped.replace(/<[^>]+>/g, ' ').replace(/\\s+/g, ' ').trim();\n return hasH1 && textOnly.length >= 500;\n}\n\nfunction collectJsonLdNodes(value: unknown): Record<string, unknown>[] {\n if (Array.isArray(value)) return value.flatMap(collectJsonLdNodes);\n if (value && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n const graph = record['@graph'];\n return Array.isArray(graph) ? graph.flatMap(collectJsonLdNodes) : [record];\n }\n return [];\n}\n\nfunction isMeaningfulValue(value: unknown): boolean {\n if (value === null || value === undefined) return false;\n if (typeof value === 'string') return value.trim().length > 0;\n if (typeof value === 'object') return Object.keys(value as Record<string, unknown>).length > 0;\n return true;\n}\n\nfunction isOrganizationNode(node: Record<string, unknown>): boolean {\n const type = node['@type'];\n return type === 'Organization' || (Array.isArray(type) && type.includes('Organization'));\n}\n\nfunction orgSchemaStatus(html: string): 'pass' | 'warn' {\n const blocks = [...html.matchAll(/<script[^>]*application\\/ld\\+json[^>]*>([\\s\\S]*?)<\\/script>/gi)].map(m => m[1]);\n const nodes = blocks.flatMap(block => {\n try { return collectJsonLdNodes(JSON.parse(block)); } catch { return []; }\n });\n const orgNodes = nodes.filter(isOrganizationNode);\n if (!orgNodes.length) return 'warn';\n return orgNodes.some(node => isMeaningfulValue(node.contactPoint) && isMeaningfulValue(node.address)) ? 'pass' : 'warn';\n}\n\nfunction looksLikeHomepage(agentResponse: Endpoint, home: Endpoint): boolean {\n if (!ok(agentResponse.status)) return false;\n if (/captcha|access denied|are you a (?:human|robot)|checking your browser|request blocked/i.test(agentResponse.text)) return false;\n if (!ok(home.status) || !home.text.trim()) return agentResponse.text.trim().length > 0;\n return agentResponse.text.length >= home.text.length * 0.5;\n}\n\nfunction hasRateLimitHeaders(endpoints: Endpoint[]): boolean {\n return endpoints.some(endpoint => {\n if (!ok(endpoint.status)) return false;\n const keys = Object.keys(endpoint.headers ?? {});\n const has = (name: string) => keys.some(key => new RegExp(`^(x-)?ratelimit-${name}$`, 'i').test(key));\n return has('limit') && has('remaining') && has('reset');\n });\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 // is-agentic-parity signals: URL-only. na for directories or total network failure.\n const urlOnly = snapshot.isUrl && !snapshot.networkFailure;\n const soft404Status: AuditStatus = !urlOnly ? 'na'\n : snapshot.notFound.status === 404 || snapshot.notFound.status === 410 ? 'pass'\n : ok(snapshot.notFound.status) ? 'fail'\n : 'warn';\n const markdownStatus: AuditStatus = !urlOnly ? 'na' : looksMarkdown(snapshot.homeMarkdown) ? 'pass' : 'warn';\n const contentStatus: AuditStatus = !urlOnly ? 'na' : !ok(snapshot.home.status) ? 'warn' : hasBodyContent(snapshot.home.text) ? 'pass' : 'warn';\n const orgStatus: AuditStatus = !urlOnly ? 'na' : !ok(snapshot.home.status) ? 'warn' : orgSchemaStatus(snapshot.home.text);\n const crawlerStatus: AuditStatus = !urlOnly ? 'na' : looksLikeHomepage(snapshot.homeAsAgent, snapshot.home) ? 'pass' : 'warn';\n const rateLimitStatus: AuditStatus = !urlOnly ? 'na' : hasRateLimitHeaders([snapshot.openapi, snapshot.server, snapshot.home]) ? 'pass' : 'warn';\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 check('soft-404', soft404Status, soft404Status === 'pass' ? 'Unknown paths return a real 404.' : soft404Status === 'na' ? 'Not audited (no served web surface).' : soft404Status === 'warn' ? 'The 404 probe was inconclusive (no response, or a non-404/410 error status).' : 'Unknown paths return 200 with the app shell (soft-404).'),\n check('markdown-negotiation', markdownStatus, markdownStatus === 'pass' ? 'The homepage serves text/markdown with Vary: Accept.' : markdownStatus === 'na' ? 'Not audited (no served web surface).' : 'The homepage does not serve markdown on Accept: text/markdown with a Vary: Accept header.'),\n check('content-without-js', contentStatus, contentStatus === 'pass' ? 'The homepage renders an H1 and substantial text without JS.' : contentStatus === 'na' ? 'Not audited (no served web surface).' : 'The homepage lacks an H1 or enough server-rendered text.'),\n check('org-schema', orgStatus, orgStatus === 'pass' ? 'Organization JSON-LD includes contactPoint and address.' : orgStatus === 'na' ? 'Not audited (no served web surface).' : 'Organization JSON-LD is missing or lacks contactPoint/address.'),\n check('crawler-reachable', crawlerStatus, crawlerStatus === 'pass' ? 'The homepage is reachable by an agent User-Agent.' : crawlerStatus === 'na' ? 'Not audited (no served web surface).' : 'An agent User-Agent could not reach the homepage.'),\n check('rate-limit-headers', rateLimitStatus, rateLimitStatus === 'pass' ? 'Standard rate-limit headers are present.' : rateLimitStatus === 'na' ? 'Not audited (no served web surface).' : 'No RateLimit-* headers were found on probed endpoints.'),\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.2.0\",\n \"mcpName\": \"io.github.pooriaarab/aigentify\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\n \"aigentify\": \"dist/cli.js\",\n \"aigentify-mcp\": \"dist/mcp.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"\n },\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\n \"agents\",\n \"agentification\",\n \"mcp\",\n \"ai\",\n \"json-ld\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\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\": {\n \"node\": \">=20\"\n },\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; headers?: Record<string, string> }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n wellKnown: Endpoint; openapi: Endpoint; agentsPage: Endpoint;\n // is-agentic-parity signals (URL targets only)\n notFound: Endpoint; homeMarkdown: Endpoint; homeAsAgent: Endpoint;\n // Ora-parity round 2 (URL targets only)\n authMd: Endpoint; apiCatalog: Endpoint; agentCard: 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 // is-agentic-parity web signals — na for CLI/dir targets, low weight\n 'soft-404': 5, 'markdown-negotiation': 5, 'content-without-js': 5,\n 'org-schema': 5, 'crawler-reachable': 5, 'rate-limit-headers': 5,\n // Ora-parity round 2 web signals\n 'auth-md': 5, 'api-catalog': 5, 'agent-card-a2a': 5, 'link-headers': 5, 'markdown-alt': 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 'soft-404': 'Return a real HTTP 404 (or 410) for unknown paths — never a 200 with your app shell, which tells agents every path exists.',\n 'markdown-negotiation': 'Serve text/markdown on `Accept: text/markdown` and add `Accept` to the Vary header (Vary: Accept, Accept-Encoding) so CDNs key the variants apart.',\n 'content-without-js': 'Server-side render the homepage so crawlers without JS see an <h1> and 500+ characters of real text.',\n 'org-schema': 'Add Organization JSON-LD with both contactPoint (email/phone + contactType) and address (PostalAddress).',\n 'crawler-reachable': 'Let major agent User-Agents (GPTBot, ClaudeBot, ora-agent, ...) reach the homepage. Narrow WAF/bot rules that block them.',\n 'rate-limit-headers': 'Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle.',\n 'auth-md': 'Publish /auth.md — a markdown guide describing how an agent authenticates (API key or OAuth) and where to get credentials.',\n 'api-catalog': 'Publish /.well-known/api-catalog (RFC 9727 linkset) pointing agents at your OpenAPI spec(s) and API docs.',\n 'agent-card-a2a': 'Publish /.well-known/agent-card.json (A2A agent card) with at least name and url so A2A clients can discover the agent.',\n 'link-headers': 'Return RFC 8288 Link headers on the homepage pointing at llms.txt, openapi.json, and the agent card so agents discover descriptors without parsing HTML.',\n 'markdown-alt': 'Add a <link rel=\"alternate\" type=\"text/markdown\"> to the homepage so agents can find the markdown representation.',\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 notFound: { status: 404, contentType: '', text: '' }, homeMarkdown: { status: 404, contentType: '', text: '' }, homeAsAgent: { status: 404, contentType: '', text: '' },\n authMd: { status: 404, contentType: '', text: '' }, apiCatalog: { status: 404, contentType: '', text: '' }, agentCard: { 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, init?: RequestInit): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000), ...init });\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => { headers[key.toLowerCase()] = value; });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text(), headers };\n } catch { return { status: 0, contentType: '', text: '', headers: {} }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n // A path no real site serves — used to detect soft-404s (200 + app shell).\n const missingPath = `${base}/aigentify-probe-${'x'.repeat(8)}-404`;\n const [agents, server, mcp, home, llms, sitemap, wellKnown, wellKnownCard, openapi, agentsPage,\n notFound, homeMarkdown, homeAsAgent, authMd, apiCatalog] = 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 fetchText(fetcher, missingPath),\n fetchText(fetcher, base, { headers: { accept: 'text/markdown' } }),\n fetchText(fetcher, base, { headers: { 'user-agent': 'ora-agent' } }),\n fetchText(fetcher, `${base}/auth.md`),\n fetchText(fetcher, `${base}/.well-known/api-catalog`),\n ]);\n // agent-card.json is the same URL as the well-known probe above — reuse the response instead of fetching twice.\n const agentCard = wellKnownCard;\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,\n notFound, homeMarkdown, homeAsAgent, authMd, apiCatalog, agentCard,\n 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 looksMarkdown(endpoint: Endpoint): boolean {\n const varyAccept = /(^|,)\\s*accept\\s*($|,)/i.test(endpoint.headers?.vary ?? '');\n return ok(endpoint.status) && /text\\/markdown/i.test(endpoint.contentType) && varyAccept;\n}\n\nfunction hasBodyContent(html: string): boolean {\n const stripped = html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n .replace(/<!--[\\s\\S]*?-->/g, '');\n const hasH1 = /<h1[\\s>]/i.test(stripped);\n const textOnly = stripped.replace(/<[^>]+>/g, ' ').replace(/\\s+/g, ' ').trim();\n return hasH1 && textOnly.length >= 500;\n}\n\nfunction collectJsonLdNodes(value: unknown): Record<string, unknown>[] {\n if (Array.isArray(value)) return value.flatMap(collectJsonLdNodes);\n if (value && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n const graph = record['@graph'];\n return Array.isArray(graph) ? graph.flatMap(collectJsonLdNodes) : [record];\n }\n return [];\n}\n\nfunction isMeaningfulValue(value: unknown): boolean {\n if (value === null || value === undefined) return false;\n if (typeof value === 'string') return value.trim().length > 0;\n if (typeof value === 'object') return Object.keys(value as Record<string, unknown>).length > 0;\n return true;\n}\n\nfunction isOrganizationNode(node: Record<string, unknown>): boolean {\n const type = node['@type'];\n return type === 'Organization' || (Array.isArray(type) && type.includes('Organization'));\n}\n\nfunction orgSchemaStatus(html: string): 'pass' | 'warn' {\n const blocks = [...html.matchAll(/<script[^>]*application\\/ld\\+json[^>]*>([\\s\\S]*?)<\\/script>/gi)].map(m => m[1]);\n const nodes = blocks.flatMap(block => {\n try { return collectJsonLdNodes(JSON.parse(block)); } catch { return []; }\n });\n const orgNodes = nodes.filter(isOrganizationNode);\n if (!orgNodes.length) return 'warn';\n return orgNodes.some(node => isMeaningfulValue(node.contactPoint) && isMeaningfulValue(node.address)) ? 'pass' : 'warn';\n}\n\nfunction looksLikeHomepage(agentResponse: Endpoint, home: Endpoint): boolean {\n if (!ok(agentResponse.status)) return false;\n if (/captcha|access denied|are you a (?:human|robot)|checking your browser|request blocked/i.test(agentResponse.text)) return false;\n if (!ok(home.status) || !home.text.trim()) return agentResponse.text.trim().length > 0;\n return agentResponse.text.length >= home.text.length * 0.5;\n}\n\nfunction hasRateLimitHeaders(endpoints: Endpoint[]): boolean {\n return endpoints.some(endpoint => {\n if (!ok(endpoint.status)) return false;\n const keys = Object.keys(endpoint.headers ?? {});\n const has = (name: string) => keys.some(key => new RegExp(`^(x-)?ratelimit-${name}$`, 'i').test(key));\n return has('limit') && has('remaining') && has('reset');\n });\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 // is-agentic-parity signals: URL-only. na for directories or total network failure.\n const urlOnly = snapshot.isUrl && !snapshot.networkFailure;\n const soft404Status: AuditStatus = !urlOnly ? 'na'\n : snapshot.notFound.status === 404 || snapshot.notFound.status === 410 ? 'pass'\n : ok(snapshot.notFound.status) ? 'fail'\n : 'warn';\n const markdownStatus: AuditStatus = !urlOnly ? 'na' : looksMarkdown(snapshot.homeMarkdown) ? 'pass' : 'warn';\n const contentStatus: AuditStatus = !urlOnly ? 'na' : !ok(snapshot.home.status) ? 'warn' : hasBodyContent(snapshot.home.text) ? 'pass' : 'warn';\n const orgStatus: AuditStatus = !urlOnly ? 'na' : !ok(snapshot.home.status) ? 'warn' : orgSchemaStatus(snapshot.home.text);\n const crawlerStatus: AuditStatus = !urlOnly ? 'na' : looksLikeHomepage(snapshot.homeAsAgent, snapshot.home) ? 'pass' : 'warn';\n const rateLimitStatus: AuditStatus = !urlOnly ? 'na' : hasRateLimitHeaders([snapshot.openapi, snapshot.server, snapshot.home]) ? 'pass' : 'warn';\n const authMdStatus: AuditStatus = !urlOnly ? 'na'\n : ok(snapshot.authMd.status) && snapshot.authMd.text.trim().length > 0\n && (/text\\/markdown/i.test(snapshot.authMd.contentType) || snapshot.authMd.text.trimStart().startsWith('#')) ? 'pass' : 'warn';\n const apiCatalogStatus: AuditStatus = !urlOnly ? 'na'\n : ok(snapshot.apiCatalog.status) && Array.isArray(parseJson(snapshot.apiCatalog.text)?.linkset) ? 'pass' : 'warn';\n const agentCardStatus: AuditStatus = !urlOnly ? 'na' : (() => {\n if (!ok(snapshot.agentCard.status)) return 'warn';\n const card = parseJson(snapshot.agentCard.text);\n return card && typeof card.name === 'string' && card.name.trim().length > 0\n && typeof card.url === 'string' && card.url.trim().length > 0 ? 'pass' : 'warn';\n })();\n const linkHeadersStatus: AuditStatus = !urlOnly ? 'na'\n : /llms\\.txt|openapi\\.json|agent-card|\\.well-known/i.test(snapshot.home.headers?.link ?? '') ? 'pass' : 'warn';\n const markdownAltStatus: AuditStatus = !urlOnly ? 'na'\n : [...snapshot.home.text.matchAll(/<link\\b[^>]*>/gi)].some(([tag]) =>\n /rel=[\"']?alternate[\"']?/i.test(tag) && /type=[\"']?text\\/markdown/i.test(tag)) ? 'pass' : 'warn';\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 check('soft-404', soft404Status, soft404Status === 'pass' ? 'Unknown paths return a real 404.' : soft404Status === 'na' ? 'Not audited (no served web surface).' : soft404Status === 'warn' ? 'The 404 probe was inconclusive (no response, or a non-404/410 error status).' : 'Unknown paths return 200 with the app shell (soft-404).'),\n check('markdown-negotiation', markdownStatus, markdownStatus === 'pass' ? 'The homepage serves text/markdown with Vary: Accept.' : markdownStatus === 'na' ? 'Not audited (no served web surface).' : 'The homepage does not serve markdown on Accept: text/markdown with a Vary: Accept header.'),\n check('content-without-js', contentStatus, contentStatus === 'pass' ? 'The homepage renders an H1 and substantial text without JS.' : contentStatus === 'na' ? 'Not audited (no served web surface).' : 'The homepage lacks an H1 or enough server-rendered text.'),\n check('org-schema', orgStatus, orgStatus === 'pass' ? 'Organization JSON-LD includes contactPoint and address.' : orgStatus === 'na' ? 'Not audited (no served web surface).' : 'Organization JSON-LD is missing or lacks contactPoint/address.'),\n check('crawler-reachable', crawlerStatus, crawlerStatus === 'pass' ? 'The homepage is reachable by an agent User-Agent.' : crawlerStatus === 'na' ? 'Not audited (no served web surface).' : 'An agent User-Agent could not reach the homepage.'),\n check('rate-limit-headers', rateLimitStatus, rateLimitStatus === 'pass' ? 'Standard rate-limit headers are present.' : rateLimitStatus === 'na' ? 'Not audited (no served web surface).' : 'No RateLimit-* headers were found on probed endpoints.'),\n check('auth-md', authMdStatus, authMdStatus === 'pass' ? '/auth.md is available.' : authMdStatus === 'na' ? 'Not audited (no served web surface).' : 'No /auth.md agent-auth guide was found.'),\n check('api-catalog', apiCatalogStatus, apiCatalogStatus === 'pass' ? '/.well-known/api-catalog is available.' : apiCatalogStatus === 'na' ? 'Not audited (no served web surface).' : 'No /.well-known/api-catalog (RFC 9727) was found.'),\n check('agent-card-a2a', agentCardStatus, agentCardStatus === 'pass' ? 'An A2A agent-card.json is available.' : agentCardStatus === 'na' ? 'Not audited (no served web surface).' : 'No valid /.well-known/agent-card.json (A2A) was found.'),\n check('link-headers', linkHeadersStatus, linkHeadersStatus === 'pass' ? 'The homepage returns RFC 8288 Link headers.' : linkHeadersStatus === 'na' ? 'Not audited (no served web surface).' : 'No Link header was found on the homepage.'),\n check('markdown-alt', markdownAltStatus, markdownAltStatus === 'pass' ? 'The homepage advertises a markdown alternate link.' : markdownAltStatus === 'na' ? 'Not audited (no served web surface).' : 'No <link rel=\"alternate\" type=\"text/markdown\"> 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.3.0\",\n \"mcpName\": \"io.github.pooriaarab/aigentify\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\n \"aigentify\": \"dist/cli.js\",\n \"aigentify-mcp\": \"dist/mcp.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"\n },\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\n \"agents\",\n \"agentification\",\n \"mcp\",\n \"ai\",\n \"json-ld\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\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\": {\n \"node\": \">=20\"\n },\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":[]} |
+42
-6
@@ -49,3 +49,3 @@ #!/usr/bin/env node | ||
| name: "aigentify", | ||
| version: "0.2.0", | ||
| version: "0.3.0", | ||
| mcpName: "io.github.pooriaarab/aigentify", | ||
@@ -142,3 +142,9 @@ description: "Audit and generate agent-native product surfaces", | ||
| "crawler-reachable": 5, | ||
| "rate-limit-headers": 5 | ||
| "rate-limit-headers": 5, | ||
| // Ora-parity round 2 web signals | ||
| "auth-md": 5, | ||
| "api-catalog": 5, | ||
| "agent-card-a2a": 5, | ||
| "link-headers": 5, | ||
| "markdown-alt": 5 | ||
| }; | ||
@@ -162,3 +168,8 @@ var FIXES = { | ||
| "crawler-reachable": "Let major agent User-Agents (GPTBot, ClaudeBot, ora-agent, ...) reach the homepage. Narrow WAF/bot rules that block them.", | ||
| "rate-limit-headers": "Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle." | ||
| "rate-limit-headers": "Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle.", | ||
| "auth-md": "Publish /auth.md \u2014 a markdown guide describing how an agent authenticates (API key or OAuth) and where to get credentials.", | ||
| "api-catalog": "Publish /.well-known/api-catalog (RFC 9727 linkset) pointing agents at your OpenAPI spec(s) and API docs.", | ||
| "agent-card-a2a": "Publish /.well-known/agent-card.json (A2A agent card) with at least name and url so A2A clients can discover the agent.", | ||
| "link-headers": "Return RFC 8288 Link headers on the homepage pointing at llms.txt, openapi.json, and the agent card so agents discover descriptors without parsing HTML.", | ||
| "markdown-alt": 'Add a <link rel="alternate" type="text/markdown"> to the homepage so agents can find the markdown representation.' | ||
| }; | ||
@@ -259,2 +270,5 @@ function check(id, status, note) { | ||
| homeAsAgent: { status: 404, contentType: "", text: "" }, | ||
| authMd: { status: 404, contentType: "", text: "" }, | ||
| apiCatalog: { status: 404, contentType: "", text: "" }, | ||
| agentCard: { status: 404, contentType: "", text: "" }, | ||
| honestText, | ||
@@ -294,3 +308,5 @@ hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), | ||
| homeMarkdown, | ||
| homeAsAgent | ||
| homeAsAgent, | ||
| authMd, | ||
| apiCatalog | ||
| ] = await Promise.all([ | ||
@@ -309,4 +325,7 @@ fetchText(fetcher, `${base}/agents.md`), | ||
| fetchText(fetcher, base, { headers: { accept: "text/markdown" } }), | ||
| fetchText(fetcher, base, { headers: { "user-agent": "ora-agent" } }) | ||
| fetchText(fetcher, base, { headers: { "user-agent": "ora-agent" } }), | ||
| fetchText(fetcher, `${base}/auth.md`), | ||
| fetchText(fetcher, `${base}/.well-known/api-catalog`) | ||
| ]); | ||
| const agentCard = wellKnownCard; | ||
| const endpoints = [agents, server, mcp, home, llms, sitemap]; | ||
@@ -327,2 +346,5 @@ const wk = ok(wellKnown.status) ? wellKnown : wellKnownCard; | ||
| homeAsAgent, | ||
| authMd, | ||
| apiCatalog, | ||
| agentCard, | ||
| honestText: [home.text, offerBlock(agents.text)].join("\n"), | ||
@@ -413,2 +435,11 @@ hasMcp: server.status >= 200 && server.status < 400 || mcp.status >= 200 && mcp.status < 400, | ||
| const rateLimitStatus = !urlOnly ? "na" : hasRateLimitHeaders([snapshot.openapi, snapshot.server, snapshot.home]) ? "pass" : "warn"; | ||
| const authMdStatus = !urlOnly ? "na" : ok(snapshot.authMd.status) && snapshot.authMd.text.trim().length > 0 && (/text\/markdown/i.test(snapshot.authMd.contentType) || snapshot.authMd.text.trimStart().startsWith("#")) ? "pass" : "warn"; | ||
| const apiCatalogStatus = !urlOnly ? "na" : ok(snapshot.apiCatalog.status) && Array.isArray(parseJson(snapshot.apiCatalog.text)?.linkset) ? "pass" : "warn"; | ||
| const agentCardStatus = !urlOnly ? "na" : (() => { | ||
| if (!ok(snapshot.agentCard.status)) return "warn"; | ||
| const card = parseJson(snapshot.agentCard.text); | ||
| return card && typeof card.name === "string" && card.name.trim().length > 0 && typeof card.url === "string" && card.url.trim().length > 0 ? "pass" : "warn"; | ||
| })(); | ||
| const linkHeadersStatus = !urlOnly ? "na" : /llms\.txt|openapi\.json|agent-card|\.well-known/i.test(snapshot.home.headers?.link ?? "") ? "pass" : "warn"; | ||
| const markdownAltStatus = !urlOnly ? "na" : [...snapshot.home.text.matchAll(/<link\b[^>]*>/gi)].some(([tag]) => /rel=["']?alternate["']?/i.test(tag) && /type=["']?text\/markdown/i.test(tag)) ? "pass" : "warn"; | ||
| return [ | ||
@@ -431,3 +462,8 @@ check("agents-md", agentsStatus, agentsPresent ? "AGENTS.md is available." : snapshot.agents.status === 0 ? "The AGENTS.md request failed." : "AGENTS.md is missing."), | ||
| check("crawler-reachable", crawlerStatus, crawlerStatus === "pass" ? "The homepage is reachable by an agent User-Agent." : crawlerStatus === "na" ? "Not audited (no served web surface)." : "An agent User-Agent could not reach the homepage."), | ||
| check("rate-limit-headers", rateLimitStatus, rateLimitStatus === "pass" ? "Standard rate-limit headers are present." : rateLimitStatus === "na" ? "Not audited (no served web surface)." : "No RateLimit-* headers were found on probed endpoints.") | ||
| check("rate-limit-headers", rateLimitStatus, rateLimitStatus === "pass" ? "Standard rate-limit headers are present." : rateLimitStatus === "na" ? "Not audited (no served web surface)." : "No RateLimit-* headers were found on probed endpoints."), | ||
| check("auth-md", authMdStatus, authMdStatus === "pass" ? "/auth.md is available." : authMdStatus === "na" ? "Not audited (no served web surface)." : "No /auth.md agent-auth guide was found."), | ||
| check("api-catalog", apiCatalogStatus, apiCatalogStatus === "pass" ? "/.well-known/api-catalog is available." : apiCatalogStatus === "na" ? "Not audited (no served web surface)." : "No /.well-known/api-catalog (RFC 9727) was found."), | ||
| check("agent-card-a2a", agentCardStatus, agentCardStatus === "pass" ? "An A2A agent-card.json is available." : agentCardStatus === "na" ? "Not audited (no served web surface)." : "No valid /.well-known/agent-card.json (A2A) was found."), | ||
| check("link-headers", linkHeadersStatus, linkHeadersStatus === "pass" ? "The homepage returns RFC 8288 Link headers." : linkHeadersStatus === "na" ? "Not audited (no served web surface)." : "No Link header was found on the homepage."), | ||
| check("markdown-alt", markdownAltStatus, markdownAltStatus === "pass" ? "The homepage advertises a markdown alternate link." : markdownAltStatus === "na" ? "Not audited (no served web surface)." : 'No <link rel="alternate" type="text/markdown"> was found.') | ||
| ]; | ||
@@ -434,0 +470,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; headers?: Record<string, string> }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n wellKnown: Endpoint; openapi: Endpoint; agentsPage: Endpoint;\n // is-agentic-parity signals (URL targets only)\n notFound: Endpoint; homeMarkdown: Endpoint; homeAsAgent: 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 // is-agentic-parity web signals — na for CLI/dir targets, low weight\n 'soft-404': 5, 'markdown-negotiation': 5, 'content-without-js': 5,\n 'org-schema': 5, 'crawler-reachable': 5, 'rate-limit-headers': 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 'soft-404': 'Return a real HTTP 404 (or 410) for unknown paths — never a 200 with your app shell, which tells agents every path exists.',\n 'markdown-negotiation': 'Serve text/markdown on `Accept: text/markdown` and add `Accept` to the Vary header (Vary: Accept, Accept-Encoding) so CDNs key the variants apart.',\n 'content-without-js': 'Server-side render the homepage so crawlers without JS see an <h1> and 500+ characters of real text.',\n 'org-schema': 'Add Organization JSON-LD with both contactPoint (email/phone + contactType) and address (PostalAddress).',\n 'crawler-reachable': 'Let major agent User-Agents (GPTBot, ClaudeBot, ora-agent, ...) reach the homepage. Narrow WAF/bot rules that block them.',\n 'rate-limit-headers': 'Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle.',\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 notFound: { status: 404, contentType: '', text: '' }, homeMarkdown: { status: 404, contentType: '', text: '' }, homeAsAgent: { 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, init?: RequestInit): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000), ...init });\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => { headers[key.toLowerCase()] = value; });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text(), headers };\n } catch { return { status: 0, contentType: '', text: '', headers: {} }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n // A path no real site serves — used to detect soft-404s (200 + app shell).\n const missingPath = `${base}/aigentify-probe-${'x'.repeat(8)}-404`;\n const [agents, server, mcp, home, llms, sitemap, wellKnown, wellKnownCard, openapi, agentsPage,\n notFound, homeMarkdown, homeAsAgent] = 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 fetchText(fetcher, missingPath),\n fetchText(fetcher, base, { headers: { accept: 'text/markdown' } }),\n fetchText(fetcher, base, { headers: { 'user-agent': 'ora-agent' } }),\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,\n notFound, homeMarkdown, homeAsAgent,\n 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 looksMarkdown(endpoint: Endpoint): boolean {\n const varyAccept = /(^|,)\\s*accept\\s*($|,)/i.test(endpoint.headers?.vary ?? '');\n return ok(endpoint.status) && /text\\/markdown/i.test(endpoint.contentType) && varyAccept;\n}\n\nfunction hasBodyContent(html: string): boolean {\n const stripped = html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n .replace(/<!--[\\s\\S]*?-->/g, '');\n const hasH1 = /<h1[\\s>]/i.test(stripped);\n const textOnly = stripped.replace(/<[^>]+>/g, ' ').replace(/\\s+/g, ' ').trim();\n return hasH1 && textOnly.length >= 500;\n}\n\nfunction collectJsonLdNodes(value: unknown): Record<string, unknown>[] {\n if (Array.isArray(value)) return value.flatMap(collectJsonLdNodes);\n if (value && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n const graph = record['@graph'];\n return Array.isArray(graph) ? graph.flatMap(collectJsonLdNodes) : [record];\n }\n return [];\n}\n\nfunction isMeaningfulValue(value: unknown): boolean {\n if (value === null || value === undefined) return false;\n if (typeof value === 'string') return value.trim().length > 0;\n if (typeof value === 'object') return Object.keys(value as Record<string, unknown>).length > 0;\n return true;\n}\n\nfunction isOrganizationNode(node: Record<string, unknown>): boolean {\n const type = node['@type'];\n return type === 'Organization' || (Array.isArray(type) && type.includes('Organization'));\n}\n\nfunction orgSchemaStatus(html: string): 'pass' | 'warn' {\n const blocks = [...html.matchAll(/<script[^>]*application\\/ld\\+json[^>]*>([\\s\\S]*?)<\\/script>/gi)].map(m => m[1]);\n const nodes = blocks.flatMap(block => {\n try { return collectJsonLdNodes(JSON.parse(block)); } catch { return []; }\n });\n const orgNodes = nodes.filter(isOrganizationNode);\n if (!orgNodes.length) return 'warn';\n return orgNodes.some(node => isMeaningfulValue(node.contactPoint) && isMeaningfulValue(node.address)) ? 'pass' : 'warn';\n}\n\nfunction looksLikeHomepage(agentResponse: Endpoint, home: Endpoint): boolean {\n if (!ok(agentResponse.status)) return false;\n if (/captcha|access denied|are you a (?:human|robot)|checking your browser|request blocked/i.test(agentResponse.text)) return false;\n if (!ok(home.status) || !home.text.trim()) return agentResponse.text.trim().length > 0;\n return agentResponse.text.length >= home.text.length * 0.5;\n}\n\nfunction hasRateLimitHeaders(endpoints: Endpoint[]): boolean {\n return endpoints.some(endpoint => {\n if (!ok(endpoint.status)) return false;\n const keys = Object.keys(endpoint.headers ?? {});\n const has = (name: string) => keys.some(key => new RegExp(`^(x-)?ratelimit-${name}$`, 'i').test(key));\n return has('limit') && has('remaining') && has('reset');\n });\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 // is-agentic-parity signals: URL-only. na for directories or total network failure.\n const urlOnly = snapshot.isUrl && !snapshot.networkFailure;\n const soft404Status: AuditStatus = !urlOnly ? 'na'\n : snapshot.notFound.status === 404 || snapshot.notFound.status === 410 ? 'pass'\n : ok(snapshot.notFound.status) ? 'fail'\n : 'warn';\n const markdownStatus: AuditStatus = !urlOnly ? 'na' : looksMarkdown(snapshot.homeMarkdown) ? 'pass' : 'warn';\n const contentStatus: AuditStatus = !urlOnly ? 'na' : !ok(snapshot.home.status) ? 'warn' : hasBodyContent(snapshot.home.text) ? 'pass' : 'warn';\n const orgStatus: AuditStatus = !urlOnly ? 'na' : !ok(snapshot.home.status) ? 'warn' : orgSchemaStatus(snapshot.home.text);\n const crawlerStatus: AuditStatus = !urlOnly ? 'na' : looksLikeHomepage(snapshot.homeAsAgent, snapshot.home) ? 'pass' : 'warn';\n const rateLimitStatus: AuditStatus = !urlOnly ? 'na' : hasRateLimitHeaders([snapshot.openapi, snapshot.server, snapshot.home]) ? 'pass' : 'warn';\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 check('soft-404', soft404Status, soft404Status === 'pass' ? 'Unknown paths return a real 404.' : soft404Status === 'na' ? 'Not audited (no served web surface).' : soft404Status === 'warn' ? 'The 404 probe was inconclusive (no response, or a non-404/410 error status).' : 'Unknown paths return 200 with the app shell (soft-404).'),\n check('markdown-negotiation', markdownStatus, markdownStatus === 'pass' ? 'The homepage serves text/markdown with Vary: Accept.' : markdownStatus === 'na' ? 'Not audited (no served web surface).' : 'The homepage does not serve markdown on Accept: text/markdown with a Vary: Accept header.'),\n check('content-without-js', contentStatus, contentStatus === 'pass' ? 'The homepage renders an H1 and substantial text without JS.' : contentStatus === 'na' ? 'Not audited (no served web surface).' : 'The homepage lacks an H1 or enough server-rendered text.'),\n check('org-schema', orgStatus, orgStatus === 'pass' ? 'Organization JSON-LD includes contactPoint and address.' : orgStatus === 'na' ? 'Not audited (no served web surface).' : 'Organization JSON-LD is missing or lacks contactPoint/address.'),\n check('crawler-reachable', crawlerStatus, crawlerStatus === 'pass' ? 'The homepage is reachable by an agent User-Agent.' : crawlerStatus === 'na' ? 'Not audited (no served web surface).' : 'An agent User-Agent could not reach the homepage.'),\n check('rate-limit-headers', rateLimitStatus, rateLimitStatus === 'pass' ? 'Standard rate-limit headers are present.' : rateLimitStatus === 'na' ? 'Not audited (no served web surface).' : 'No RateLimit-* headers were found on probed endpoints.'),\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.2.0\",\n \"mcpName\": \"io.github.pooriaarab/aigentify\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\n \"aigentify\": \"dist/cli.js\",\n \"aigentify-mcp\": \"dist/mcp.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"\n },\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\n \"agents\",\n \"agentification\",\n \"mcp\",\n \"ai\",\n \"json-ld\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\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\": {\n \"node\": \">=20\"\n },\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; headers?: Record<string, string> }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n wellKnown: Endpoint; openapi: Endpoint; agentsPage: Endpoint;\n // is-agentic-parity signals (URL targets only)\n notFound: Endpoint; homeMarkdown: Endpoint; homeAsAgent: Endpoint;\n // Ora-parity round 2 (URL targets only)\n authMd: Endpoint; apiCatalog: Endpoint; agentCard: 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 // is-agentic-parity web signals — na for CLI/dir targets, low weight\n 'soft-404': 5, 'markdown-negotiation': 5, 'content-without-js': 5,\n 'org-schema': 5, 'crawler-reachable': 5, 'rate-limit-headers': 5,\n // Ora-parity round 2 web signals\n 'auth-md': 5, 'api-catalog': 5, 'agent-card-a2a': 5, 'link-headers': 5, 'markdown-alt': 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 'soft-404': 'Return a real HTTP 404 (or 410) for unknown paths — never a 200 with your app shell, which tells agents every path exists.',\n 'markdown-negotiation': 'Serve text/markdown on `Accept: text/markdown` and add `Accept` to the Vary header (Vary: Accept, Accept-Encoding) so CDNs key the variants apart.',\n 'content-without-js': 'Server-side render the homepage so crawlers without JS see an <h1> and 500+ characters of real text.',\n 'org-schema': 'Add Organization JSON-LD with both contactPoint (email/phone + contactType) and address (PostalAddress).',\n 'crawler-reachable': 'Let major agent User-Agents (GPTBot, ClaudeBot, ora-agent, ...) reach the homepage. Narrow WAF/bot rules that block them.',\n 'rate-limit-headers': 'Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle.',\n 'auth-md': 'Publish /auth.md — a markdown guide describing how an agent authenticates (API key or OAuth) and where to get credentials.',\n 'api-catalog': 'Publish /.well-known/api-catalog (RFC 9727 linkset) pointing agents at your OpenAPI spec(s) and API docs.',\n 'agent-card-a2a': 'Publish /.well-known/agent-card.json (A2A agent card) with at least name and url so A2A clients can discover the agent.',\n 'link-headers': 'Return RFC 8288 Link headers on the homepage pointing at llms.txt, openapi.json, and the agent card so agents discover descriptors without parsing HTML.',\n 'markdown-alt': 'Add a <link rel=\"alternate\" type=\"text/markdown\"> to the homepage so agents can find the markdown representation.',\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 notFound: { status: 404, contentType: '', text: '' }, homeMarkdown: { status: 404, contentType: '', text: '' }, homeAsAgent: { status: 404, contentType: '', text: '' },\n authMd: { status: 404, contentType: '', text: '' }, apiCatalog: { status: 404, contentType: '', text: '' }, agentCard: { 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, init?: RequestInit): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000), ...init });\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => { headers[key.toLowerCase()] = value; });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text(), headers };\n } catch { return { status: 0, contentType: '', text: '', headers: {} }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n // A path no real site serves — used to detect soft-404s (200 + app shell).\n const missingPath = `${base}/aigentify-probe-${'x'.repeat(8)}-404`;\n const [agents, server, mcp, home, llms, sitemap, wellKnown, wellKnownCard, openapi, agentsPage,\n notFound, homeMarkdown, homeAsAgent, authMd, apiCatalog] = 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 fetchText(fetcher, missingPath),\n fetchText(fetcher, base, { headers: { accept: 'text/markdown' } }),\n fetchText(fetcher, base, { headers: { 'user-agent': 'ora-agent' } }),\n fetchText(fetcher, `${base}/auth.md`),\n fetchText(fetcher, `${base}/.well-known/api-catalog`),\n ]);\n // agent-card.json is the same URL as the well-known probe above — reuse the response instead of fetching twice.\n const agentCard = wellKnownCard;\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,\n notFound, homeMarkdown, homeAsAgent, authMd, apiCatalog, agentCard,\n 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 looksMarkdown(endpoint: Endpoint): boolean {\n const varyAccept = /(^|,)\\s*accept\\s*($|,)/i.test(endpoint.headers?.vary ?? '');\n return ok(endpoint.status) && /text\\/markdown/i.test(endpoint.contentType) && varyAccept;\n}\n\nfunction hasBodyContent(html: string): boolean {\n const stripped = html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n .replace(/<!--[\\s\\S]*?-->/g, '');\n const hasH1 = /<h1[\\s>]/i.test(stripped);\n const textOnly = stripped.replace(/<[^>]+>/g, ' ').replace(/\\s+/g, ' ').trim();\n return hasH1 && textOnly.length >= 500;\n}\n\nfunction collectJsonLdNodes(value: unknown): Record<string, unknown>[] {\n if (Array.isArray(value)) return value.flatMap(collectJsonLdNodes);\n if (value && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n const graph = record['@graph'];\n return Array.isArray(graph) ? graph.flatMap(collectJsonLdNodes) : [record];\n }\n return [];\n}\n\nfunction isMeaningfulValue(value: unknown): boolean {\n if (value === null || value === undefined) return false;\n if (typeof value === 'string') return value.trim().length > 0;\n if (typeof value === 'object') return Object.keys(value as Record<string, unknown>).length > 0;\n return true;\n}\n\nfunction isOrganizationNode(node: Record<string, unknown>): boolean {\n const type = node['@type'];\n return type === 'Organization' || (Array.isArray(type) && type.includes('Organization'));\n}\n\nfunction orgSchemaStatus(html: string): 'pass' | 'warn' {\n const blocks = [...html.matchAll(/<script[^>]*application\\/ld\\+json[^>]*>([\\s\\S]*?)<\\/script>/gi)].map(m => m[1]);\n const nodes = blocks.flatMap(block => {\n try { return collectJsonLdNodes(JSON.parse(block)); } catch { return []; }\n });\n const orgNodes = nodes.filter(isOrganizationNode);\n if (!orgNodes.length) return 'warn';\n return orgNodes.some(node => isMeaningfulValue(node.contactPoint) && isMeaningfulValue(node.address)) ? 'pass' : 'warn';\n}\n\nfunction looksLikeHomepage(agentResponse: Endpoint, home: Endpoint): boolean {\n if (!ok(agentResponse.status)) return false;\n if (/captcha|access denied|are you a (?:human|robot)|checking your browser|request blocked/i.test(agentResponse.text)) return false;\n if (!ok(home.status) || !home.text.trim()) return agentResponse.text.trim().length > 0;\n return agentResponse.text.length >= home.text.length * 0.5;\n}\n\nfunction hasRateLimitHeaders(endpoints: Endpoint[]): boolean {\n return endpoints.some(endpoint => {\n if (!ok(endpoint.status)) return false;\n const keys = Object.keys(endpoint.headers ?? {});\n const has = (name: string) => keys.some(key => new RegExp(`^(x-)?ratelimit-${name}$`, 'i').test(key));\n return has('limit') && has('remaining') && has('reset');\n });\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 // is-agentic-parity signals: URL-only. na for directories or total network failure.\n const urlOnly = snapshot.isUrl && !snapshot.networkFailure;\n const soft404Status: AuditStatus = !urlOnly ? 'na'\n : snapshot.notFound.status === 404 || snapshot.notFound.status === 410 ? 'pass'\n : ok(snapshot.notFound.status) ? 'fail'\n : 'warn';\n const markdownStatus: AuditStatus = !urlOnly ? 'na' : looksMarkdown(snapshot.homeMarkdown) ? 'pass' : 'warn';\n const contentStatus: AuditStatus = !urlOnly ? 'na' : !ok(snapshot.home.status) ? 'warn' : hasBodyContent(snapshot.home.text) ? 'pass' : 'warn';\n const orgStatus: AuditStatus = !urlOnly ? 'na' : !ok(snapshot.home.status) ? 'warn' : orgSchemaStatus(snapshot.home.text);\n const crawlerStatus: AuditStatus = !urlOnly ? 'na' : looksLikeHomepage(snapshot.homeAsAgent, snapshot.home) ? 'pass' : 'warn';\n const rateLimitStatus: AuditStatus = !urlOnly ? 'na' : hasRateLimitHeaders([snapshot.openapi, snapshot.server, snapshot.home]) ? 'pass' : 'warn';\n const authMdStatus: AuditStatus = !urlOnly ? 'na'\n : ok(snapshot.authMd.status) && snapshot.authMd.text.trim().length > 0\n && (/text\\/markdown/i.test(snapshot.authMd.contentType) || snapshot.authMd.text.trimStart().startsWith('#')) ? 'pass' : 'warn';\n const apiCatalogStatus: AuditStatus = !urlOnly ? 'na'\n : ok(snapshot.apiCatalog.status) && Array.isArray(parseJson(snapshot.apiCatalog.text)?.linkset) ? 'pass' : 'warn';\n const agentCardStatus: AuditStatus = !urlOnly ? 'na' : (() => {\n if (!ok(snapshot.agentCard.status)) return 'warn';\n const card = parseJson(snapshot.agentCard.text);\n return card && typeof card.name === 'string' && card.name.trim().length > 0\n && typeof card.url === 'string' && card.url.trim().length > 0 ? 'pass' : 'warn';\n })();\n const linkHeadersStatus: AuditStatus = !urlOnly ? 'na'\n : /llms\\.txt|openapi\\.json|agent-card|\\.well-known/i.test(snapshot.home.headers?.link ?? '') ? 'pass' : 'warn';\n const markdownAltStatus: AuditStatus = !urlOnly ? 'na'\n : [...snapshot.home.text.matchAll(/<link\\b[^>]*>/gi)].some(([tag]) =>\n /rel=[\"']?alternate[\"']?/i.test(tag) && /type=[\"']?text\\/markdown/i.test(tag)) ? 'pass' : 'warn';\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 check('soft-404', soft404Status, soft404Status === 'pass' ? 'Unknown paths return a real 404.' : soft404Status === 'na' ? 'Not audited (no served web surface).' : soft404Status === 'warn' ? 'The 404 probe was inconclusive (no response, or a non-404/410 error status).' : 'Unknown paths return 200 with the app shell (soft-404).'),\n check('markdown-negotiation', markdownStatus, markdownStatus === 'pass' ? 'The homepage serves text/markdown with Vary: Accept.' : markdownStatus === 'na' ? 'Not audited (no served web surface).' : 'The homepage does not serve markdown on Accept: text/markdown with a Vary: Accept header.'),\n check('content-without-js', contentStatus, contentStatus === 'pass' ? 'The homepage renders an H1 and substantial text without JS.' : contentStatus === 'na' ? 'Not audited (no served web surface).' : 'The homepage lacks an H1 or enough server-rendered text.'),\n check('org-schema', orgStatus, orgStatus === 'pass' ? 'Organization JSON-LD includes contactPoint and address.' : orgStatus === 'na' ? 'Not audited (no served web surface).' : 'Organization JSON-LD is missing or lacks contactPoint/address.'),\n check('crawler-reachable', crawlerStatus, crawlerStatus === 'pass' ? 'The homepage is reachable by an agent User-Agent.' : crawlerStatus === 'na' ? 'Not audited (no served web surface).' : 'An agent User-Agent could not reach the homepage.'),\n check('rate-limit-headers', rateLimitStatus, rateLimitStatus === 'pass' ? 'Standard rate-limit headers are present.' : rateLimitStatus === 'na' ? 'Not audited (no served web surface).' : 'No RateLimit-* headers were found on probed endpoints.'),\n check('auth-md', authMdStatus, authMdStatus === 'pass' ? '/auth.md is available.' : authMdStatus === 'na' ? 'Not audited (no served web surface).' : 'No /auth.md agent-auth guide was found.'),\n check('api-catalog', apiCatalogStatus, apiCatalogStatus === 'pass' ? '/.well-known/api-catalog is available.' : apiCatalogStatus === 'na' ? 'Not audited (no served web surface).' : 'No /.well-known/api-catalog (RFC 9727) was found.'),\n check('agent-card-a2a', agentCardStatus, agentCardStatus === 'pass' ? 'An A2A agent-card.json is available.' : agentCardStatus === 'na' ? 'Not audited (no served web surface).' : 'No valid /.well-known/agent-card.json (A2A) was found.'),\n check('link-headers', linkHeadersStatus, linkHeadersStatus === 'pass' ? 'The homepage returns RFC 8288 Link headers.' : linkHeadersStatus === 'na' ? 'Not audited (no served web surface).' : 'No Link header was found on the homepage.'),\n check('markdown-alt', markdownAltStatus, markdownAltStatus === 'pass' ? 'The homepage advertises a markdown alternate link.' : markdownAltStatus === 'na' ? 'Not audited (no served web surface).' : 'No <link rel=\"alternate\" type=\"text/markdown\"> 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.3.0\",\n \"mcpName\": \"io.github.pooriaarab/aigentify\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\n \"aigentify\": \"dist/cli.js\",\n \"aigentify-mcp\": \"dist/mcp.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"\n },\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\n \"agents\",\n \"agentification\",\n \"mcp\",\n \"ai\",\n \"json-ld\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\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\": {\n \"node\": \">=20\"\n },\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"]} |
+42
-6
@@ -15,3 +15,3 @@ #!/usr/bin/env node | ||
| name: "aigentify", | ||
| version: "0.2.0", | ||
| version: "0.3.0", | ||
| mcpName: "io.github.pooriaarab/aigentify", | ||
@@ -108,3 +108,9 @@ description: "Audit and generate agent-native product surfaces", | ||
| "crawler-reachable": 5, | ||
| "rate-limit-headers": 5 | ||
| "rate-limit-headers": 5, | ||
| // Ora-parity round 2 web signals | ||
| "auth-md": 5, | ||
| "api-catalog": 5, | ||
| "agent-card-a2a": 5, | ||
| "link-headers": 5, | ||
| "markdown-alt": 5 | ||
| }; | ||
@@ -128,3 +134,8 @@ var FIXES = { | ||
| "crawler-reachable": "Let major agent User-Agents (GPTBot, ClaudeBot, ora-agent, ...) reach the homepage. Narrow WAF/bot rules that block them.", | ||
| "rate-limit-headers": "Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle." | ||
| "rate-limit-headers": "Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle.", | ||
| "auth-md": "Publish /auth.md \u2014 a markdown guide describing how an agent authenticates (API key or OAuth) and where to get credentials.", | ||
| "api-catalog": "Publish /.well-known/api-catalog (RFC 9727 linkset) pointing agents at your OpenAPI spec(s) and API docs.", | ||
| "agent-card-a2a": "Publish /.well-known/agent-card.json (A2A agent card) with at least name and url so A2A clients can discover the agent.", | ||
| "link-headers": "Return RFC 8288 Link headers on the homepage pointing at llms.txt, openapi.json, and the agent card so agents discover descriptors without parsing HTML.", | ||
| "markdown-alt": 'Add a <link rel="alternate" type="text/markdown"> to the homepage so agents can find the markdown representation.' | ||
| }; | ||
@@ -225,2 +236,5 @@ function check(id, status, note) { | ||
| homeAsAgent: { status: 404, contentType: "", text: "" }, | ||
| authMd: { status: 404, contentType: "", text: "" }, | ||
| apiCatalog: { status: 404, contentType: "", text: "" }, | ||
| agentCard: { status: 404, contentType: "", text: "" }, | ||
| honestText, | ||
@@ -260,3 +274,5 @@ hasMcp: Boolean(mcpFile || serverFile || hasMcpBin), | ||
| homeMarkdown, | ||
| homeAsAgent | ||
| homeAsAgent, | ||
| authMd, | ||
| apiCatalog | ||
| ] = await Promise.all([ | ||
@@ -275,4 +291,7 @@ fetchText(fetcher, `${base}/agents.md`), | ||
| fetchText(fetcher, base, { headers: { accept: "text/markdown" } }), | ||
| fetchText(fetcher, base, { headers: { "user-agent": "ora-agent" } }) | ||
| fetchText(fetcher, base, { headers: { "user-agent": "ora-agent" } }), | ||
| fetchText(fetcher, `${base}/auth.md`), | ||
| fetchText(fetcher, `${base}/.well-known/api-catalog`) | ||
| ]); | ||
| const agentCard = wellKnownCard; | ||
| const endpoints = [agents, server, mcp, home, llms, sitemap]; | ||
@@ -293,2 +312,5 @@ const wk = ok(wellKnown.status) ? wellKnown : wellKnownCard; | ||
| homeAsAgent, | ||
| authMd, | ||
| apiCatalog, | ||
| agentCard, | ||
| honestText: [home.text, offerBlock(agents.text)].join("\n"), | ||
@@ -379,2 +401,11 @@ hasMcp: server.status >= 200 && server.status < 400 || mcp.status >= 200 && mcp.status < 400, | ||
| const rateLimitStatus = !urlOnly ? "na" : hasRateLimitHeaders([snapshot.openapi, snapshot.server, snapshot.home]) ? "pass" : "warn"; | ||
| const authMdStatus = !urlOnly ? "na" : ok(snapshot.authMd.status) && snapshot.authMd.text.trim().length > 0 && (/text\/markdown/i.test(snapshot.authMd.contentType) || snapshot.authMd.text.trimStart().startsWith("#")) ? "pass" : "warn"; | ||
| const apiCatalogStatus = !urlOnly ? "na" : ok(snapshot.apiCatalog.status) && Array.isArray(parseJson(snapshot.apiCatalog.text)?.linkset) ? "pass" : "warn"; | ||
| const agentCardStatus = !urlOnly ? "na" : (() => { | ||
| if (!ok(snapshot.agentCard.status)) return "warn"; | ||
| const card = parseJson(snapshot.agentCard.text); | ||
| return card && typeof card.name === "string" && card.name.trim().length > 0 && typeof card.url === "string" && card.url.trim().length > 0 ? "pass" : "warn"; | ||
| })(); | ||
| const linkHeadersStatus = !urlOnly ? "na" : /llms\.txt|openapi\.json|agent-card|\.well-known/i.test(snapshot.home.headers?.link ?? "") ? "pass" : "warn"; | ||
| const markdownAltStatus = !urlOnly ? "na" : [...snapshot.home.text.matchAll(/<link\b[^>]*>/gi)].some(([tag]) => /rel=["']?alternate["']?/i.test(tag) && /type=["']?text\/markdown/i.test(tag)) ? "pass" : "warn"; | ||
| return [ | ||
@@ -397,3 +428,8 @@ check("agents-md", agentsStatus, agentsPresent ? "AGENTS.md is available." : snapshot.agents.status === 0 ? "The AGENTS.md request failed." : "AGENTS.md is missing."), | ||
| check("crawler-reachable", crawlerStatus, crawlerStatus === "pass" ? "The homepage is reachable by an agent User-Agent." : crawlerStatus === "na" ? "Not audited (no served web surface)." : "An agent User-Agent could not reach the homepage."), | ||
| check("rate-limit-headers", rateLimitStatus, rateLimitStatus === "pass" ? "Standard rate-limit headers are present." : rateLimitStatus === "na" ? "Not audited (no served web surface)." : "No RateLimit-* headers were found on probed endpoints.") | ||
| check("rate-limit-headers", rateLimitStatus, rateLimitStatus === "pass" ? "Standard rate-limit headers are present." : rateLimitStatus === "na" ? "Not audited (no served web surface)." : "No RateLimit-* headers were found on probed endpoints."), | ||
| check("auth-md", authMdStatus, authMdStatus === "pass" ? "/auth.md is available." : authMdStatus === "na" ? "Not audited (no served web surface)." : "No /auth.md agent-auth guide was found."), | ||
| check("api-catalog", apiCatalogStatus, apiCatalogStatus === "pass" ? "/.well-known/api-catalog is available." : apiCatalogStatus === "na" ? "Not audited (no served web surface)." : "No /.well-known/api-catalog (RFC 9727) was found."), | ||
| check("agent-card-a2a", agentCardStatus, agentCardStatus === "pass" ? "An A2A agent-card.json is available." : agentCardStatus === "na" ? "Not audited (no served web surface)." : "No valid /.well-known/agent-card.json (A2A) was found."), | ||
| check("link-headers", linkHeadersStatus, linkHeadersStatus === "pass" ? "The homepage returns RFC 8288 Link headers." : linkHeadersStatus === "na" ? "Not audited (no served web surface)." : "No Link header was found on the homepage."), | ||
| check("markdown-alt", markdownAltStatus, markdownAltStatus === "pass" ? "The homepage advertises a markdown alternate link." : markdownAltStatus === "na" ? "Not audited (no served web surface)." : 'No <link rel="alternate" type="text/markdown"> was found.') | ||
| ]; | ||
@@ -400,0 +436,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; headers?: Record<string, string> }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n wellKnown: Endpoint; openapi: Endpoint; agentsPage: Endpoint;\n // is-agentic-parity signals (URL targets only)\n notFound: Endpoint; homeMarkdown: Endpoint; homeAsAgent: 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 // is-agentic-parity web signals — na for CLI/dir targets, low weight\n 'soft-404': 5, 'markdown-negotiation': 5, 'content-without-js': 5,\n 'org-schema': 5, 'crawler-reachable': 5, 'rate-limit-headers': 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 'soft-404': 'Return a real HTTP 404 (or 410) for unknown paths — never a 200 with your app shell, which tells agents every path exists.',\n 'markdown-negotiation': 'Serve text/markdown on `Accept: text/markdown` and add `Accept` to the Vary header (Vary: Accept, Accept-Encoding) so CDNs key the variants apart.',\n 'content-without-js': 'Server-side render the homepage so crawlers without JS see an <h1> and 500+ characters of real text.',\n 'org-schema': 'Add Organization JSON-LD with both contactPoint (email/phone + contactType) and address (PostalAddress).',\n 'crawler-reachable': 'Let major agent User-Agents (GPTBot, ClaudeBot, ora-agent, ...) reach the homepage. Narrow WAF/bot rules that block them.',\n 'rate-limit-headers': 'Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle.',\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 notFound: { status: 404, contentType: '', text: '' }, homeMarkdown: { status: 404, contentType: '', text: '' }, homeAsAgent: { 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, init?: RequestInit): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000), ...init });\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => { headers[key.toLowerCase()] = value; });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text(), headers };\n } catch { return { status: 0, contentType: '', text: '', headers: {} }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n // A path no real site serves — used to detect soft-404s (200 + app shell).\n const missingPath = `${base}/aigentify-probe-${'x'.repeat(8)}-404`;\n const [agents, server, mcp, home, llms, sitemap, wellKnown, wellKnownCard, openapi, agentsPage,\n notFound, homeMarkdown, homeAsAgent] = 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 fetchText(fetcher, missingPath),\n fetchText(fetcher, base, { headers: { accept: 'text/markdown' } }),\n fetchText(fetcher, base, { headers: { 'user-agent': 'ora-agent' } }),\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,\n notFound, homeMarkdown, homeAsAgent,\n 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 looksMarkdown(endpoint: Endpoint): boolean {\n const varyAccept = /(^|,)\\s*accept\\s*($|,)/i.test(endpoint.headers?.vary ?? '');\n return ok(endpoint.status) && /text\\/markdown/i.test(endpoint.contentType) && varyAccept;\n}\n\nfunction hasBodyContent(html: string): boolean {\n const stripped = html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n .replace(/<!--[\\s\\S]*?-->/g, '');\n const hasH1 = /<h1[\\s>]/i.test(stripped);\n const textOnly = stripped.replace(/<[^>]+>/g, ' ').replace(/\\s+/g, ' ').trim();\n return hasH1 && textOnly.length >= 500;\n}\n\nfunction collectJsonLdNodes(value: unknown): Record<string, unknown>[] {\n if (Array.isArray(value)) return value.flatMap(collectJsonLdNodes);\n if (value && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n const graph = record['@graph'];\n return Array.isArray(graph) ? graph.flatMap(collectJsonLdNodes) : [record];\n }\n return [];\n}\n\nfunction isMeaningfulValue(value: unknown): boolean {\n if (value === null || value === undefined) return false;\n if (typeof value === 'string') return value.trim().length > 0;\n if (typeof value === 'object') return Object.keys(value as Record<string, unknown>).length > 0;\n return true;\n}\n\nfunction isOrganizationNode(node: Record<string, unknown>): boolean {\n const type = node['@type'];\n return type === 'Organization' || (Array.isArray(type) && type.includes('Organization'));\n}\n\nfunction orgSchemaStatus(html: string): 'pass' | 'warn' {\n const blocks = [...html.matchAll(/<script[^>]*application\\/ld\\+json[^>]*>([\\s\\S]*?)<\\/script>/gi)].map(m => m[1]);\n const nodes = blocks.flatMap(block => {\n try { return collectJsonLdNodes(JSON.parse(block)); } catch { return []; }\n });\n const orgNodes = nodes.filter(isOrganizationNode);\n if (!orgNodes.length) return 'warn';\n return orgNodes.some(node => isMeaningfulValue(node.contactPoint) && isMeaningfulValue(node.address)) ? 'pass' : 'warn';\n}\n\nfunction looksLikeHomepage(agentResponse: Endpoint, home: Endpoint): boolean {\n if (!ok(agentResponse.status)) return false;\n if (/captcha|access denied|are you a (?:human|robot)|checking your browser|request blocked/i.test(agentResponse.text)) return false;\n if (!ok(home.status) || !home.text.trim()) return agentResponse.text.trim().length > 0;\n return agentResponse.text.length >= home.text.length * 0.5;\n}\n\nfunction hasRateLimitHeaders(endpoints: Endpoint[]): boolean {\n return endpoints.some(endpoint => {\n if (!ok(endpoint.status)) return false;\n const keys = Object.keys(endpoint.headers ?? {});\n const has = (name: string) => keys.some(key => new RegExp(`^(x-)?ratelimit-${name}$`, 'i').test(key));\n return has('limit') && has('remaining') && has('reset');\n });\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 // is-agentic-parity signals: URL-only. na for directories or total network failure.\n const urlOnly = snapshot.isUrl && !snapshot.networkFailure;\n const soft404Status: AuditStatus = !urlOnly ? 'na'\n : snapshot.notFound.status === 404 || snapshot.notFound.status === 410 ? 'pass'\n : ok(snapshot.notFound.status) ? 'fail'\n : 'warn';\n const markdownStatus: AuditStatus = !urlOnly ? 'na' : looksMarkdown(snapshot.homeMarkdown) ? 'pass' : 'warn';\n const contentStatus: AuditStatus = !urlOnly ? 'na' : !ok(snapshot.home.status) ? 'warn' : hasBodyContent(snapshot.home.text) ? 'pass' : 'warn';\n const orgStatus: AuditStatus = !urlOnly ? 'na' : !ok(snapshot.home.status) ? 'warn' : orgSchemaStatus(snapshot.home.text);\n const crawlerStatus: AuditStatus = !urlOnly ? 'na' : looksLikeHomepage(snapshot.homeAsAgent, snapshot.home) ? 'pass' : 'warn';\n const rateLimitStatus: AuditStatus = !urlOnly ? 'na' : hasRateLimitHeaders([snapshot.openapi, snapshot.server, snapshot.home]) ? 'pass' : 'warn';\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 check('soft-404', soft404Status, soft404Status === 'pass' ? 'Unknown paths return a real 404.' : soft404Status === 'na' ? 'Not audited (no served web surface).' : soft404Status === 'warn' ? 'The 404 probe was inconclusive (no response, or a non-404/410 error status).' : 'Unknown paths return 200 with the app shell (soft-404).'),\n check('markdown-negotiation', markdownStatus, markdownStatus === 'pass' ? 'The homepage serves text/markdown with Vary: Accept.' : markdownStatus === 'na' ? 'Not audited (no served web surface).' : 'The homepage does not serve markdown on Accept: text/markdown with a Vary: Accept header.'),\n check('content-without-js', contentStatus, contentStatus === 'pass' ? 'The homepage renders an H1 and substantial text without JS.' : contentStatus === 'na' ? 'Not audited (no served web surface).' : 'The homepage lacks an H1 or enough server-rendered text.'),\n check('org-schema', orgStatus, orgStatus === 'pass' ? 'Organization JSON-LD includes contactPoint and address.' : orgStatus === 'na' ? 'Not audited (no served web surface).' : 'Organization JSON-LD is missing or lacks contactPoint/address.'),\n check('crawler-reachable', crawlerStatus, crawlerStatus === 'pass' ? 'The homepage is reachable by an agent User-Agent.' : crawlerStatus === 'na' ? 'Not audited (no served web surface).' : 'An agent User-Agent could not reach the homepage.'),\n check('rate-limit-headers', rateLimitStatus, rateLimitStatus === 'pass' ? 'Standard rate-limit headers are present.' : rateLimitStatus === 'na' ? 'Not audited (no served web surface).' : 'No RateLimit-* headers were found on probed endpoints.'),\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.2.0\",\n \"mcpName\": \"io.github.pooriaarab/aigentify\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\n \"aigentify\": \"dist/cli.js\",\n \"aigentify-mcp\": \"dist/mcp.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"\n },\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\n \"agents\",\n \"agentification\",\n \"mcp\",\n \"ai\",\n \"json-ld\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\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\": {\n \"node\": \">=20\"\n },\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; headers?: Record<string, string> }\ninterface Snapshot {\n agents: Endpoint; server: Endpoint; mcp: Endpoint; home: Endpoint; llms: Endpoint; sitemap: Endpoint;\n wellKnown: Endpoint; openapi: Endpoint; agentsPage: Endpoint;\n // is-agentic-parity signals (URL targets only)\n notFound: Endpoint; homeMarkdown: Endpoint; homeAsAgent: Endpoint;\n // Ora-parity round 2 (URL targets only)\n authMd: Endpoint; apiCatalog: Endpoint; agentCard: 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 // is-agentic-parity web signals — na for CLI/dir targets, low weight\n 'soft-404': 5, 'markdown-negotiation': 5, 'content-without-js': 5,\n 'org-schema': 5, 'crawler-reachable': 5, 'rate-limit-headers': 5,\n // Ora-parity round 2 web signals\n 'auth-md': 5, 'api-catalog': 5, 'agent-card-a2a': 5, 'link-headers': 5, 'markdown-alt': 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 'soft-404': 'Return a real HTTP 404 (or 410) for unknown paths — never a 200 with your app shell, which tells agents every path exists.',\n 'markdown-negotiation': 'Serve text/markdown on `Accept: text/markdown` and add `Accept` to the Vary header (Vary: Accept, Accept-Encoding) so CDNs key the variants apart.',\n 'content-without-js': 'Server-side render the homepage so crawlers without JS see an <h1> and 500+ characters of real text.',\n 'org-schema': 'Add Organization JSON-LD with both contactPoint (email/phone + contactType) and address (PostalAddress).',\n 'crawler-reachable': 'Let major agent User-Agents (GPTBot, ClaudeBot, ora-agent, ...) reach the homepage. Narrow WAF/bot rules that block them.',\n 'rate-limit-headers': 'Return standard RateLimit-Limit/RateLimit-Remaining/RateLimit-Reset headers (plus Retry-After on 429) so agents can self-throttle.',\n 'auth-md': 'Publish /auth.md — a markdown guide describing how an agent authenticates (API key or OAuth) and where to get credentials.',\n 'api-catalog': 'Publish /.well-known/api-catalog (RFC 9727 linkset) pointing agents at your OpenAPI spec(s) and API docs.',\n 'agent-card-a2a': 'Publish /.well-known/agent-card.json (A2A agent card) with at least name and url so A2A clients can discover the agent.',\n 'link-headers': 'Return RFC 8288 Link headers on the homepage pointing at llms.txt, openapi.json, and the agent card so agents discover descriptors without parsing HTML.',\n 'markdown-alt': 'Add a <link rel=\"alternate\" type=\"text/markdown\"> to the homepage so agents can find the markdown representation.',\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 notFound: { status: 404, contentType: '', text: '' }, homeMarkdown: { status: 404, contentType: '', text: '' }, homeAsAgent: { status: 404, contentType: '', text: '' },\n authMd: { status: 404, contentType: '', text: '' }, apiCatalog: { status: 404, contentType: '', text: '' }, agentCard: { 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, init?: RequestInit): Promise<Endpoint> {\n try {\n const response = await fetcher(url, { signal: AbortSignal.timeout(8000), ...init });\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => { headers[key.toLowerCase()] = value; });\n return { status: response.status, contentType: response.headers.get('content-type') ?? '', text: await response.text(), headers };\n } catch { return { status: 0, contentType: '', text: '', headers: {} }; }\n}\n\nasync function urlSnapshot(target: string, fetcher: typeof globalThis.fetch): Promise<Snapshot> {\n const base = target.replace(/\\/+$/, '');\n // A path no real site serves — used to detect soft-404s (200 + app shell).\n const missingPath = `${base}/aigentify-probe-${'x'.repeat(8)}-404`;\n const [agents, server, mcp, home, llms, sitemap, wellKnown, wellKnownCard, openapi, agentsPage,\n notFound, homeMarkdown, homeAsAgent, authMd, apiCatalog] = 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 fetchText(fetcher, missingPath),\n fetchText(fetcher, base, { headers: { accept: 'text/markdown' } }),\n fetchText(fetcher, base, { headers: { 'user-agent': 'ora-agent' } }),\n fetchText(fetcher, `${base}/auth.md`),\n fetchText(fetcher, `${base}/.well-known/api-catalog`),\n ]);\n // agent-card.json is the same URL as the well-known probe above — reuse the response instead of fetching twice.\n const agentCard = wellKnownCard;\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,\n notFound, homeMarkdown, homeAsAgent, authMd, apiCatalog, agentCard,\n 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 looksMarkdown(endpoint: Endpoint): boolean {\n const varyAccept = /(^|,)\\s*accept\\s*($|,)/i.test(endpoint.headers?.vary ?? '');\n return ok(endpoint.status) && /text\\/markdown/i.test(endpoint.contentType) && varyAccept;\n}\n\nfunction hasBodyContent(html: string): boolean {\n const stripped = html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n .replace(/<!--[\\s\\S]*?-->/g, '');\n const hasH1 = /<h1[\\s>]/i.test(stripped);\n const textOnly = stripped.replace(/<[^>]+>/g, ' ').replace(/\\s+/g, ' ').trim();\n return hasH1 && textOnly.length >= 500;\n}\n\nfunction collectJsonLdNodes(value: unknown): Record<string, unknown>[] {\n if (Array.isArray(value)) return value.flatMap(collectJsonLdNodes);\n if (value && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n const graph = record['@graph'];\n return Array.isArray(graph) ? graph.flatMap(collectJsonLdNodes) : [record];\n }\n return [];\n}\n\nfunction isMeaningfulValue(value: unknown): boolean {\n if (value === null || value === undefined) return false;\n if (typeof value === 'string') return value.trim().length > 0;\n if (typeof value === 'object') return Object.keys(value as Record<string, unknown>).length > 0;\n return true;\n}\n\nfunction isOrganizationNode(node: Record<string, unknown>): boolean {\n const type = node['@type'];\n return type === 'Organization' || (Array.isArray(type) && type.includes('Organization'));\n}\n\nfunction orgSchemaStatus(html: string): 'pass' | 'warn' {\n const blocks = [...html.matchAll(/<script[^>]*application\\/ld\\+json[^>]*>([\\s\\S]*?)<\\/script>/gi)].map(m => m[1]);\n const nodes = blocks.flatMap(block => {\n try { return collectJsonLdNodes(JSON.parse(block)); } catch { return []; }\n });\n const orgNodes = nodes.filter(isOrganizationNode);\n if (!orgNodes.length) return 'warn';\n return orgNodes.some(node => isMeaningfulValue(node.contactPoint) && isMeaningfulValue(node.address)) ? 'pass' : 'warn';\n}\n\nfunction looksLikeHomepage(agentResponse: Endpoint, home: Endpoint): boolean {\n if (!ok(agentResponse.status)) return false;\n if (/captcha|access denied|are you a (?:human|robot)|checking your browser|request blocked/i.test(agentResponse.text)) return false;\n if (!ok(home.status) || !home.text.trim()) return agentResponse.text.trim().length > 0;\n return agentResponse.text.length >= home.text.length * 0.5;\n}\n\nfunction hasRateLimitHeaders(endpoints: Endpoint[]): boolean {\n return endpoints.some(endpoint => {\n if (!ok(endpoint.status)) return false;\n const keys = Object.keys(endpoint.headers ?? {});\n const has = (name: string) => keys.some(key => new RegExp(`^(x-)?ratelimit-${name}$`, 'i').test(key));\n return has('limit') && has('remaining') && has('reset');\n });\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 // is-agentic-parity signals: URL-only. na for directories or total network failure.\n const urlOnly = snapshot.isUrl && !snapshot.networkFailure;\n const soft404Status: AuditStatus = !urlOnly ? 'na'\n : snapshot.notFound.status === 404 || snapshot.notFound.status === 410 ? 'pass'\n : ok(snapshot.notFound.status) ? 'fail'\n : 'warn';\n const markdownStatus: AuditStatus = !urlOnly ? 'na' : looksMarkdown(snapshot.homeMarkdown) ? 'pass' : 'warn';\n const contentStatus: AuditStatus = !urlOnly ? 'na' : !ok(snapshot.home.status) ? 'warn' : hasBodyContent(snapshot.home.text) ? 'pass' : 'warn';\n const orgStatus: AuditStatus = !urlOnly ? 'na' : !ok(snapshot.home.status) ? 'warn' : orgSchemaStatus(snapshot.home.text);\n const crawlerStatus: AuditStatus = !urlOnly ? 'na' : looksLikeHomepage(snapshot.homeAsAgent, snapshot.home) ? 'pass' : 'warn';\n const rateLimitStatus: AuditStatus = !urlOnly ? 'na' : hasRateLimitHeaders([snapshot.openapi, snapshot.server, snapshot.home]) ? 'pass' : 'warn';\n const authMdStatus: AuditStatus = !urlOnly ? 'na'\n : ok(snapshot.authMd.status) && snapshot.authMd.text.trim().length > 0\n && (/text\\/markdown/i.test(snapshot.authMd.contentType) || snapshot.authMd.text.trimStart().startsWith('#')) ? 'pass' : 'warn';\n const apiCatalogStatus: AuditStatus = !urlOnly ? 'na'\n : ok(snapshot.apiCatalog.status) && Array.isArray(parseJson(snapshot.apiCatalog.text)?.linkset) ? 'pass' : 'warn';\n const agentCardStatus: AuditStatus = !urlOnly ? 'na' : (() => {\n if (!ok(snapshot.agentCard.status)) return 'warn';\n const card = parseJson(snapshot.agentCard.text);\n return card && typeof card.name === 'string' && card.name.trim().length > 0\n && typeof card.url === 'string' && card.url.trim().length > 0 ? 'pass' : 'warn';\n })();\n const linkHeadersStatus: AuditStatus = !urlOnly ? 'na'\n : /llms\\.txt|openapi\\.json|agent-card|\\.well-known/i.test(snapshot.home.headers?.link ?? '') ? 'pass' : 'warn';\n const markdownAltStatus: AuditStatus = !urlOnly ? 'na'\n : [...snapshot.home.text.matchAll(/<link\\b[^>]*>/gi)].some(([tag]) =>\n /rel=[\"']?alternate[\"']?/i.test(tag) && /type=[\"']?text\\/markdown/i.test(tag)) ? 'pass' : 'warn';\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 check('soft-404', soft404Status, soft404Status === 'pass' ? 'Unknown paths return a real 404.' : soft404Status === 'na' ? 'Not audited (no served web surface).' : soft404Status === 'warn' ? 'The 404 probe was inconclusive (no response, or a non-404/410 error status).' : 'Unknown paths return 200 with the app shell (soft-404).'),\n check('markdown-negotiation', markdownStatus, markdownStatus === 'pass' ? 'The homepage serves text/markdown with Vary: Accept.' : markdownStatus === 'na' ? 'Not audited (no served web surface).' : 'The homepage does not serve markdown on Accept: text/markdown with a Vary: Accept header.'),\n check('content-without-js', contentStatus, contentStatus === 'pass' ? 'The homepage renders an H1 and substantial text without JS.' : contentStatus === 'na' ? 'Not audited (no served web surface).' : 'The homepage lacks an H1 or enough server-rendered text.'),\n check('org-schema', orgStatus, orgStatus === 'pass' ? 'Organization JSON-LD includes contactPoint and address.' : orgStatus === 'na' ? 'Not audited (no served web surface).' : 'Organization JSON-LD is missing or lacks contactPoint/address.'),\n check('crawler-reachable', crawlerStatus, crawlerStatus === 'pass' ? 'The homepage is reachable by an agent User-Agent.' : crawlerStatus === 'na' ? 'Not audited (no served web surface).' : 'An agent User-Agent could not reach the homepage.'),\n check('rate-limit-headers', rateLimitStatus, rateLimitStatus === 'pass' ? 'Standard rate-limit headers are present.' : rateLimitStatus === 'na' ? 'Not audited (no served web surface).' : 'No RateLimit-* headers were found on probed endpoints.'),\n check('auth-md', authMdStatus, authMdStatus === 'pass' ? '/auth.md is available.' : authMdStatus === 'na' ? 'Not audited (no served web surface).' : 'No /auth.md agent-auth guide was found.'),\n check('api-catalog', apiCatalogStatus, apiCatalogStatus === 'pass' ? '/.well-known/api-catalog is available.' : apiCatalogStatus === 'na' ? 'Not audited (no served web surface).' : 'No /.well-known/api-catalog (RFC 9727) was found.'),\n check('agent-card-a2a', agentCardStatus, agentCardStatus === 'pass' ? 'An A2A agent-card.json is available.' : agentCardStatus === 'na' ? 'Not audited (no served web surface).' : 'No valid /.well-known/agent-card.json (A2A) was found.'),\n check('link-headers', linkHeadersStatus, linkHeadersStatus === 'pass' ? 'The homepage returns RFC 8288 Link headers.' : linkHeadersStatus === 'na' ? 'Not audited (no served web surface).' : 'No Link header was found on the homepage.'),\n check('markdown-alt', markdownAltStatus, markdownAltStatus === 'pass' ? 'The homepage advertises a markdown alternate link.' : markdownAltStatus === 'na' ? 'Not audited (no served web surface).' : 'No <link rel=\"alternate\" type=\"text/markdown\"> 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.3.0\",\n \"mcpName\": \"io.github.pooriaarab/aigentify\",\n \"description\": \"Audit and generate agent-native product surfaces\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"bin\": {\n \"aigentify\": \"dist/cli.js\",\n \"aigentify-mcp\": \"dist/mcp.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/pooriaarab/aigentify.git\"\n },\n \"homepage\": \"https://github.com/pooriaarab/aigentify\",\n \"bugs\": \"https://github.com/pooriaarab/aigentify/issues\",\n \"keywords\": [\n \"agents\",\n \"agentification\",\n \"mcp\",\n \"ai\",\n \"json-ld\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\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\": {\n \"node\": \">=20\"\n },\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.2.0", | ||
| "version": "0.3.0", | ||
| "mcpName": "io.github.pooriaarab/aigentify", | ||
@@ -5,0 +5,0 @@ "description": "Audit and generate agent-native product surfaces", |
+2
-1
@@ -65,3 +65,4 @@ # aigentify | ||
| (agent User-Agents can reach the homepage), and `rate-limit-headers` (standard | ||
| `RateLimit-*` headers). | ||
| `RateLimit-*` headers), plus `auth-md`, `api-catalog` (RFC 9727), | ||
| `agent-card-a2a` (A2A), `link-headers` (RFC 8288), and `markdown-alt`. | ||
@@ -68,0 +69,0 @@ ## Configuration |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
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.
556634
10.76%3959
5.77%87
1.16%