@drowlink/aeo-linter-core 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +8 -7
  2. package/dist/__tests__/assertions.test.d.ts +2 -0
  3. package/dist/__tests__/assertions.test.d.ts.map +1 -0
  4. package/dist/__tests__/assertions.test.js +89 -0
  5. package/dist/__tests__/assertions.test.js.map +1 -0
  6. package/dist/__tests__/audit-contract.test.js +32 -0
  7. package/dist/__tests__/audit-contract.test.js.map +1 -1
  8. package/dist/__tests__/author-eeat-presence.test.d.ts +2 -0
  9. package/dist/__tests__/author-eeat-presence.test.d.ts.map +1 -0
  10. package/dist/__tests__/author-eeat-presence.test.js +137 -0
  11. package/dist/__tests__/author-eeat-presence.test.js.map +1 -0
  12. package/dist/__tests__/fact-citation-density.test.d.ts +2 -0
  13. package/dist/__tests__/fact-citation-density.test.d.ts.map +1 -0
  14. package/dist/__tests__/fact-citation-density.test.js +100 -0
  15. package/dist/__tests__/fact-citation-density.test.js.map +1 -0
  16. package/dist/__tests__/llms-txt.test.d.ts +2 -0
  17. package/dist/__tests__/llms-txt.test.d.ts.map +1 -0
  18. package/dist/__tests__/llms-txt.test.js +108 -0
  19. package/dist/__tests__/llms-txt.test.js.map +1 -0
  20. package/dist/__tests__/runner.test.js +16 -3
  21. package/dist/__tests__/runner.test.js.map +1 -1
  22. package/dist/__tests__/table-list-scannability.test.d.ts +2 -0
  23. package/dist/__tests__/table-list-scannability.test.d.ts.map +1 -0
  24. package/dist/__tests__/table-list-scannability.test.js +97 -0
  25. package/dist/__tests__/table-list-scannability.test.js.map +1 -0
  26. package/dist/audits/ai-accessibility/ai-llms-txt.d.ts +10 -0
  27. package/dist/audits/ai-accessibility/ai-llms-txt.d.ts.map +1 -0
  28. package/dist/audits/ai-accessibility/ai-llms-txt.js +52 -0
  29. package/dist/audits/ai-accessibility/ai-llms-txt.js.map +1 -0
  30. package/dist/audits/content-chunking/table-list-scannability.d.ts +10 -0
  31. package/dist/audits/content-chunking/table-list-scannability.d.ts.map +1 -0
  32. package/dist/audits/content-chunking/table-list-scannability.js +79 -0
  33. package/dist/audits/content-chunking/table-list-scannability.js.map +1 -0
  34. package/dist/audits/direct-answer-density/fact-citation-density.d.ts +10 -0
  35. package/dist/audits/direct-answer-density/fact-citation-density.d.ts.map +1 -0
  36. package/dist/audits/direct-answer-density/fact-citation-density.js +73 -0
  37. package/dist/audits/direct-answer-density/fact-citation-density.js.map +1 -0
  38. package/dist/audits/index.d.ts +5 -1
  39. package/dist/audits/index.d.ts.map +1 -1
  40. package/dist/audits/index.js +9 -1
  41. package/dist/audits/index.js.map +1 -1
  42. package/dist/audits/structured-data/author-eeat-presence.d.ts +10 -0
  43. package/dist/audits/structured-data/author-eeat-presence.d.ts.map +1 -0
  44. package/dist/audits/structured-data/author-eeat-presence.js +87 -0
  45. package/dist/audits/structured-data/author-eeat-presence.js.map +1 -0
  46. package/dist/config/default-config.d.ts.map +1 -1
  47. package/dist/config/default-config.js +19 -11
  48. package/dist/config/default-config.js.map +1 -1
  49. package/dist/gather/gatherers/content-chunks-gatherer.d.ts.map +1 -1
  50. package/dist/gather/gatherers/content-chunks-gatherer.js +8 -0
  51. package/dist/gather/gatherers/content-chunks-gatherer.js.map +1 -1
  52. package/dist/gather/gatherers/direct-answers-gatherer.d.ts.map +1 -1
  53. package/dist/gather/gatherers/direct-answers-gatherer.js +31 -0
  54. package/dist/gather/gatherers/direct-answers-gatherer.js.map +1 -1
  55. package/dist/gather/gatherers/jsonld-gatherer.d.ts +1 -1
  56. package/dist/gather/gatherers/jsonld-gatherer.d.ts.map +1 -1
  57. package/dist/gather/gatherers/jsonld-gatherer.js +89 -6
  58. package/dist/gather/gatherers/jsonld-gatherer.js.map +1 -1
  59. package/dist/gather/gatherers/llms-txt-gatherer.d.ts +11 -0
  60. package/dist/gather/gatherers/llms-txt-gatherer.d.ts.map +1 -0
  61. package/dist/gather/gatherers/llms-txt-gatherer.js +123 -0
  62. package/dist/gather/gatherers/llms-txt-gatherer.js.map +1 -0
  63. package/dist/gather/index.d.ts +1 -0
  64. package/dist/gather/index.d.ts.map +1 -1
  65. package/dist/gather/index.js +1 -0
  66. package/dist/gather/index.js.map +1 -1
  67. package/dist/index.d.ts +1 -0
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +1 -0
  70. package/dist/index.js.map +1 -1
  71. package/dist/runner/assertions.d.ts +25 -0
  72. package/dist/runner/assertions.d.ts.map +1 -0
  73. package/dist/runner/assertions.js +53 -0
  74. package/dist/runner/assertions.js.map +1 -0
  75. package/dist/runner/runner.d.ts.map +1 -1
  76. package/dist/runner/runner.js +5 -1
  77. package/dist/runner/runner.js.map +1 -1
  78. package/dist/types/artifacts.d.ts +64 -0
  79. package/dist/types/artifacts.d.ts.map +1 -1
  80. package/package.json +1 -1
