New:Socket for Asana Is Now Available.Learn more
Get Started

aigentify

Package Overview
Dependencies
Maintainers
1
Versions
7
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

aigentify - npm Package Compare versions

Comparing version
0.2.0
to
0.3.0
+42
-6
dist/cli.cjs

@@ -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 @@ }

@@ -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 @@ }

@@ -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

@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,sBAAwC;AACxC,uBAAiB;;;ACDjB;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,SAAW;AAAA,EACX,aAAe;AAAA,EACf,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,KAAO;AAAA,IACL,WAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,SAAW;AAAA,IACT,KAAK;AAAA,MACH,OAAS;AAAA,MACT,QAAU;AAAA,MACV,SAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP;AAAA,EACF;AAAA,EACA,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,EACT;AAAA,EACA,UAAY;AAAA,EACZ,MAAQ;AAAA,EACR,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,eAAiB;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,WAAa;AAAA,IACb,QAAU;AAAA,IACV,gBAAkB;AAAA,EACpB;AAAA,EACA,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AAAA,EACA,cAAgB;AAAA,IACd,6BAA6B;AAAA,IAC7B,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,EACT;AAAA,EACA,iBAAmB;AAAA,IACjB,eAAe;AAAA,IACf,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,QAAU;AAAA,EACZ;AACF;;;AC3DO,IAAM,WAAW,gBAAI;AACrB,IAAM,UAAU,gBAAI;AACpB,IAAM,kBAAkB,GAAG,QAAQ;AACnC,IAAM,oBAAoB;AAE1B,IAAM,mBAAmB;;;AFchC,SAAS,GAAG,QAAyB;AAAE,SAAO,UAAU,OAAO,SAAS;AAAK;AAE7E,IAAM,UAAU,oBAAI,IAAI,CAAC,QAAQ,gBAAgB,QAAQ,YAAY,SAAS,mBAAmB,CAAC;AAClG,IAAM,UAAkC;AAAA,EACtC,aAAa;AAAA,EAAI,yBAAyB;AAAA,EAAI,eAAe;AAAA,EAAI,KAAK;AAAA,EACtE,gBAAgB;AAAA,EAAI,gBAAgB;AAAA,EAAI,YAAY;AAAA,EAAI,SAAS;AAAA;AAAA,EAEjE,oBAAoB;AAAA,EAAG,SAAS;AAAA,EAAG,eAAe;AAAA;AAAA,EAElD,YAAY;AAAA,EAAG,wBAAwB;AAAA,EAAG,sBAAsB;AAAA,EAChE,cAAc;AAAA,EAAG,qBAAqB;AAAA,EAAG,sBAAsB;AAAA;AAAA,EAE/D,WAAW;AAAA,EAAG,eAAe;AAAA,EAAG,kBAAkB;AAAA,EAAG,gBAAgB;AAAA,EAAG,gBAAgB;AAC1F;AACA,IAAM,QAAgC;AAAA,EACpC,aAAa;AAAA,EACb,yBAAyB;AAAA,EACzB,eAAe,yCAAyC,iBAAiB;AAAA,EACzE,KAAK;AAAA,EACL,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,SAAS;AAAA,EACT,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,WAAW;AAAA,EACX,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,gBAAgB;AAClB;AAEA,SAAS,MAAM,IAAY,QAAqB,MAA0B;AAAE,SAAO,EAAE,IAAI,QAAQ,MAAM,QAAQ,QAAQ,EAAE,EAAE;AAAG;AAEvH,SAAS,iBAAiB,QAA8B;AAC7D,QAAM,WAAW,OAAO,OAAO,UAAQ,KAAK,WAAW,IAAI;AAC3D,QAAM,QAAQ,SAAS,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,QAAQ,CAAC;AACjE,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,SAAS,SAAS,OAAO,CAAC,KAAK,SAAS,OAAO,KAAK,WAAW,SAAS,KAAK,SAAS,KAAK,WAAW,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC;AAC5I,SAAO,KAAK,MAAO,SAAS,QAAS,GAAG;AAC1C;AAEA,eAAe,UAAU,WAAsC;AAC7D,QAAM,UAAU,UAAM,yBAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AAChE,QAAM,QAAkB,CAAC;AACzB,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,YAAY,KAAK,CAAC,QAAQ,IAAI,MAAM,IAAI,EAAG,OAAM,KAAK,GAAG,MAAM,UAAU,iBAAAA,QAAK,KAAK,WAAW,MAAM,IAAI,CAAC,CAAC;AAAA,aAC3G,MAAM,OAAO,EAAG,OAAM,KAAK,iBAAAA,QAAK,KAAK,WAAW,MAAM,IAAI,CAAC;AAAA,EACtE;AACA,SAAO;AACT;AAEA,eAAe,SAAS,MAA2C;AACjE,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI;AAAE,WAAO,UAAM,0BAAS,MAAM,MAAM;AAAA,EAAG,QAAQ;AAAE,WAAO;AAAA,EAAI;AAClE;AAEA,SAAS,SAAS,OAAiB,MAAkC;AACnE,SAAO,MAAM,KAAK,UAAQ;AACxB,UAAM,aAAa,KAAK,WAAW,MAAM,GAAG;AAC5C,WAAO,iBAAAA,QAAK,SAAS,UAAU,MAAM,QAAQ,WAAW,SAAS,IAAI,IAAI,WAAW;AAAA,EACtF,CAAC;AACH;AAEA,SAAS,UAAU,MAAmD;AACpE,MAAI;AACF,UAAM,QAAiB,KAAK,MAAM,IAAI;AACtC,WAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAAI,QAAmC;AAAA,EAC1G,QAAQ;AAAE,WAAO;AAAA,EAAW;AAC9B;AAEA,SAAS,YAAY,MAAkD;AACrE,QAAM,QAAQ,UAAU,IAAI;AAC5B,MAAI,CAAC,MAAO,QAAO,EAAE,OAAO,OAAO,QAAQ,iCAAiC;AAC5E,MAAI,OAAO,MAAM,YAAY,YAAY,CAAC,iBAAiB,KAAK,MAAM,OAAO,EAAG,QAAO,EAAE,OAAO,OAAO,QAAQ,kEAAkE,iBAAiB,oCAAoC;AACtO,QAAM,UAAU,CAAC,QAAQ,eAAe,cAAc,SAAS,EAAE,OAAO,SAAO,CAAC,MAAM,GAAG,CAAC;AAC1F,MAAI,QAAQ,OAAQ,QAAO,EAAE,OAAO,OAAO,QAAQ,2BAA2B,QAAQ,KAAK,IAAI,CAAC,IAAI;AACpG,MAAI,CAAC,MAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,QAAQ,MAAM,QAAQ,EAAG,QAAO,EAAE,OAAO,OAAO,QAAQ,iDAAiD;AACrJ,SAAO,EAAE,OAAO,MAAM,QAAQ,oDAAoD;AACpF;AAEA,SAAS,SAAS,OAA0B;AAC1C,SAAO,MAAM,KAAK,UAAQ,yBAAyB,KAAK,IAAI,KAAK,uCAAuC,KAAK,IAAI,KAAK,eAAe,KAAK,IAAI,CAAC;AACjJ;AAEA,SAAS,WAAW,MAAuB;AACzC,SAAO,sFAAsF,KAAK,IAAI;AACxG;AAEA,SAAS,WAAW,MAAuB;AACzC,SAAO,EAAE,WAAW,KAAK,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,gBAAgB,KAAK,IAAI,KAAK,mBAAmB,KAAK,IAAI,KAAK,iBAAiB,KAAK,IAAI,KAAK,gBAAgB,KAAK,IAAI,KAAK,qBAAqB,KAAK,IAAI,KAAK,mBAAmB,KAAK,IAAI;AACzP;AAEA,SAAS,WAAW,MAAsB;AACxC,QAAM,QAAQ,kBAAkB,KAAK,IAAI;AACzC,MAAI,CAAC,SAAS,MAAM,UAAU,OAAW,QAAO;AAChD,QAAM,OAAO,KAAK,MAAM,MAAM,KAAK;AACnC,QAAM,cAAc,UAAU,KAAK,KAAK,MAAM,MAAM,CAAC,EAAE,MAAM,CAAC;AAC9D,SAAO,aAAa,UAAU,SAAY,OAAO,KAAK,MAAM,GAAG,MAAM,CAAC,EAAE,SAAS,YAAY,KAAK;AACpG;AAEA,eAAe,kBAAkB,WAAsC;AACrE,QAAM,QAAQ,MAAM,UAAU,SAAS;AACvC,QAAM,aAAa,SAAS,OAAO,WAAW;AAC9C,QAAM,aAAa,SAAS,OAAO,aAAa;AAChD,QAAM,UAAU,MAAM,KAAK,UAAQ,uBAAuB,KAAK,KAAK,WAAW,MAAM,GAAG,CAAC,CAAC;AAC1F,QAAM,cAAc,SAAS,OAAO,cAAc;AAClD,QAAM,cAAc,MAAM,SAAS,WAAW;AAC9C,QAAM,YAAY,yCAAyC,KAAK,WAAW;AAC3E,QAAM,aAAa,MAAM,SAAS,UAAU;AAC5C,QAAM,aAAa,CAAC,YAAY,GAAG,MAAM,QAAQ,IAAI,MAAM,OAAO,UAAQ,kDAAkD,KAAK,IAAI,CAAC,EAAE,IAAI,QAAQ,CAAC,CAAC;AACtJ,QAAM,WAAW,SAAS,OAAO,UAAU;AAC3C,QAAM,cAAc,SAAS,OAAO,aAAa;AACjD,QAAM,aAAa,MAAM,OAAO,UAAQ,iDAAiD,KAAK,IAAI,CAAC;AACnG,QAAM,aAAa,CAAC,WAAW,UAAU,GAAG,GAAG,MAAM,QAAQ,IAAI,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,KAAK,IAAI;AACrG,SAAO;AAAA,IACL,QAAQ,EAAE,QAAQ,aAAa,MAAM,KAAK,aAAa,iBAAiB,MAAM,WAAW;AAAA,IACzF,QAAQ,EAAE,QAAQ,aAAa,MAAM,KAAK,aAAa,oBAAoB,MAAM,MAAM,SAAS,UAAU,EAAE;AAAA,IAC5G,KAAK,EAAE,QAAQ,WAAW,cAAc,YAAY,MAAM,KAAK,aAAa,IAAI,MAAM,GAAG;AAAA,IACzF,MAAM,EAAE,QAAQ,KAAK,aAAa,cAAc,MAAM,WAAW,KAAK,IAAI,EAAE;AAAA,IAC5E,MAAM,EAAE,QAAQ,WAAW,MAAM,KAAK,aAAa,cAAc,MAAM,MAAM,SAAS,QAAQ,EAAE;AAAA,IAChG,SAAS,EAAE,QAAQ,cAAc,MAAM,KAAK,aAAa,mBAAmB,MAAM,MAAM,SAAS,WAAW,EAAE;AAAA;AAAA,IAE9G,WAAW,EAAE,QAAQ,KAAK,aAAa,IAAI,MAAM,GAAG;AAAA,IAAG,SAAS,EAAE,QAAQ,KAAK,aAAa,IAAI,MAAM,GAAG;AAAA,IAAG,YAAY,EAAE,QAAQ,KAAK,aAAa,IAAI,MAAM,GAAG;AAAA,IACjK,UAAU,EAAE,QAAQ,KAAK,aAAa,IAAI,MAAM,GAAG;AAAA,IAAG,cAAc,EAAE,QAAQ,KAAK,aAAa,IAAI,MAAM,GAAG;AAAA,IAAG,aAAa,EAAE,QAAQ,KAAK,aAAa,IAAI,MAAM,GAAG;AAAA,IACtK,QAAQ,EAAE,QAAQ,KAAK,aAAa,IAAI,MAAM,GAAG;AAAA,IAAG,YAAY,EAAE,QAAQ,KAAK,aAAa,IAAI,MAAM,GAAG;AAAA,IAAG,WAAW,EAAE,QAAQ,KAAK,aAAa,IAAI,MAAM,GAAG;AAAA,IAChK;AAAA,IAAY,QAAQ,QAAQ,WAAW,cAAc,SAAS;AAAA,IAAG,gBAAgB;AAAA,IAAO,OAAO;AAAA,EACjG;AACF;AAEA,eAAe,UAAU,SAAkC,KAAa,MAAuC;AAC7G,MAAI;AACF,UAAM,WAAW,MAAM,QAAQ,KAAK,EAAE,QAAQ,YAAY,QAAQ,GAAI,GAAG,GAAG,KAAK,CAAC;AAClF,UAAM,UAAkC,CAAC;AACzC,aAAS,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AAAE,cAAQ,IAAI,YAAY,CAAC,IAAI;AAAA,IAAO,CAAC;AAChF,WAAO,EAAE,QAAQ,SAAS,QAAQ,aAAa,SAAS,QAAQ,IAAI,cAAc,KAAK,IAAI,MAAM,MAAM,SAAS,KAAK,GAAG,QAAQ;AAAA,EAClI,QAAQ;AAAE,WAAO,EAAE,QAAQ,GAAG,aAAa,IAAI,MAAM,IAAI,SAAS,CAAC,EAAE;AAAA,EAAG;AAC1E;AAEA,eAAe,YAAY,QAAgB,SAAqD;AAC9F,QAAM,OAAO,OAAO,QAAQ,QAAQ,EAAE;AAEtC,QAAM,cAAc,GAAG,IAAI,oBAAoB,IAAI,OAAO,CAAC,CAAC;AAC5D,QAAM;AAAA,IAAC;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAK;AAAA,IAAM;AAAA,IAAM;AAAA,IAAS;AAAA,IAAW;AAAA,IAAe;AAAA,IAAS;AAAA,IAClF;AAAA,IAAU;AAAA,IAAc;AAAA,IAAa;AAAA,IAAQ;AAAA,EAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC7E,UAAU,SAAS,GAAG,IAAI,YAAY;AAAA,IAAG,UAAU,SAAS,GAAG,IAAI,cAAc;AAAA,IAAG,UAAU,SAAS,GAAG,IAAI,kBAAkB;AAAA,IAChI,UAAU,SAAS,IAAI;AAAA,IAAG,UAAU,SAAS,GAAG,IAAI,WAAW;AAAA,IAAG,UAAU,SAAS,GAAG,IAAI,cAAc;AAAA,IAC1G,UAAU,SAAS,GAAG,IAAI,yBAAyB;AAAA,IAAG,UAAU,SAAS,GAAG,IAAI,8BAA8B;AAAA,IAC9G,UAAU,SAAS,GAAG,IAAI,eAAe;AAAA,IAAG,UAAU,SAAS,GAAG,IAAI,SAAS;AAAA,IAC/E,UAAU,SAAS,WAAW;AAAA,IAC9B,UAAU,SAAS,MAAM,EAAE,SAAS,EAAE,QAAQ,gBAAgB,EAAE,CAAC;AAAA,IACjE,UAAU,SAAS,MAAM,EAAE,SAAS,EAAE,cAAc,YAAY,EAAE,CAAC;AAAA,IACnE,UAAU,SAAS,GAAG,IAAI,UAAU;AAAA,IACpC,UAAU,SAAS,GAAG,IAAI,0BAA0B;AAAA,EACtD,CAAC;AAED,QAAM,YAAY;AAClB,QAAM,YAAY,CAAC,QAAQ,QAAQ,KAAK,MAAM,MAAM,OAAO;AAE3D,QAAM,KAAK,GAAG,UAAU,MAAM,IAAI,YAAY;AAC9C,SAAO;AAAA,IAAE;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAK;AAAA,IAAM;AAAA,IAAM;AAAA,IAAS,WAAW;AAAA,IAAI;AAAA,IAAS;AAAA,IACzE;AAAA,IAAU;AAAA,IAAc;AAAA,IAAa;AAAA,IAAQ;AAAA,IAAY;AAAA,IACzD,YAAY,CAAC,KAAK,MAAM,WAAW,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI;AAAA,IAAG,QAAQ,OAAO,UAAU,OAAO,OAAO,SAAS,OAAO,IAAI,UAAU,OAAO,IAAI,SAAS;AAAA,IAAK,gBAAgB,UAAU,MAAM,UAAQ,KAAK,WAAW,CAAC;AAAA,IAAG,OAAO;AAAA,EAAK;AACvO;AAEA,SAAS,cAAc,UAA6B;AAClD,QAAM,aAAa,0BAA0B,KAAK,SAAS,SAAS,QAAQ,EAAE;AAC9E,SAAO,GAAG,SAAS,MAAM,KAAK,kBAAkB,KAAK,SAAS,WAAW,KAAK;AAChF;AAEA,SAAS,eAAe,MAAuB;AAC7C,QAAM,WAAW,KACd,QAAQ,+BAA+B,EAAE,EACzC,QAAQ,6BAA6B,EAAE,EACvC,QAAQ,oBAAoB,EAAE;AACjC,QAAM,QAAQ,YAAY,KAAK,QAAQ;AACvC,QAAM,WAAW,SAAS,QAAQ,YAAY,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAC7E,SAAO,SAAS,SAAS,UAAU;AACrC;AAEA,SAAS,mBAAmB,OAA2C;AACrE,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,QAAQ,kBAAkB;AACjE,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,SAAS;AACf,UAAM,QAAQ,OAAO,QAAQ;AAC7B,WAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,kBAAkB,IAAI,CAAC,MAAM;AAAA,EAC3E;AACA,SAAO,CAAC;AACV;AAEA,SAAS,kBAAkB,OAAyB;AAClD,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,KAAK,EAAE,SAAS;AAC5D,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK,KAAgC,EAAE,SAAS;AAC7F,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAwC;AAClE,QAAM,OAAO,KAAK,OAAO;AACzB,SAAO,SAAS,kBAAmB,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,cAAc;AACxF;AAEA,SAAS,gBAAgB,MAA+B;AACtD,QAAM,SAAS,CAAC,GAAG,KAAK,SAAS,+DAA+D,CAAC,EAAE,IAAI,OAAK,EAAE,CAAC,CAAC;AAChH,QAAM,QAAQ,OAAO,QAAQ,WAAS;AACpC,QAAI;AAAE,aAAO,mBAAmB,KAAK,MAAM,KAAK,CAAC;AAAA,IAAG,QAAQ;AAAE,aAAO,CAAC;AAAA,IAAG;AAAA,EAC3E,CAAC;AACD,QAAM,WAAW,MAAM,OAAO,kBAAkB;AAChD,MAAI,CAAC,SAAS,OAAQ,QAAO;AAC7B,SAAO,SAAS,KAAK,UAAQ,kBAAkB,KAAK,YAAY,KAAK,kBAAkB,KAAK,OAAO,CAAC,IAAI,SAAS;AACnH;AAEA,SAAS,kBAAkB,eAAyB,MAAyB;AAC3E,MAAI,CAAC,GAAG,cAAc,MAAM,EAAG,QAAO;AACtC,MAAI,yFAAyF,KAAK,cAAc,IAAI,EAAG,QAAO;AAC9H,MAAI,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC,KAAK,KAAK,KAAK,EAAG,QAAO,cAAc,KAAK,KAAK,EAAE,SAAS;AACrF,SAAO,cAAc,KAAK,UAAU,KAAK,KAAK,SAAS;AACzD;AAEA,SAAS,oBAAoB,WAAgC;AAC3D,SAAO,UAAU,KAAK,cAAY;AAChC,QAAI,CAAC,GAAG,SAAS,MAAM,EAAG,QAAO;AACjC,UAAM,OAAO,OAAO,KAAK,SAAS,WAAW,CAAC,CAAC;AAC/C,UAAM,MAAM,CAAC,SAAiB,KAAK,KAAK,SAAO,IAAI,OAAO,mBAAmB,IAAI,KAAK,GAAG,EAAE,KAAK,GAAG,CAAC;AACpG,WAAO,IAAI,OAAO,KAAK,IAAI,WAAW,KAAK,IAAI,OAAO;AAAA,EACxD,CAAC;AACH;AAEA,SAAS,YAAY,UAAkC;AACrD,QAAM,gBAAgB,SAAS,OAAO,WAAW,OAAO,SAAS,OAAO,KAAK,KAAK,EAAE,SAAS,KAAK,sDAAsD,KAAK,SAAS,OAAO,WAAW;AACxL,QAAM,eAA4B,SAAS,OAAO,WAAW,IAAI,SAAS,gBAAgB,SAAS;AACnG,QAAM,eAA4B,CAAC,gBAAiB,SAAS,OAAO,WAAW,IAAI,SAAS,OAAQ,WAAW,SAAS,OAAO,IAAI,IAAI,SAAS;AAChJ,QAAM,aAAa,SAAS,OAAO,WAAW,MAAM,YAAY,SAAS,OAAO,IAAI,IAAI;AACxF,QAAM,eAA4B,SAAS,OAAO,WAAW,IAAI,SAAS,CAAC,SAAS,SAAS,OAAO,YAAY,QAAQ,SAAS;AACjI,QAAM,YAAyB,SAAS,iBAAiB,SAAS,SAAS,SAAS,SAAS;AAC7F,QAAM,aAAa,CAAC,SAAS,KAAK,MAAM,SAAS,OAAO,IAAI;AAC5D,QAAM,cAA2B,SAAS,KAAK,WAAW,IAAI,SAAS,SAAS,UAAU,IAAI,SAAS;AACvG,QAAM,eAA4B,CAAC,SAAS,UAAU,KAAK,CAAC,gBAAiB,SAAS,KAAK,WAAW,IAAI,SAAS,OAAQ,WAAW,SAAS,UAAU,IAAI,SAAS;AACtK,QAAM,aAA0B,SAAS,KAAK,WAAW,IAAI,SAAS,SAAS,KAAK,UAAU,OAAO,SAAS,KAAK,SAAS,OAAO,SAAS,KAAK,KAAK,KAAK,IAAI,SAAS;AACxK,QAAM,gBAA6B,SAAS,QAAQ,WAAW,IAAI,SAAS,SAAS,QAAQ,UAAU,OAAO,SAAS,QAAQ,SAAS,OAAO,SAAS,QAAQ,KAAK,KAAK,IAAI,SAAS;AAEvL,QAAM,WAAW,CAAC,aAAoC,CAAC,SAAS,SAAS,SAAS,iBAAiB,OAAO,GAAG,SAAS,MAAM,IAAI,SAAS;AACzI,QAAM,kBAAkB,SAAS,SAAS,SAAS;AACnD,QAAM,gBAAgB,SAAS,SAAS,OAAO;AAC/C,QAAM,mBAAmB,SAAS,SAAS,UAAU;AAErD,QAAM,UAAU,SAAS,SAAS,CAAC,SAAS;AAC5C,QAAM,gBAA6B,CAAC,UAAU,OAC1C,SAAS,SAAS,WAAW,OAAO,SAAS,SAAS,WAAW,MAAM,SACvE,GAAG,SAAS,SAAS,MAAM,IAAI,SAC/B;AACJ,QAAM,iBAA8B,CAAC,UAAU,OAAO,cAAc,SAAS,YAAY,IAAI,SAAS;AACtG,QAAM,gBAA6B,CAAC,UAAU,OAAO,CAAC,GAAG,SAAS,KAAK,MAAM,IAAI,SAAS,eAAe,SAAS,KAAK,IAAI,IAAI,SAAS;AACxI,QAAM,YAAyB,CAAC,UAAU,OAAO,CAAC,GAAG,SAAS,KAAK,MAAM,IAAI,SAAS,gBAAgB,SAAS,KAAK,IAAI;AACxH,QAAM,gBAA6B,CAAC,UAAU,OAAO,kBAAkB,SAAS,aAAa,SAAS,IAAI,IAAI,SAAS;AACvH,QAAM,kBAA+B,CAAC,UAAU,OAAO,oBAAoB,CAAC,SAAS,SAAS,SAAS,QAAQ,SAAS,IAAI,CAAC,IAAI,SAAS;AAC1I,QAAM,eAA4B,CAAC,UAAU,OACzC,GAAG,SAAS,OAAO,MAAM,KAAK,SAAS,OAAO,KAAK,KAAK,EAAE,SAAS,MAC/D,kBAAkB,KAAK,SAAS,OAAO,WAAW,KAAK,SAAS,OAAO,KAAK,UAAU,EAAE,WAAW,GAAG,KAAK,SAAS;AAC5H,QAAM,mBAAgC,CAAC,UAAU,OAC7C,GAAG,SAAS,WAAW,MAAM,KAAK,MAAM,QAAQ,UAAU,SAAS,WAAW,IAAI,GAAG,OAAO,IAAI,SAAS;AAC7G,QAAM,kBAA+B,CAAC,UAAU,QAAQ,MAAM;AAC5D,QAAI,CAAC,GAAG,SAAS,UAAU,MAAM,EAAG,QAAO;AAC3C,UAAM,OAAO,UAAU,SAAS,UAAU,IAAI;AAC9C,WAAO,QAAQ,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,KAAK,EAAE,SAAS,KACrE,OAAO,KAAK,QAAQ,YAAY,KAAK,IAAI,KAAK,EAAE,SAAS,IAAI,SAAS;AAAA,EAC7E,GAAG;AACH,QAAM,oBAAiC,CAAC,UAAU,OAC9C,mDAAmD,KAAK,SAAS,KAAK,SAAS,QAAQ,EAAE,IAAI,SAAS;AAC1G,QAAM,oBAAiC,CAAC,UAAU,OAC9C,CAAC,GAAG,SAAS,KAAK,KAAK,SAAS,iBAAiB,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,MAC5D,2BAA2B,KAAK,GAAG,KAAK,4BAA4B,KAAK,GAAG,CAAC,IAAI,SAAS;AAChG,SAAO;AAAA,IACL,MAAM,aAAa,cAAc,gBAAgB,4BAA4B,SAAS,OAAO,WAAW,IAAI,kCAAkC,uBAAuB;AAAA,IACrK,MAAM,yBAAyB,cAAc,iBAAiB,SAAS,yDAAyD,iBAAiB,OAAO,0CAA0C,kDAAkD;AAAA,IACpP,MAAM,eAAe,cAAc,YAAY,QAAQ,WAAW,SAAS,YAAY,WAAW,CAAC,SAAS,SAAS,iCAAiC,0BAA0B;AAAA,IAChL,MAAM,OAAO,WAAW,SAAS,iBAAiB,sCAAsC,SAAS,SAAS,iCAAiC,2BAA2B;AAAA,IACtK,MAAM,gBAAgB,aAAa,gBAAgB,SAAS,gCAAgC,gBAAgB,SAAS,oCAAoC,6BAA6B;AAAA,IACtL,MAAM,gBAAgB,cAAc,iBAAiB,SAAS,sDAAsD,iBAAiB,OAAO,uCAAuC,+DAA+D;AAAA,IAClP,MAAM,YAAY,YAAY,eAAe,SAAS,2BAA2B,eAAe,SAAS,iCAAiC,sBAAsB;AAAA,IAChK,MAAM,WAAW,eAAe,kBAAkB,SAAS,8BAA8B,kBAAkB,SAAS,gCAAgC,yBAAyB;AAAA,IAC7K,MAAM,oBAAoB,iBAAiB,oBAAoB,SAAS,+CAA+C,oBAAoB,OAAO,yCAAyC,gDAAgD;AAAA,IAC3O,MAAM,WAAW,eAAe,kBAAkB,SAAS,+BAA+B,kBAAkB,OAAO,yCAAyC,6BAA6B;AAAA,IACzL,MAAM,eAAe,kBAAkB,qBAAqB,SAAS,kCAAkC,qBAAqB,OAAO,yCAAyC,uCAAuC;AAAA,IACnN,MAAM,YAAY,eAAe,kBAAkB,SAAS,qCAAqC,kBAAkB,OAAO,yCAAyC,kBAAkB,SAAS,iFAAiF,yDAAyD;AAAA,IACxU,MAAM,wBAAwB,gBAAgB,mBAAmB,SAAS,yDAAyD,mBAAmB,OAAO,yCAAyC,2FAA2F;AAAA,IACjS,MAAM,sBAAsB,eAAe,kBAAkB,SAAS,gEAAgE,kBAAkB,OAAO,yCAAyC,0DAA0D;AAAA,IAClQ,MAAM,cAAc,WAAW,cAAc,SAAS,4DAA4D,cAAc,OAAO,yCAAyC,gEAAgE;AAAA,IAChP,MAAM,qBAAqB,eAAe,kBAAkB,SAAS,sDAAsD,kBAAkB,OAAO,yCAAyC,mDAAmD;AAAA,IAChP,MAAM,sBAAsB,iBAAiB,oBAAoB,SAAS,6CAA6C,oBAAoB,OAAO,yCAAyC,wDAAwD;AAAA,IACnP,MAAM,WAAW,cAAc,iBAAiB,SAAS,2BAA2B,iBAAiB,OAAO,yCAAyC,yCAAyC;AAAA,IAC9L,MAAM,eAAe,kBAAkB,qBAAqB,SAAS,2CAA2C,qBAAqB,OAAO,yCAAyC,mDAAmD;AAAA,IACxO,MAAM,kBAAkB,iBAAiB,oBAAoB,SAAS,yCAAyC,oBAAoB,OAAO,yCAAyC,wDAAwD;AAAA,IAC3O,MAAM,gBAAgB,mBAAmB,sBAAsB,SAAS,gDAAgD,sBAAsB,OAAO,yCAAyC,2CAA2C;AAAA,IACzO,MAAM,gBAAgB,mBAAmB,sBAAsB,SAAS,uDAAuD,sBAAsB,OAAO,yCAAyC,2DAA2D;AAAA,EAClQ;AACF;AAEA,eAAsB,YAAY,QAAgB,UAAwB,CAAC,GAAyB;AAClG,QAAM,aAAa,UAAM,sBAAK,MAAM,EAAE,MAAM,MAAM,MAAS;AAC3D,QAAM,WAAW,YAAY,YAAY,IAAI,MAAM,kBAAkB,MAAM,IAAI,MAAM,YAAY,QAAQ,QAAQ,SAAS,WAAW,KAAK;AAC1I,QAAM,SAAS,YAAY,QAAQ;AACnC,QAAM,OAAO,OAAO,OAAO,UAAQ,KAAK,WAAW,UAAU,KAAK,WAAW,MAAM,EAAE,IAAI,WAAS,EAAE,IAAI,KAAK,IAAI,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,EAAE,EAAE,EAAE;AACxJ,SAAO,EAAE,QAAQ,OAAO,iBAAiB,MAAM,GAAG,QAAQ,KAAK;AACjE;AAEO,SAAS,kBAAkB,QAA6B;AAC7D,QAAM,QAAQ,CAAC,GAAG,OAAO,MAAM,KAAK,OAAO,KAAK,QAAQ,EAAE;AAC1D,aAAW,QAAQ,OAAO,OAAQ,OAAM,KAAK,GAAG,KAAK,OAAO,YAAY,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK,EAAE,KAAK,KAAK,IAAI,EAAE;AAC/G,QAAM,KAAK,IAAI,OAAO;AACtB,MAAI,CAAC,OAAO,KAAK,OAAQ,OAAM,KAAK,OAAO;AAAA,MACtC,QAAO,KAAK,QAAQ,CAAC,KAAK,UAAU,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,EAAE,KAAK,IAAI,GAAG,EAAE,CAAC;AAC1F,SAAO,MAAM,KAAK,IAAI;AACxB;;;AGpUO,SAAS,aAAa,QAA0C;AACrE,SAAO,EAAE,GAAG,QAAQ,YAAY,OAAO,WAAW,QAAQ,QAAQ,EAAE,GAAG,SAAS,OAAO,WAAW,QAAQ;AAC5G;AAEO,SAAS,gBAAiC;AAC/C,SAAO,aAAa;AAAA,IAClB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,YAAY;AAAA,EACd,CAAC;AACH;;;AC1BO,SAAS,iBAAiB,QAAiC;AAChE,QAAM,cAAc,OAAO,cAAc;AACzC,QAAM,MAAM,OAAO,UAAU,OAAO,WAAW;AAC/C,QAAM,QAAQ,OAAO;AACrB,QAAM,YAAY,OAAO,UAAU,SAAY,mBAAmB,UAAU,MAAM,iBAAiB,KAAK,IAAI,MAAM,KAAK;AACvH,SAAO,KAAK,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA,EAIvB,OAAO,IAAI,OAAO,OAAO,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAMzB,OAAO,UAAU;AAAA,SACrB,GAAG;AAAA,aACC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBtB,OAAO,eAAe,qBAAqB;AAAA;AAAA,EAE3C,SAAS;AAAA;AAEX;;;AC9CO,SAAS,oBAAoB,QAAyB,YAAY,UAAkB;AACzF,MAAI,cAAc,QAAQ;AACxB,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAeA,OAAO,IAAI;AAAA;AAAA,EAEpB;AACA,SAAO;AAAA;AAAA;AAAA;AAAA,WAIE,OAAO,IAAI;AAAA;AAEtB;;;AC1BO,SAAS,cAAc,QAAiC;AAC7D,QAAM,QAAQ,OAAO,SAAS,CAAC;AAC/B,QAAM,OAAO;AAAA,IACX,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,MAAM,OAAO;AAAA,IACb,aAAa,OAAO;AAAA,IACpB,qBAAqB;AAAA,IACrB,QAAQ,CAAC;AAAA,MACP,SAAS;AAAA,MACT,MAAM,MAAM,QAAQ,GAAG,OAAO,IAAI;AAAA,MAClC,GAAI,MAAM,cAAc,EAAE,aAAa,MAAM,YAAY,IAAI,CAAC;AAAA,MAC9D,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM,KAAK,EAAE;AAAA,MAClE,eAAe,MAAM,iBAAiB;AAAA,IACxC,CAAC;AAAA,EACH;AACA,SAAO,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA;AACzC;;;AChBO,SAAS,mBAAmB,QAAiC;AAClE,QAAM,aAAa,OAAO,KAAK,SAAS,GAAG,IAAI,OAAO,OAAO,wBAAwB,OAAO,KAAK,YAAY,EAAE,QAAQ,kBAAkB,GAAG,CAAC;AAC7I,QAAM,SAAkC;AAAA,IACtC,SAAS;AAAA,IACT,MAAM;AAAA,IACN,aAAa,OAAO;AAAA,IACpB,YAAY,EAAE,KAAK,OAAO,YAAY,QAAQ,SAAS;AAAA,IACvD,SAAS,OAAO,WAAW;AAAA,EAC7B;AACA,MAAI,OAAO,OAAQ,QAAO,UAAU,CAAC,EAAE,MAAM,mBAAmB,KAAK,OAAO,OAAO,CAAC;AAAA,MAC/E,QAAO,WAAW,CAAC,EAAE,cAAc,OAAO,iBAAiB,8BAA8B,YAAY,OAAO,cAAc,aAAa,SAAS,OAAO,WAAW,SAAS,WAAW,EAAE,MAAM,QAAQ,GAAG,aAAa,OAAO,kBAAkB,CAAC,EAAE,MAAM,cAAc,WAAW,cAAc,OAAO,MAAM,CAAC,EAAE,CAAC;AACrT,SAAO,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA;AAC3C;;;ACDA,SAAS,iBAAiB,SAAyB,CAAC,GAAoB;AACtE,QAAM,OAAO,cAAc;AAC3B,SAAO,aAAa,EAAE,GAAG,MAAM,GAAG,QAAQ,OAAO,EAAE,GAAI,KAAK,SAAS,CAAC,GAAI,GAAI,OAAO,SAAS,CAAC,EAAG,EAAE,CAAC;AACvG;AAEO,SAAS,SAAS,UAA6B,SAAyB,CAAC,GAAW;AACzF,QAAM,SAAS,iBAAiB,MAAM;AACtC,MAAI,aAAa,YAAa,QAAO,iBAAiB,MAAM;AAC5D,MAAI,aAAa,cAAe,QAAO,mBAAmB,MAAM;AAChE,MAAI,aAAa,QAAS,QAAO,cAAc,MAAM;AACrD,MAAI,aAAa,eAAgB,QAAO,oBAAoB,QAAQ,OAAO,SAAS;AACpF,QAAM,IAAI,MAAM,qBAAqB,QAAQ,EAAE;AACjD;","names":["path"]}

@@ -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":[]}

@@ -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 +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"]}

@@ -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 +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":[]}
{
"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",

@@ -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