Bunny-Agency-Italy/scripts/generate-llms.mjs
BigMarc 67ea5d48be Initial commit: Bunny Agency Italia (it-IT) marketing site
Italian-market site for the Bunny Agency network, built on the shared
Next.js App Router template with content driven from site-content.json.

- 50 routes: home, 5 services, pricing, FAQ, about/apply/contact,
  32 blog answers and guides, 5 legal pages
- Research-driven Italian copy citing ISTAT, INPS and Agenzia delle Entrate
  (forfettario 15%/5%, ATECO 73.11.03, INPS 26,07%, tassa etica, DAC7)
- 6 long-form guides targeting high-volume Italian creator searches
- "Milanese Editoriale" design system with stats band, editorial article
  layout, creator gallery and footer language switcher to 18 sibling sites
- Full SEO/AEO/GEO: JSON-LD entity graph, hreflang cluster, llms.txt,
  IndexNow, sitemap, AI-crawler-friendly robots
- validate-seo.mjs passes with 0 errors

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 09:00:28 +02:00

31 lines
1.9 KiB
JavaScript

import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
const data = JSON.parse(fs.readFileSync(path.join(root, "src/content/site-content.json"), "utf8"));
const rating = data.site.aggregateRating;
const keyFacts = [
`- Legal entity: ${data.site.legalEntity.name}; founded 2019 by ${data.site.legalEntity.managingDirector}.`,
"- Documented creator results: $0 to $330k in 3.5 months; $2k to $33k/month in 2 months. These are individual case studies, not guarantees.",
`- Independent Trustpilot profile: ${rating.ratingValue}/${rating.bestRating} from ${rating.reviewCount} reviews, checked ${rating.verifiedAt}.`,
"- Commission model: the percentage and calculation base are agreed in writing; there is no universal fixed rate or upfront fee.",
"- Creator control: the creator retains the account, revenue, identity, and data; access and exit terms are documented.",
].join("\n");
const llms = [
`# ${data.site.name}`, "", data.site.description, "", "## Key facts / proof", "", keyFacts, "", "## Pages", "",
...data.pages.filter((page) => page.indexable).map((page) => `- [${page.h1}](${data.site.url}${page.path === "/" ? "" : page.path}): ${page.summary}`),
"", "## Editorial note", "", data.labels.ymyl, "",
].join("\n");
const full = [
`# ${data.site.name} — full answer corpus`, "", "## Key facts / proof", "", keyFacts, "",
...data.pages.filter((page) => page.indexable).flatMap((page) => [
`## ${page.h1}`, "", `URL: ${data.site.url}${page.path === "/" ? "" : page.path}`, "", page.summary, "",
...page.faq.flatMap((faq) => [`### ${faq.question}`, "", faq.answer, ""]),
]),
"## Editorial note", "", data.labels.ymyl, "",
].join("\n");
fs.writeFileSync(path.join(root, "public/llms.txt"), llms);
fs.writeFileSync(path.join(root, "public/llms-full.txt"), full);
console.log(`${data.site.code}: generated llms.txt and llms-full.txt`);