@@ -13,39 +13,43 @@ export const defaultConfig = {
13
13
  description: 'Verifies that AI agents and search crawlers (GPTBot, PerplexityBot, ClaudeBot, Google-Extended, etc.) have unrestricted crawling permissions via robots.txt and HTTP headers.',
14
14
  weight: 25,
15
15
  auditRefs: [
16
- { id: 'ai-robots-txt', weight: 10, group: 'crawling' },
17
- { id: 'ai-x-robots-tag', weight: 8, group: 'crawling' },
18
- { id: 'ai-bot-sitemap', weight: 2, group: 'crawling' },
16
+ { id: 'ai-robots-txt', weight: 9, group: 'crawling' },
17
+ { id: 'ai-x-robots-tag', weight: 7, group: 'crawling' },
18
+ { id: 'ai-bot-sitemap', weight: 3, group: 'crawling' },
19
+ { id: 'ai-llms-txt', weight: 6, group: 'crawling' },
19
20
  ],
20
21
  },
21
22
  'structured-data': {
22
23
  title: 'Structured Data & RAG Schemas',
23
- description: 'Audits JSON-LD schemas optimized for RAG (FAQPage, HowTo, Article, QAPage, sameAs) that enrich LLM knowledge graphs with structured entity data.',
24
+ description: 'Audits JSON-LD schemas optimized for RAG (FAQPage, HowTo, Article, QAPage, sameAs, Author E-E-A-T) that enrich LLM knowledge graphs with structured entity data.',
24
25
  weight: 25,
25
26
  auditRefs: [
26
- { id: 'jsonld-syntax-validity', weight: 8, group: 'schema' },
27
+ { id: 'jsonld-syntax-validity', weight: 7, group: 'schema' },
27
28
  { id: 'rag-schema-presence', weight: 8, group: 'schema' },
28
29
  { id: 'entity-sameas-links', weight: 4, group: 'knowledge-graph' },
30
+ { id: 'author-eeat-presence', weight: 6, group: 'eeat' },
29
31
  ],
30
32
  },
31
33
  'content-chunking': {
32
34
  title: 'Content Chunking & Semantic Structure',
33
- description: 'Evaluates H1-H3 sequential hierarchy, semantic partitioning (<article>, <section>, <main>), and token density per block for optimal RAG embedding extraction.',
35
+ description: 'Evaluates H1-H3 sequential hierarchy, semantic partitioning (<article>, <section>, <main>), token density, and structured tables/lists for optimal RAG embedding extraction.',
34
36
  weight: 25,
35
37
  auditRefs: [
36
- { id: 'heading-hierarchy', weight: 8, group: 'structure' },
38
+ { id: 'heading-hierarchy', weight: 7, group: 'structure' },
37
39
  { id: 'semantic-containers', weight: 6, group: 'structure' },
38
40
  { id: 'chunk-token-density', weight: 6, group: 'embeddings' },
41
+ { id: 'table-list-scannability', weight: 6, group: 'structure' },
39
42
  ],
40
43
  },
41
44
  'direct-answer-density': {
42
- title: 'Direct Answer Density',
43
- description: 'Detects concise, direct definitions and answers to key user questions, optimizing extraction for Answer Engines (Perplexity, SearchGPT, AI Overviews).',
45
+ title: 'Direct Answer Density & Fact Grounding',
46
+ description: 'Detects concise direct answers, clear definitions, and verifiable facts/citations that optimize extraction for Answer Engines (Perplexity, SearchGPT, AI Overviews).',
44
47
  weight: 25,
45
48
  auditRefs: [
46
- { id: 'direct-definition-answering', weight: 10, group: 'answers' },
49
+ { id: 'direct-definition-answering', weight: 8, group: 'answers' },
47
50
  { id: 'concise-answer-wordcount', weight: 6, group: 'answers' },
48
- { id: 'question-heading-alignment', weight: 4, group: 'answers' },
51
+ { id: 'question-heading-alignment', weight: 5, group: 'answers' },
52
+ { id: 'fact-citation-density', weight: 6, group: 'facts' },
49
53
  ],
50
54
  },
51
55
  },
@@ -54,18 +58,22 @@ export const defaultConfig = {
54
58
  'ai-robots-txt',
55
59
  'ai-x-robots-tag',
56
60
  'ai-bot-sitemap',
61
+ 'ai-llms-txt',
57
62
  // Structured Data
58
63
  'jsonld-syntax-validity',
59
64
  'rag-schema-presence',
60
65
  'entity-sameas-links',
66
+ 'author-eeat-presence',
61
67
  // Content Chunking
62
68
  'heading-hierarchy',
63
69
  'semantic-containers',
64
70
  'chunk-token-density',
71
+ 'table-list-scannability',
65
72
  // Direct Answer Density
66
73
  'direct-definition-answering',
67
74
  'concise-answer-wordcount',
68
75
  'question-heading-alignment',
76
+ 'fact-citation-density',
69
77
  ],
70
78
  };
71
79
  //# sourceMappingURL=default-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"default-config.js","sourceRoot":"","sources":["../../src/config/default-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,QAAQ,EAAE;QACR,MAAM,EAAE,OAAO;QACf,iBAAiB,EAAE,KAAK;KACzB;IACD,UAAU,EAAE;QACV,kBAAkB,EAAE;YAClB,KAAK,EAAE,6BAA6B;YACpC,WAAW,EACT,+KAA+K;YACjL,MAAM,EAAE,EAAE;YACV,SAAS,EAAE;gBACT,EAAE,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;gBACtD,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE;gBACvD,EAAE,EAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE;aACvD;SACF;QACD,iBAAiB,EAAE;YACjB,KAAK,EAAE,+BAA+B;YACtC,WAAW,EACT,kJAAkJ;YACpJ,MAAM,EAAE,EAAE;YACV,SAAS,EAAE;gBACT,EAAE,EAAE,EAAE,wBAAwB,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;gBAC5D,EAAE,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACzD,EAAE,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE;aACnE;SACF;QACD,kBAAkB,EAAE;YAClB,KAAK,EAAE,uCAAuC;YAC9C,WAAW,EACT,+JAA+J;YACjK,MAAM,EAAE,EAAE;YACV,SAAS,EAAE;gBACT,EAAE,EAAE,EAAE,mBAAmB,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE;gBAC1D,EAAE,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE;gBAC5D,EAAE,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE;aAC9D;SACF;QACD,uBAAuB,EAAE;YACvB,KAAK,EAAE,uBAAuB;YAC9B,WAAW,EACT,wJAAwJ;YAC1J,MAAM,EAAE,EAAE;YACV,SAAS,EAAE;gBACT,EAAE,EAAE,EAAE,6BAA6B,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;gBACnE,EAAE,EAAE,EAAE,0BAA0B,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;gBAC/D,EAAE,EAAE,EAAE,4BAA4B,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;aAClE;SACF;KACF;IACD,MAAM,EAAE;QACN,mBAAmB;QACnB,eAAe;QACf,iBAAiB;QACjB,gBAAgB;QAChB,kBAAkB;QAClB,wBAAwB;QACxB,qBAAqB;QACrB,qBAAqB;QACrB,mBAAmB;QACnB,mBAAmB;QACnB,qBAAqB;QACrB,qBAAqB;QACrB,wBAAwB;QACxB,6BAA6B;QAC7B,0BAA0B;QAC1B,4BAA4B;KAC7B;CACF,CAAC"}
1
+ {"version":3,"file":"default-config.js","sourceRoot":"","sources":["../../src/config/default-config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"content-chunks-gatherer.d.ts","sourceRoot":"","sources":["../../../src/gather/gatherers/content-chunks-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,qBAAqB,EAAgB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEjG,qBAAa,qBAAsB,SAAQ,QAAQ,CAAC,eAAe,CAAC;IAClE,SAAyB,IAAI,EAAG,eAAe,CAAU;IAEnC,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAiG5F"}
1
+ {"version":3,"file":"content-chunks-gatherer.d.ts","sourceRoot":"","sources":["../../../src/gather/gatherers/content-chunks-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,qBAAqB,EAAgB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEjG,qBAAa,qBAAsB,SAAQ,QAAQ,CAAC,eAAe,CAAC;IAClE,SAAyB,IAAI,EAAG,eAAe,CAAU;IAEnC,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC;CA0G5F"}
@@ -83,6 +83,10 @@ export class ContentChunksGatherer extends Gatherer {
83
83
  const totalWordCount = chunks.reduce((sum, c) => sum + c.wordCount, 0);
84
84
  const totalEstimatedTokens = chunks.reduce((sum, c) => sum + c.estimatedTokens, 0);
85
85
  const averageChunkTokenCount = chunks.length > 0 ? Math.round(totalEstimatedTokens / chunks.length) : 0;
86
+ const totalTablesCount = $('table').length;
87
+ const structuredTablesCount = $('table').filter((_, el) => $(el).find('thead, th').length > 0).length;
88
+ const totalListsCount = $('ul, ol').length;
89
+ const totalListItemsCount = $('li').length;
86
90
  return {
87
91
  chunks,
88
92
  totalWordCount,
@@ -92,6 +96,10 @@ export class ContentChunksGatherer extends Gatherer {
92
96
  hasSemanticMain: $('main').length > 0,
93
97
  hasSemanticArticle: $('article').length > 0,
94
98
  hasSemanticSections: $('section').length > 0,
99
+ totalTablesCount,
100
+ totalListsCount,
101
+ totalListItemsCount,
102
+ structuredTablesCount,
95
103
  };
96
104
  }
97
105
  }
@@ -1 +1 @@
1
- {"version":3,"file":"content-chunks-gatherer.js","sourceRoot":"","sources":["../../../src/gather/gatherers/content-chunks-gatherer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"content-chunks-gatherer.js","sourceRoot":"","sources":["../../../src/gather/gatherers/content-chunks-gatherer.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"direct-answers-gatherer.d.ts","sourceRoot":"","sources":["../../../src/gather/gatherers/direct-answers-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,qBAAqB,EAAoB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAErG,qBAAa,qBAAsB,SAAQ,QAAQ,CAAC,eAAe,CAAC;IAClE,SAAyB,IAAI,EAAG,eAAe,CAAU;IAEnC,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAwD5F"}
1
+ {"version":3,"file":"direct-answers-gatherer.d.ts","sourceRoot":"","sources":["../../../src/gather/gatherers/direct-answers-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,qBAAqB,EAAoB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAErG,qBAAa,qBAAsB,SAAQ,QAAQ,CAAC,eAAe,CAAC;IAClE,SAAyB,IAAI,EAAG,eAAe,CAAU;IAEnC,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAyF5F"}
@@ -46,11 +46,42 @@ export class DirectAnswersGatherer extends Gatherer {
46
46
  });
47
47
  const conciseAnswersCount = pairs.filter((p) => p.isConcise).length;
48
48
  const directAnswerRatio = pairs.length > 0 ? conciseAnswersCount / pairs.length : 0;
49
+ // Fact, Citation, and Numerical Metrics Extraction for GEO
50
+ $('script, style, noscript, svg, nav, footer, header').remove();
51
+ const mainText = $('main, article, section, body').text().replace(/\s+/g, ' ');
52
+ const percentageMatches = mainText.match(/\b\d+(?:\.\d+)?\s*(?:%|percent\b|por ciento\b)/gi) || [];
53
+ const numericalMatches = mainText.match(/(?:[\$€£¥]\s*\d+(?:\.\d+)?|\b\d+(?:\.\d+)?\s*(?:ms|kb|mb|gb|tb|km|kg|k|m|million|billion|millones|tokens|users|usuarios|fps)\b)/gi) || [];
54
+ const citationMatches = mainText.match(/\b(?:according to|study by|research by|survey by|reported by|published by|data shows|data from|source:|según|estudio de|investigación de|fuente:|datos de|informe de)\b/gi) || [];
55
+ const externalSourcesUrls = [];
56
+ let currentHost = '';
57
+ try {
58
+ const finalUrl = await context.driver.getUrl();
59
+ currentHost = new URL(finalUrl).hostname;
60
+ }
61
+ catch { }
62
+ $('a[href^="http"]').each((_, a) => {
63
+ const href = $(a).attr('href') || '';
64
+ try {
65
+ const linkUrl = new URL(href);
66
+ if (linkUrl.hostname && linkUrl.hostname !== currentHost && !externalSourcesUrls.includes(linkUrl.origin)) {
67
+ externalSourcesUrls.push(linkUrl.origin);
68
+ }
69
+ }
70
+ catch { }
71
+ });
49
72
  return {
50
73
  pairs,
51
74
  directAnswerRatio,
52
75
  conciseAnswersCount,
53
76
  definitionPatternsFound,
77
+ facts: {
78
+ percentagesCount: percentageMatches.length,
79
+ numericalMetricsCount: numericalMatches.length,
80
+ citationPhrasesCount: citationMatches.length,
81
+ externalSourcesCount: externalSourcesUrls.length,
82
+ externalSourcesUrls,
83
+ totalFactSignals: percentageMatches.length + numericalMatches.length + citationMatches.length + externalSourcesUrls.length,
84
+ },
54
85
  };
55
86
  }
56
87
  }
@@ -1 +1 @@
1
- {"version":3,"file":"direct-answers-gatherer.js","sourceRoot":"","sources":["../../../src/gather/gatherers/direct-answers-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,MAAM,OAAO,qBAAsB,SAAQ,QAAyB;IACzC,IAAI,GAAG,eAAwB,CAAC;IAEzC,KAAK,CAAC,WAAW,CAAC,OAAwB;QACxD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7B,MAAM,KAAK,GAAuB,EAAE,CAAC;QACrC,IAAI,uBAAuB,GAAG,CAAC,CAAC;QAEhC,MAAM,kBAAkB,GAAG,wHAAwH,CAAC;QACpJ,MAAM,eAAe,GAAG,6JAA6J,CAAC;QAEtL,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;YACjC,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAErF,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC;gBACpD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;oBAC/D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACtD,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC;oBAErC,8EAA8E;oBAC9E,MAAM,SAAS,GAAG,eAAe,IAAI,EAAE,IAAI,eAAe,IAAI,EAAE,CAAC;oBACjE,MAAM,mBAAmB,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;oBAE3E,IAAI,mBAAmB,EAAE,CAAC;wBACxB,uBAAuB,EAAE,CAAC;oBAC5B,CAAC;oBAED,IAAI,UAAU,GAAG,GAAG,CAAC;oBACrB,IAAI,SAAS;wBAAE,UAAU,IAAI,GAAG,CAAC;oBACjC,IAAI,mBAAmB;wBAAE,UAAU,IAAI,GAAG,CAAC;oBAE3C,KAAK,CAAC,IAAI,CAAC;wBACT,QAAQ,EAAE,WAAW;wBACrB,cAAc,EAAE,SAAS;wBACzB,UAAU;wBACV,eAAe;wBACf,SAAS;wBACT,mBAAmB;wBACnB,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC;qBAC3C,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,mBAAmB,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QACpE,MAAM,iBAAiB,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,mBAAmB,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAEpF,OAAO;YACL,KAAK;YACL,iBAAiB;YACjB,mBAAmB;YACnB,uBAAuB;SACxB,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"direct-answers-gatherer.js","sourceRoot":"","sources":["../../../src/gather/gatherers/direct-answers-gatherer.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @fileoverview JSONLDGatherer para extraer y estructurar schemas JSON-LD del DOM.
2
+ * @fileoverview JSONLDGatherer para extraer y estructurar schemas JSON-LD del DOM y señales E-E-A-T.
3
3
  */
4
4
  import { Gatherer } from '../gatherer.js';
5
5
  import type { JSONLDArtifact, GathererContext } from '../../types/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"jsonld-gatherer.d.ts","sourceRoot":"","sources":["../../../src/gather/gatherers/jsonld-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAc,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAExF,qBAAa,cAAe,SAAQ,QAAQ,CAAC,QAAQ,CAAC;IACpD,SAAyB,IAAI,EAAG,QAAQ,CAAU;IAE5B,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IA8DpF,OAAO,CAAC,iBAAiB;CAoD1B"}
1
+ {"version":3,"file":"jsonld-gatherer.d.ts","sourceRoot":"","sources":["../../../src/gather/gatherers/jsonld-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAA8B,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAExG,qBAAa,cAAe,SAAQ,QAAQ,CAAC,QAAQ,CAAC;IACpD,SAAyB,IAAI,EAAG,QAAQ,CAAU;IAE5B,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAyFpF,OAAO,CAAC,iBAAiB;CAgH1B"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @fileoverview JSONLDGatherer para extraer y estructurar schemas JSON-LD del DOM.
2
+ * @fileoverview JSONLDGatherer para extraer y estructurar schemas JSON-LD del DOM y señales E-E-A-T.
3
3
  */
4
4
  import * as cheerio from 'cheerio';
5
5
  import { Gatherer } from '../gatherer.js';
@@ -11,6 +11,16 @@ export class JSONLDGatherer extends Gatherer {
11
11
  const items = [];
12
12
  const schemasCountByType = {};
13
13
  const sameAsUrls = [];
14
+ const authorEeat = {
15
+ hasAuthorSchema: false,
16
+ authorSameAsUrls: [],
17
+ hasJobTitle: false,
18
+ hasPublisherSchema: false,
19
+ hasDatePublished: false,
20
+ hasDateModified: false,
21
+ hasDomAuthorByline: false,
22
+ hasDomPublishedDate: false,
23
+ };
14
24
  const scriptTags = $('script[type="application/ld+json"]');
15
25
  scriptTags.each((_, el) => {
16
26
  const raw = $(el).text().trim();
@@ -28,7 +38,7 @@ export class JSONLDGatherer extends Gatherer {
28
38
  if (typeof parsed === 'object' && parsed !== null) {
29
39
  item.context = parsed['@context'] ? String(parsed['@context']) : null;
30
40
  item.type = parsed['@type'] ?? null;
31
- this.inspectSchemaNode(parsed, schemasCountByType, sameAsUrls);
41
+ this.inspectSchemaNode(parsed, schemasCountByType, sameAsUrls, authorEeat);
32
42
  }
33
43
  items.push(item);
34
44
  }
@@ -43,6 +53,19 @@ export class JSONLDGatherer extends Gatherer {
43
53
  });
44
54
  }
45
55
  });
56
+ // Check DOM byline & dates for visible E-E-A-T
57
+ const domByline = $('[rel="author"], [itemprop="author"], .author, .byline, [class*="author-name"], [class*="post-author"]').first();
58
+ if (domByline.length > 0) {
59
+ const text = domByline.text().trim().replace(/\s+/g, ' ');
60
+ if (text.length > 0 && text.length < 100) {
61
+ authorEeat.hasDomAuthorByline = true;
62
+ authorEeat.domAuthorText = text;
63
+ }
64
+ }
65
+ const domTime = $('time[datetime], [itemprop="datePublished"], [class*="publish-date"], [class*="post-date"]').first();
66
+ if (domTime.length > 0) {
67
+ authorEeat.hasDomPublishedDate = true;
68
+ }
46
69
  const hasType = (typeName) => {
47
70
  const count = schemasCountByType[typeName.toLowerCase()] || 0;
48
71
  return count > 0;
@@ -58,13 +81,14 @@ export class JSONLDGatherer extends Gatherer {
58
81
  hasProduct: hasType('product'),
59
82
  hasSameAs: sameAsUrls.length > 0,
60
83
  sameAsUrls,
84
+ authorEeat,
61
85
  };
62
86
  }
63
- inspectSchemaNode(node, typeCounts, sameAsUrls) {
87
+ inspectSchemaNode(node, typeCounts, sameAsUrls, authorEeat) {
64
88
  if (Array.isArray(node)) {
65
89
  for (const item of node) {
66
90
  if (typeof item === 'object' && item !== null) {
67
- this.inspectSchemaNode(item, typeCounts, sameAsUrls);
91
+ this.inspectSchemaNode(item, typeCounts, sameAsUrls, authorEeat);
68
92
  }
69
93
  }
70
94
  return;
@@ -72,7 +96,7 @@ export class JSONLDGatherer extends Gatherer {
72
96
  if (node['@graph'] && Array.isArray(node['@graph'])) {
73
97
  for (const item of node['@graph']) {
74
98
  if (typeof item === 'object' && item !== null) {
75
- this.inspectSchemaNode(item, typeCounts, sameAsUrls);
99
+ this.inspectSchemaNode(item, typeCounts, sameAsUrls, authorEeat);
76
100
  }
77
101
  }
78
102
  }
@@ -80,14 +104,73 @@ export class JSONLDGatherer extends Gatherer {
80
104
  if (typeof type === 'string') {
81
105
  const t = type.toLowerCase();
82
106
  typeCounts[t] = (typeCounts[t] || 0) + 1;
107
+ if (t === 'person') {
108
+ authorEeat.hasAuthorSchema = true;
109
+ authorEeat.authorType = 'Person';
110
+ if (node['name'] && typeof node['name'] === 'string') {
111
+ authorEeat.authorName = node['name'];
112
+ }
113
+ }
83
114
  }
84
115
  else if (Array.isArray(type)) {
85
116
  for (const t of type) {
86
117
  if (typeof t === 'string') {
87
118
  const lower = t.toLowerCase();
88
119
  typeCounts[lower] = (typeCounts[lower] || 0) + 1;
120
+ if (lower === 'person') {
121
+ authorEeat.hasAuthorSchema = true;
122
+ authorEeat.authorType = 'Person';
123
+ }
124
+ }
125
+ }
126
+ }
127
+ // Inspect author property inside Article/BlogPosting
128
+ if (node['author']) {
129
+ authorEeat.hasAuthorSchema = true;
130
+ const authorNode = node['author'];
131
+ if (typeof authorNode === 'object' && authorNode !== null && !Array.isArray(authorNode)) {
132
+ const aObj = authorNode;
133
+ if (aObj['name'] && typeof aObj['name'] === 'string') {
134
+ authorEeat.authorName = aObj['name'];
135
+ }
136
+ if (aObj['@type'] && typeof aObj['@type'] === 'string') {
137
+ authorEeat.authorType = aObj['@type'];
138
+ }
139
+ if (aObj['jobTitle'] && typeof aObj['jobTitle'] === 'string') {
140
+ authorEeat.hasJobTitle = true;
141
+ authorEeat.jobTitle = aObj['jobTitle'];
142
+ }
143
+ if (aObj['sameAs']) {
144
+ const s = aObj['sameAs'];
145
+ if (typeof s === 'string')
146
+ authorEeat.authorSameAsUrls.push(s);
147
+ else if (Array.isArray(s))
148
+ authorEeat.authorSameAsUrls.push(...s.filter((x) => typeof x === 'string'));
89
149
  }
90
150
  }
151
+ else if (typeof authorNode === 'string') {
152
+ authorEeat.authorName = authorNode;
153
+ }
154
+ }
155
+ // Inspect publisher property
156
+ if (node['publisher']) {
157
+ authorEeat.hasPublisherSchema = true;
158
+ const pubNode = node['publisher'];
159
+ if (typeof pubNode === 'object' && pubNode !== null) {
160
+ const pObj = pubNode;
161
+ if (pObj['name'] && typeof pObj['name'] === 'string') {
162
+ authorEeat.publisherName = pObj['name'];
163
+ }
164
+ }
165
+ }
166
+ // Dates
167
+ if (node['datePublished'] && typeof node['datePublished'] === 'string') {
168
+ authorEeat.hasDatePublished = true;
169
+ authorEeat.datePublished = node['datePublished'];
170
+ }
171
+ if (node['dateModified'] && typeof node['dateModified'] === 'string') {
172
+ authorEeat.hasDateModified = true;
173
+ authorEeat.dateModified = node['dateModified'];
91
174
  }
92
175
  const sameAs = node['sameAs'];
93
176
  if (typeof sameAs === 'string' && sameAs.trim()) {
@@ -102,7 +185,7 @@ export class JSONLDGatherer extends Gatherer {
102
185
  }
103
186
  for (const key of Object.keys(node)) {
104
187
  if (key !== '@graph' && typeof node[key] === 'object' && node[key] !== null) {
105
- this.inspectSchemaNode(node[key], typeCounts, sameAsUrls);
188
+ this.inspectSchemaNode(node[key], typeCounts, sameAsUrls, authorEeat);
106
189
  }
107
190
  }
108
191
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jsonld-gatherer.js","sourceRoot":"","sources":["../../../src/gather/gatherers/jsonld-gatherer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jsonld-gatherer.js","sourceRoot":"","sources":["../../../src/gather/gatherers/jsonld-gatherer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @fileoverview LlmsTxtGatherer to check and parse /llms.txt and /llms-full.txt standard files.
3
+ */
4
+ import { Gatherer } from '../gatherer.js';
5
+ import type { LlmsTxtArtifact, GathererContext } from '../../types/index.js';
6
+ export declare class LlmsTxtGatherer extends Gatherer<'LlmsTxt'> {
7
+ readonly name: "LlmsTxt";
8
+ getArtifact(context: GathererContext): Promise<LlmsTxtArtifact>;
9
+ private parseLlmsTxt;
10
+ }
11
+ //# sourceMappingURL=llms-txt-gatherer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llms-txt-gatherer.d.ts","sourceRoot":"","sources":["../../../src/gather/gatherers/llms-txt-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAkB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE7F,qBAAa,eAAgB,SAAQ,QAAQ,CAAC,SAAS,CAAC;IACtD,SAAyB,IAAI,EAAG,SAAS,CAAU;IAE7B,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IA4DrF,OAAO,CAAC,YAAY;CAyErB"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * @fileoverview LlmsTxtGatherer to check and parse /llms.txt and /llms-full.txt standard files.
3
+ */
4
+ import { Gatherer } from '../gatherer.js';
5
+ export class LlmsTxtGatherer extends Gatherer {
6
+ name = 'LlmsTxt';
7
+ async getArtifact(context) {
8
+ const finalUrl = await context.driver.getUrl();
9
+ const urlObj = new URL(finalUrl);
10
+ const llmsUrl = `${urlObj.origin}/llms.txt`;
11
+ const llmsFullUrl = `${urlObj.origin}/llms-full.txt`;
12
+ let rawContent = null;
13
+ let statusCode = null;
14
+ let exists = false;
15
+ let hasFullVersion = false;
16
+ let fullStatusCode = null;
17
+ // 1. Fetch /llms.txt
18
+ try {
19
+ const response = await context.driver.fetch(llmsUrl);
20
+ statusCode = response.status;
21
+ if (response.ok) {
22
+ const text = await response.text();
23
+ // Check it is not an HTML 404/SPA fallback
24
+ const trimmed = text.trim().toLowerCase();
25
+ if (!trimmed.startsWith('<!doctype html') && !trimmed.startsWith('<html') && !trimmed.includes('<head>')) {
26
+ rawContent = text;
27
+ exists = true;
28
+ }
29
+ }
30
+ }
31
+ catch {
32
+ exists = false;
33
+ }
34
+ // 2. Fetch /llms-full.txt (only if origin permits, check existence)
35
+ try {
36
+ const responseFull = await context.driver.fetch(llmsFullUrl);
37
+ fullStatusCode = responseFull.status;
38
+ if (responseFull.ok) {
39
+ const textFull = await responseFull.text();
40
+ const trimmed = textFull.trim().toLowerCase();
41
+ if (!trimmed.startsWith('<!doctype html') && !trimmed.startsWith('<html')) {
42
+ hasFullVersion = true;
43
+ }
44
+ }
45
+ }
46
+ catch {
47
+ hasFullVersion = false;
48
+ }
49
+ const { title, summary, sections, totalDeclaredLinks } = this.parseLlmsTxt(rawContent || '');
50
+ return {
51
+ exists,
52
+ statusCode,
53
+ rawContent,
54
+ charCount: rawContent ? rawContent.length : 0,
55
+ hasFullVersion,
56
+ fullStatusCode,
57
+ title,
58
+ summary,
59
+ sections,
60
+ totalDeclaredLinks,
61
+ };
62
+ }
63
+ parseLlmsTxt(content) {
64
+ if (!content) {
65
+ return { sections: [], totalDeclaredLinks: 0 };
66
+ }
67
+ let title;
68
+ let summary;
69
+ const sections = [];
70
+ let currentSection = { title: 'Main', links: [] };
71
+ let totalDeclaredLinks = 0;
72
+ const lines = content.split(/\r?\n/);
73
+ for (const rawLine of lines) {
74
+ const line = rawLine.trim();
75
+ if (!line)
76
+ continue;
77
+ // Extract H1 title (# Title)
78
+ if (line.startsWith('# ') && !title) {
79
+ title = line.replace(/^#\s+/, '').trim();
80
+ continue;
81
+ }
82
+ // Extract blockquote summary (> Summary)
83
+ if (line.startsWith('>') && !summary) {
84
+ summary = line.replace(/^>\s*/, '').trim();
85
+ continue;
86
+ }
87
+ // Extract H2 section (## Section)
88
+ if (line.startsWith('## ')) {
89
+ if (currentSection.links.length > 0 || currentSection.title !== 'Main') {
90
+ sections.push(currentSection);
91
+ }
92
+ currentSection = {
93
+ title: line.replace(/^##\s+/, '').trim(),
94
+ links: [],
95
+ };
96
+ continue;
97
+ }
98
+ // Extract Markdown links: - [Title](URL): Optional description
99
+ const linkMatch = line.match(/^[-*]\s+\[([^\]]+)\]\(([^)]+)\)(?::?\s*(.*))?$/);
100
+ if (linkMatch) {
101
+ const linkTitle = linkMatch[1]?.trim() || '';
102
+ const linkUrl = linkMatch[2]?.trim() || '';
103
+ const linkDesc = linkMatch[3]?.trim() || undefined;
104
+ currentSection.links.push({
105
+ title: linkTitle,
106
+ url: linkUrl,
107
+ description: linkDesc,
108
+ });
109
+ totalDeclaredLinks++;
110
+ }
111
+ }
112
+ if (currentSection.links.length > 0 || currentSection.title !== 'Main') {
113
+ sections.push(currentSection);
114
+ }
115
+ return {
116
+ title,
117
+ summary,
118
+ sections,
119
+ totalDeclaredLinks,
120
+ };
121
+ }
122
+ }
123
+ //# sourceMappingURL=llms-txt-gatherer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llms-txt-gatherer.js","sourceRoot":"","sources":["../../../src/gather/gatherers/llms-txt-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,MAAM,OAAO,eAAgB,SAAQ,QAAmB;IAC7B,IAAI,GAAG,SAAkB,CAAC;IAEnC,KAAK,CAAC,WAAW,CAAC,OAAwB;QACxD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,GAAG,MAAM,CAAC,MAAM,WAAW,CAAC;QAC5C,MAAM,WAAW,GAAG,GAAG,MAAM,CAAC,MAAM,gBAAgB,CAAC;QAErD,IAAI,UAAU,GAAkB,IAAI,CAAC;QACrC,IAAI,UAAU,GAAkB,IAAI,CAAC;QACrC,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,IAAI,cAAc,GAAkB,IAAI,CAAC;QAEzC,qBAAqB;QACrB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrD,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC7B,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,2CAA2C;gBAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC1C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzG,UAAU,GAAG,IAAI,CAAC;oBAClB,MAAM,GAAG,IAAI,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;QAED,oEAAoE;QACpE,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC7D,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC;YACrC,IAAI,YAAY,CAAC,EAAE,EAAE,CAAC;gBACpB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;gBAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC9C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC1E,cAAc,GAAG,IAAI,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,cAAc,GAAG,KAAK,CAAC;QACzB,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;QAE7F,OAAO;YACL,MAAM;YACN,UAAU;YACV,UAAU;YACV,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC7C,cAAc;YACd,cAAc;YACd,KAAK;YACL,OAAO;YACP,QAAQ;YACR,kBAAkB;SACnB,CAAC;IACJ,CAAC;IAEO,YAAY,CAAC,OAAe;QAMlC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,CAAC;QACjD,CAAC;QAED,IAAI,KAAyB,CAAC;QAC9B,IAAI,OAA2B,CAAC;QAChC,MAAM,QAAQ,GAAqB,EAAE,CAAC;QACtC,IAAI,cAAc,GAAmB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAClE,IAAI,kBAAkB,GAAG,CAAC,CAAC;QAE3B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAErC,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,6BAA6B;YAC7B,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACpC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACzC,SAAS;YACX,CAAC;YAED,yCAAyC;YACzC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACrC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC3C,SAAS;YACX,CAAC;YAED,kCAAkC;YAClC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,IAAI,cAAc,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;oBACvE,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAChC,CAAC;gBACD,cAAc,GAAG;oBACf,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;oBACxC,KAAK,EAAE,EAAE;iBACV,CAAC;gBACF,SAAS;YACX,CAAC;YAED,+DAA+D;YAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;YAC/E,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAC7C,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAC3C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;gBAEnD,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC;oBACxB,KAAK,EAAE,SAAS;oBAChB,GAAG,EAAE,OAAO;oBACZ,WAAW,EAAE,QAAQ;iBACtB,CAAC,CAAC;gBACH,kBAAkB,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;QAED,IAAI,cAAc,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YACvE,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAChC,CAAC;QAED,OAAO;YACL,KAAK;YACL,OAAO;YACP,QAAQ;YACR,kBAAkB;SACnB,CAAC;IACJ,CAAC;CACF"}
@@ -11,4 +11,5 @@ export * from './gatherers/meta-tags-gatherer.js';
11
11
  export * from './gatherers/headings-hierarchy-gatherer.js';
12
12
  export * from './gatherers/content-chunks-gatherer.js';
13
13
  export * from './gatherers/direct-answers-gatherer.js';
14
+ export * from './gatherers/llms-txt-gatherer.js';
14
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gather/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gather/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,kCAAkC,CAAC"}
@@ -11,4 +11,5 @@ export * from './gatherers/meta-tags-gatherer.js';
11
11
  export * from './gatherers/headings-hierarchy-gatherer.js';
12
12
  export * from './gatherers/content-chunks-gatherer.js';
13
13
  export * from './gatherers/direct-answers-gatherer.js';
14
+ export * from './gatherers/llms-txt-gatherer.js';
14
15
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gather/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gather/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,kCAAkC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -6,6 +6,7 @@ export * from './audits/index.js';
6
6
  export * from './gather/index.js';
7
7
  export * from './config/default-config.js';
8
8
  export * from './runner/aggregator.js';
9
+ export * from './runner/assertions.js';
9
10
  export * from './runner/runner.js';
10
11
  export * from './report/index.js';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -6,6 +6,7 @@ export * from './audits/index.js';
6
6
  export * from './gather/index.js';
7
7
  export * from './config/default-config.js';
8
8
  export * from './runner/aggregator.js';
9
+ export * from './runner/assertions.js';
9
10
  export * from './runner/runner.js';
10
11
  export * from './report/index.js';
11
12
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC"}