@drowlink/aeo-linter-core 0.1.0
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.
- package/dist/__tests__/audit-contract.test.d.ts +2 -0
- package/dist/__tests__/audit-contract.test.d.ts.map +1 -0
- package/dist/__tests__/audit-contract.test.js +120 -0
- package/dist/__tests__/audit-contract.test.js.map +1 -0
- package/dist/__tests__/gatherers.test.d.ts +2 -0
- package/dist/__tests__/gatherers.test.d.ts.map +1 -0
- package/dist/__tests__/gatherers.test.js +139 -0
- package/dist/__tests__/gatherers.test.js.map +1 -0
- package/dist/__tests__/runner.test.d.ts +2 -0
- package/dist/__tests__/runner.test.d.ts.map +1 -0
- package/dist/__tests__/runner.test.js +77 -0
- package/dist/__tests__/runner.test.js.map +1 -0
- package/dist/audits/ai-accessibility/ai-bot-sitemap.d.ts +10 -0
- package/dist/audits/ai-accessibility/ai-bot-sitemap.d.ts.map +1 -0
- package/dist/audits/ai-accessibility/ai-bot-sitemap.js +27 -0
- package/dist/audits/ai-accessibility/ai-bot-sitemap.js.map +1 -0
- package/dist/audits/ai-accessibility/ai-robots-txt.d.ts +10 -0
- package/dist/audits/ai-accessibility/ai-robots-txt.d.ts.map +1 -0
- package/dist/audits/ai-accessibility/ai-robots-txt.js +54 -0
- package/dist/audits/ai-accessibility/ai-robots-txt.js.map +1 -0
- package/dist/audits/ai-accessibility/ai-x-robots-tag.d.ts +10 -0
- package/dist/audits/ai-accessibility/ai-x-robots-tag.d.ts.map +1 -0
- package/dist/audits/ai-accessibility/ai-x-robots-tag.js +36 -0
- package/dist/audits/ai-accessibility/ai-x-robots-tag.js.map +1 -0
- package/dist/audits/audit.d.ts +56 -0
- package/dist/audits/audit.d.ts.map +1 -0
- package/dist/audits/audit.js +86 -0
- package/dist/audits/audit.js.map +1 -0
- package/dist/audits/content-chunking/chunk-token-density.d.ts +10 -0
- package/dist/audits/content-chunking/chunk-token-density.d.ts.map +1 -0
- package/dist/audits/content-chunking/chunk-token-density.js +44 -0
- package/dist/audits/content-chunking/chunk-token-density.js.map +1 -0
- package/dist/audits/content-chunking/heading-hierarchy.d.ts +10 -0
- package/dist/audits/content-chunking/heading-hierarchy.d.ts.map +1 -0
- package/dist/audits/content-chunking/heading-hierarchy.js +54 -0
- package/dist/audits/content-chunking/heading-hierarchy.js.map +1 -0
- package/dist/audits/content-chunking/semantic-containers.d.ts +10 -0
- package/dist/audits/content-chunking/semantic-containers.d.ts.map +1 -0
- package/dist/audits/content-chunking/semantic-containers.js +34 -0
- package/dist/audits/content-chunking/semantic-containers.js.map +1 -0
- package/dist/audits/direct-answer-density/concise-answer-wordcount.d.ts +10 -0
- package/dist/audits/direct-answer-density/concise-answer-wordcount.d.ts.map +1 -0
- package/dist/audits/direct-answer-density/concise-answer-wordcount.js +42 -0
- package/dist/audits/direct-answer-density/concise-answer-wordcount.js.map +1 -0
- package/dist/audits/direct-answer-density/direct-definition-answering.d.ts +10 -0
- package/dist/audits/direct-answer-density/direct-definition-answering.d.ts.map +1 -0
- package/dist/audits/direct-answer-density/direct-definition-answering.js +43 -0
- package/dist/audits/direct-answer-density/direct-definition-answering.js.map +1 -0
- package/dist/audits/direct-answer-density/question-heading-alignment.d.ts +10 -0
- package/dist/audits/direct-answer-density/question-heading-alignment.d.ts.map +1 -0
- package/dist/audits/direct-answer-density/question-heading-alignment.js +35 -0
- package/dist/audits/direct-answer-density/question-heading-alignment.js.map +1 -0
- package/dist/audits/index.d.ts +19 -0
- package/dist/audits/index.d.ts.map +1 -0
- package/dist/audits/index.js +36 -0
- package/dist/audits/index.js.map +1 -0
- package/dist/audits/structured-data/entity-sameas-links.d.ts +10 -0
- package/dist/audits/structured-data/entity-sameas-links.d.ts.map +1 -0
- package/dist/audits/structured-data/entity-sameas-links.js +43 -0
- package/dist/audits/structured-data/entity-sameas-links.js.map +1 -0
- package/dist/audits/structured-data/jsonld-syntax-validity.d.ts +10 -0
- package/dist/audits/structured-data/jsonld-syntax-validity.d.ts.map +1 -0
- package/dist/audits/structured-data/jsonld-syntax-validity.js +43 -0
- package/dist/audits/structured-data/jsonld-syntax-validity.js.map +1 -0
- package/dist/audits/structured-data/rag-schema-presence.d.ts +10 -0
- package/dist/audits/structured-data/rag-schema-presence.d.ts.map +1 -0
- package/dist/audits/structured-data/rag-schema-presence.js +48 -0
- package/dist/audits/structured-data/rag-schema-presence.js.map +1 -0
- package/dist/config/default-config.d.ts +7 -0
- package/dist/config/default-config.d.ts.map +1 -0
- package/dist/config/default-config.js +71 -0
- package/dist/config/default-config.js.map +1 -0
- package/dist/gather/driver/cheerio-driver.d.ts +27 -0
- package/dist/gather/driver/cheerio-driver.d.ts.map +1 -0
- package/dist/gather/driver/cheerio-driver.js +64 -0
- package/dist/gather/driver/cheerio-driver.js.map +1 -0
- package/dist/gather/gatherer.d.ts +12 -0
- package/dist/gather/gatherer.d.ts.map +1 -0
- package/dist/gather/gatherer.js +6 -0
- package/dist/gather/gatherer.js.map +1 -0
- package/dist/gather/gatherers/content-chunks-gatherer.d.ts +10 -0
- package/dist/gather/gatherers/content-chunks-gatherer.d.ts.map +1 -0
- package/dist/gather/gatherers/content-chunks-gatherer.js +100 -0
- package/dist/gather/gatherers/content-chunks-gatherer.js.map +1 -0
- package/dist/gather/gatherers/direct-answers-gatherer.d.ts +10 -0
- package/dist/gather/gatherers/direct-answers-gatherer.d.ts.map +1 -0
- package/dist/gather/gatherers/direct-answers-gatherer.js +58 -0
- package/dist/gather/gatherers/direct-answers-gatherer.js.map +1 -0
- package/dist/gather/gatherers/headings-hierarchy-gatherer.d.ts +10 -0
- package/dist/gather/gatherers/headings-hierarchy-gatherer.d.ts.map +1 -0
- package/dist/gather/gatherers/headings-hierarchy-gatherer.js +60 -0
- package/dist/gather/gatherers/headings-hierarchy-gatherer.js.map +1 -0
- package/dist/gather/gatherers/http-headers-gatherer.d.ts +10 -0
- package/dist/gather/gatherers/http-headers-gatherer.d.ts.map +1 -0
- package/dist/gather/gatherers/http-headers-gatherer.js +25 -0
- package/dist/gather/gatherers/http-headers-gatherer.js.map +1 -0
- package/dist/gather/gatherers/jsonld-gatherer.d.ts +11 -0
- package/dist/gather/gatherers/jsonld-gatherer.d.ts.map +1 -0
- package/dist/gather/gatherers/jsonld-gatherer.js +110 -0
- package/dist/gather/gatherers/jsonld-gatherer.js.map +1 -0
- package/dist/gather/gatherers/meta-tags-gatherer.d.ts +10 -0
- package/dist/gather/gatherers/meta-tags-gatherer.d.ts.map +1 -0
- package/dist/gather/gatherers/meta-tags-gatherer.js +45 -0
- package/dist/gather/gatherers/meta-tags-gatherer.js.map +1 -0
- package/dist/gather/gatherers/robots-txt-gatherer.d.ts +12 -0
- package/dist/gather/gatherers/robots-txt-gatherer.d.ts.map +1 -0
- package/dist/gather/gatherers/robots-txt-gatherer.js +139 -0
- package/dist/gather/gatherers/robots-txt-gatherer.js.map +1 -0
- package/dist/gather/gatherers/url-gatherer.d.ts +10 -0
- package/dist/gather/gatherers/url-gatherer.d.ts.map +1 -0
- package/dist/gather/gatherers/url-gatherer.js +19 -0
- package/dist/gather/gatherers/url-gatherer.js.map +1 -0
- package/dist/gather/index.d.ts +14 -0
- package/dist/gather/index.d.ts.map +1 -0
- package/dist/gather/index.js +14 -0
- package/dist/gather/index.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/report/html-reporter.d.ts +11 -0
- package/dist/report/html-reporter.d.ts.map +1 -0
- package/dist/report/html-reporter.js +285 -0
- package/dist/report/html-reporter.js.map +1 -0
- package/dist/report/index.d.ts +6 -0
- package/dist/report/index.d.ts.map +1 -0
- package/dist/report/index.js +6 -0
- package/dist/report/index.js.map +1 -0
- package/dist/report/terminal-reporter.d.ts +8 -0
- package/dist/report/terminal-reporter.d.ts.map +1 -0
- package/dist/report/terminal-reporter.js +50 -0
- package/dist/report/terminal-reporter.js.map +1 -0
- package/dist/runner/aggregator.d.ts +17 -0
- package/dist/runner/aggregator.d.ts.map +1 -0
- package/dist/runner/aggregator.js +59 -0
- package/dist/runner/aggregator.js.map +1 -0
- package/dist/runner/runner.d.ts +29 -0
- package/dist/runner/runner.d.ts.map +1 -0
- package/dist/runner/runner.js +125 -0
- package/dist/runner/runner.js.map +1 -0
- package/dist/types/artifacts.d.ts +188 -0
- package/dist/types/artifacts.d.ts.map +1 -0
- package/dist/types/artifacts.js +7 -0
- package/dist/types/artifacts.js.map +1 -0
- package/dist/types/audit.d.ts +122 -0
- package/dist/types/audit.d.ts.map +1 -0
- package/dist/types/audit.js +6 -0
- package/dist/types/audit.js.map +1 -0
- package/dist/types/config.d.ts +74 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +5 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/gatherer.d.ts +32 -0
- package/dist/types/gatherer.d.ts.map +1 -0
- package/dist/types/gatherer.js +5 -0
- package/dist/types/gatherer.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Auditoría para validar la sintaxis e integridad de esquemas JSON-LD
|
|
3
|
+
*/
|
|
4
|
+
import { Audit } from '../audit.js';
|
|
5
|
+
import type { Artifacts, AuditMeta, AuditResult } from '../../types/index.js';
|
|
6
|
+
export declare class JsonLdSyntaxValidityAudit extends Audit {
|
|
7
|
+
static meta: AuditMeta;
|
|
8
|
+
static audit(artifacts: Artifacts): Promise<AuditResult>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=jsonld-syntax-validity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonld-syntax-validity.d.ts","sourceRoot":"","sources":["../../../src/audits/structured-data/jsonld-syntax-validity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE9E,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,OAAuB,IAAI,EAAE,SAAS,CAOpC;WAE2B,KAAK,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;CAoC/E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Auditoría para validar la sintaxis e integridad de esquemas JSON-LD
|
|
3
|
+
*/
|
|
4
|
+
import { Audit } from '../audit.js';
|
|
5
|
+
export class JsonLdSyntaxValidityAudit extends Audit {
|
|
6
|
+
static meta = {
|
|
7
|
+
id: 'jsonld-syntax-validity',
|
|
8
|
+
title: 'Todos los bloques JSON-LD tienen sintaxis válida y sin errores',
|
|
9
|
+
failureTitle: 'Se detectaron errores de sintaxis en bloques JSON-LD',
|
|
10
|
+
description: 'Un JSON malformado impide que los parsers de Answer Engines y RAG extraigan la información estructurada de la entidad.',
|
|
11
|
+
requiredArtifacts: ['JSONLD'],
|
|
12
|
+
};
|
|
13
|
+
static async audit(artifacts) {
|
|
14
|
+
const jsonld = artifacts.JSONLD;
|
|
15
|
+
if (jsonld.items.length === 0) {
|
|
16
|
+
return this.generateAuditResult({
|
|
17
|
+
score: 0.5,
|
|
18
|
+
displayValue: 'No se encontraron bloques JSON-LD en la página',
|
|
19
|
+
explanation: 'Se recomienda agregar esquemas Schema.org mediante <script type="application/ld+json">.',
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
const invalidItems = jsonld.items.filter((item) => !item.isValid);
|
|
23
|
+
const validCount = jsonld.items.length - invalidItems.length;
|
|
24
|
+
const score = validCount / jsonld.items.length;
|
|
25
|
+
const tableItems = jsonld.items.map((item, idx) => ({
|
|
26
|
+
index: idx + 1,
|
|
27
|
+
type: item.type ? (Array.isArray(item.type) ? item.type.join(', ') : item.type) : 'Desconocido',
|
|
28
|
+
status: item.isValid ? 'Válido' : 'Error de Sintaxis',
|
|
29
|
+
error: item.syntaxErrors ? item.syntaxErrors.join('; ') : 'Ninguno',
|
|
30
|
+
}));
|
|
31
|
+
return this.generateAuditResult({
|
|
32
|
+
score,
|
|
33
|
+
displayValue: `${validCount} de ${jsonld.items.length} bloques JSON-LD válidos`,
|
|
34
|
+
details: this.makeTableDetails([
|
|
35
|
+
{ key: 'index', label: '#', valueType: 'numeric' },
|
|
36
|
+
{ key: 'type', label: '@type', valueType: 'code' },
|
|
37
|
+
{ key: 'status', label: 'Estado', valueType: 'status' },
|
|
38
|
+
{ key: 'error', label: 'Detalle', valueType: 'text' },
|
|
39
|
+
], tableItems),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=jsonld-syntax-validity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonld-syntax-validity.js","sourceRoot":"","sources":["../../../src/audits/structured-data/jsonld-syntax-validity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAC3C,MAAM,CAAU,IAAI,GAAc;QACvC,EAAE,EAAE,wBAAwB;QAC5B,KAAK,EAAE,gEAAgE;QACvE,YAAY,EAAE,sDAAsD;QACpE,WAAW,EACT,wHAAwH;QAC1H,iBAAiB,EAAE,CAAC,QAAQ,CAAC;KAC9B,CAAC;IAEK,MAAM,CAAU,KAAK,CAAC,KAAK,CAAC,SAAoB;QACrD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAEhC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,mBAAmB,CAAC;gBAC9B,KAAK,EAAE,GAAG;gBACV,YAAY,EAAE,gDAAgD;gBAC9D,WAAW,EAAE,yFAAyF;aACvG,CAAC,CAAC;QACL,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;QAC7D,MAAM,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QAE/C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAClD,KAAK,EAAE,GAAG,GAAG,CAAC;YACd,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa;YAC/F,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB;YACrD,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SACpE,CAAC,CAAC,CAAC;QAEJ,OAAO,IAAI,CAAC,mBAAmB,CAAC;YAC9B,KAAK;YACL,YAAY,EAAE,GAAG,UAAU,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,0BAA0B;YAC/E,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAC5B;gBACE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE;gBAClD,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE;gBAClD,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE;gBACvD,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE;aACtD,EACD,UAAU,CACX;SACF,CAAC,CAAC;IACL,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Auditoría para evaluar la presencia de esquemas de alto valor para RAG
|
|
3
|
+
*/
|
|
4
|
+
import { Audit } from '../audit.js';
|
|
5
|
+
import type { Artifacts, AuditMeta, AuditResult } from '../../types/index.js';
|
|
6
|
+
export declare class RagSchemaPresenceAudit extends Audit {
|
|
7
|
+
static meta: AuditMeta;
|
|
8
|
+
static audit(artifacts: Artifacts): Promise<AuditResult>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=rag-schema-presence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rag-schema-presence.d.ts","sourceRoot":"","sources":["../../../src/audits/structured-data/rag-schema-presence.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE9E,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,OAAuB,IAAI,EAAE,SAAS,CAOpC;WAE2B,KAAK,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;CAuC/E"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Auditoría para evaluar la presencia de esquemas de alto valor para RAG
|
|
3
|
+
*/
|
|
4
|
+
import { Audit } from '../audit.js';
|
|
5
|
+
export class RagSchemaPresenceAudit extends Audit {
|
|
6
|
+
static meta = {
|
|
7
|
+
id: 'rag-schema-presence',
|
|
8
|
+
title: 'La página implementa esquemas JSON-LD optimizados para RAG (FAQ, HowTo, Article)',
|
|
9
|
+
failureTitle: 'Faltan esquemas estructurados de alto valor para RAG',
|
|
10
|
+
description: 'Los esquemas como FAQPage, HowTo, QAPage y Article permiten a los Answer Engines extraer pares pregunta-respuesta y contenido estructurado directamente en sus respuestas sintetizadas.',
|
|
11
|
+
requiredArtifacts: ['JSONLD'],
|
|
12
|
+
};
|
|
13
|
+
static async audit(artifacts) {
|
|
14
|
+
const jsonld = artifacts.JSONLD;
|
|
15
|
+
const ragSchemas = [
|
|
16
|
+
{ name: 'FAQPage', present: jsonld.hasFAQPage, value: 'Pares Q&A directos' },
|
|
17
|
+
{ name: 'HowTo / QAPage', present: jsonld.hasHowTo || jsonld.hasQAPage, value: 'Instrucciones paso a paso' },
|
|
18
|
+
{ name: 'Article / TechArticle', present: jsonld.hasArticle, value: 'Metadatos de autoría y contenido' },
|
|
19
|
+
{ name: 'Organization / Product', present: jsonld.hasOrganization || jsonld.hasProduct, value: 'Entidad de negocio / producto' },
|
|
20
|
+
];
|
|
21
|
+
const presentCount = ragSchemas.filter((s) => s.present).length;
|
|
22
|
+
let score = 0;
|
|
23
|
+
if (presentCount >= 2) {
|
|
24
|
+
score = 1;
|
|
25
|
+
}
|
|
26
|
+
else if (presentCount === 1) {
|
|
27
|
+
score = 0.7;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
score = 0.2;
|
|
31
|
+
}
|
|
32
|
+
const tableItems = ragSchemas.map((s) => ({
|
|
33
|
+
schema: s.name,
|
|
34
|
+
status: s.present ? 'Implementado' : 'No encontrado',
|
|
35
|
+
benefit: s.value,
|
|
36
|
+
}));
|
|
37
|
+
return this.generateAuditResult({
|
|
38
|
+
score,
|
|
39
|
+
displayValue: `${presentCount} tipo(s) de esquema RAG detectados`,
|
|
40
|
+
details: this.makeTableDetails([
|
|
41
|
+
{ key: 'schema', label: 'Tipo de Esquema', valueType: 'code' },
|
|
42
|
+
{ key: 'status', label: 'Estado', valueType: 'status' },
|
|
43
|
+
{ key: 'benefit', label: 'Impacto en RAG / AEO', valueType: 'text' },
|
|
44
|
+
], tableItems),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=rag-schema-presence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rag-schema-presence.js","sourceRoot":"","sources":["../../../src/audits/structured-data/rag-schema-presence.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACxC,MAAM,CAAU,IAAI,GAAc;QACvC,EAAE,EAAE,qBAAqB;QACzB,KAAK,EAAE,kFAAkF;QACzF,YAAY,EAAE,sDAAsD;QACpE,WAAW,EACT,yLAAyL;QAC3L,iBAAiB,EAAE,CAAC,QAAQ,CAAC;KAC9B,CAAC;IAEK,MAAM,CAAU,KAAK,CAAC,KAAK,CAAC,SAAoB;QACrD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAEhC,MAAM,UAAU,GAAG;YACjB,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,oBAAoB,EAAE;YAC5E,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,2BAA2B,EAAE;YAC5G,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,kCAAkC,EAAE;YACxG,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,+BAA+B,EAAE;SACjI,CAAC;QAEF,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAChE,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;YACtB,KAAK,GAAG,CAAC,CAAC;QACZ,CAAC;aAAM,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;YAC9B,KAAK,GAAG,GAAG,CAAC;QACd,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,GAAG,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,MAAM,EAAE,CAAC,CAAC,IAAI;YACd,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe;YACpD,OAAO,EAAE,CAAC,CAAC,KAAK;SACjB,CAAC,CAAC,CAAC;QAEJ,OAAO,IAAI,CAAC,mBAAmB,CAAC;YAC9B,KAAK;YACL,YAAY,EAAE,GAAG,YAAY,oCAAoC;YACjE,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAC5B;gBACE,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,EAAE;gBAC9D,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE;gBACvD,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,EAAE;aACrE,EACD,UAAU,CACX;SACF,CAAC,CAAC;IACL,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Configuración por defecto de AEO Linter con ponderaciones de categorías y auditorías.
|
|
3
|
+
* Estructurado fielmente al modelo de configuración de Google Lighthouse (categories + auditRefs con weights).
|
|
4
|
+
*/
|
|
5
|
+
import type { LinterConfig } from '../types/config.js';
|
|
6
|
+
export declare const defaultConfig: LinterConfig;
|
|
7
|
+
//# sourceMappingURL=default-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-config.d.ts","sourceRoot":"","sources":["../../src/config/default-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,eAAO,MAAM,aAAa,EAAE,YAqE3B,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Configuración por defecto de AEO Linter con ponderaciones de categorías y auditorías.
|
|
3
|
+
* Estructurado fielmente al modelo de configuración de Google Lighthouse (categories + auditRefs con weights).
|
|
4
|
+
*/
|
|
5
|
+
export const defaultConfig = {
|
|
6
|
+
settings: {
|
|
7
|
+
locale: 'en-US',
|
|
8
|
+
maxWaitForFulfill: 15000,
|
|
9
|
+
},
|
|
10
|
+
categories: {
|
|
11
|
+
'ai-accessibility': {
|
|
12
|
+
title: 'AI Accessibility & Crawling',
|
|
13
|
+
description: 'Verifica que los agentes y rastreadores de IA (GPTBot, PerplexityBot, ClaudeBot, Google-Extended, etc.) tengan acceso sin restricciones innecesarias vía robots.txt y cabeceras HTTP.',
|
|
14
|
+
weight: 25,
|
|
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' },
|
|
19
|
+
],
|
|
20
|
+
},
|
|
21
|
+
'structured-data': {
|
|
22
|
+
title: 'Structured Data & RAG Schemas',
|
|
23
|
+
description: 'Audita esquemas JSON-LD optimizados para RAG (FAQPage, HowTo, Article, QAPage, sameAs) que enriquecen los grafos de conocimiento de los modelos de lenguaje.',
|
|
24
|
+
weight: 25,
|
|
25
|
+
auditRefs: [
|
|
26
|
+
{ id: 'jsonld-syntax-validity', weight: 8, group: 'schema' },
|
|
27
|
+
{ id: 'rag-schema-presence', weight: 8, group: 'schema' },
|
|
28
|
+
{ id: 'entity-sameas-links', weight: 4, group: 'knowledge-graph' },
|
|
29
|
+
],
|
|
30
|
+
},
|
|
31
|
+
'content-chunking': {
|
|
32
|
+
title: 'Content Chunking & Semantic Structure',
|
|
33
|
+
description: 'Evalúa la jerarquía H1-H3, la segmentación semántica (<article>, <section>, <main>) y la densidad de tokens por bloque para facilitar la tokenización y embeddings en RAG.',
|
|
34
|
+
weight: 25,
|
|
35
|
+
auditRefs: [
|
|
36
|
+
{ id: 'heading-hierarchy', weight: 8, group: 'structure' },
|
|
37
|
+
{ id: 'semantic-containers', weight: 6, group: 'structure' },
|
|
38
|
+
{ id: 'chunk-token-density', weight: 6, group: 'embeddings' },
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
'direct-answer-density': {
|
|
42
|
+
title: 'Direct Answer Density',
|
|
43
|
+
description: 'Detecta la concisión y presencia de respuestas directas e inmediatas a preguntas clave, optimizando la extracción para Answer Engines (Perplexity, SearchGPT, AI Overviews).',
|
|
44
|
+
weight: 25,
|
|
45
|
+
auditRefs: [
|
|
46
|
+
{ id: 'direct-definition-answering', weight: 10, group: 'answers' },
|
|
47
|
+
{ id: 'concise-answer-wordcount', weight: 6, group: 'answers' },
|
|
48
|
+
{ id: 'question-heading-alignment', weight: 4, group: 'answers' },
|
|
49
|
+
],
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
audits: [
|
|
53
|
+
// AI Accessibility
|
|
54
|
+
'ai-robots-txt',
|
|
55
|
+
'ai-x-robots-tag',
|
|
56
|
+
'ai-bot-sitemap',
|
|
57
|
+
// Structured Data
|
|
58
|
+
'jsonld-syntax-validity',
|
|
59
|
+
'rag-schema-presence',
|
|
60
|
+
'entity-sameas-links',
|
|
61
|
+
// Content Chunking
|
|
62
|
+
'heading-hierarchy',
|
|
63
|
+
'semantic-containers',
|
|
64
|
+
'chunk-token-density',
|
|
65
|
+
// Direct Answer Density
|
|
66
|
+
'direct-definition-answering',
|
|
67
|
+
'concise-answer-wordcount',
|
|
68
|
+
'question-heading-alignment',
|
|
69
|
+
],
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=default-config.js.map
|
|
@@ -0,0 +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,uLAAuL;YACzL,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,8JAA8J;YAChK,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,4KAA4K;YAC9K,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,8KAA8K;YAChL,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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Implementación de Driver basada en Fetch + Cheerio para entornos Node.js / CLI.
|
|
3
|
+
*/
|
|
4
|
+
import * as cheerio from 'cheerio';
|
|
5
|
+
import type { Driver } from '../../types/index.js';
|
|
6
|
+
export declare class CheerioDriver implements Driver {
|
|
7
|
+
private url;
|
|
8
|
+
private html;
|
|
9
|
+
private headers;
|
|
10
|
+
private $;
|
|
11
|
+
constructor(options: {
|
|
12
|
+
url: string;
|
|
13
|
+
html: string;
|
|
14
|
+
headers?: Record<string, string | string[]>;
|
|
15
|
+
});
|
|
16
|
+
static createFromUrl(targetUrl: string, fetchFn?: typeof fetch, options?: {
|
|
17
|
+
userAgent?: string;
|
|
18
|
+
headers?: Record<string, string>;
|
|
19
|
+
}): Promise<CheerioDriver>;
|
|
20
|
+
evaluate<T>(script: string | (() => T)): Promise<T>;
|
|
21
|
+
fetch(url: string, init?: RequestInit): Promise<Response>;
|
|
22
|
+
getUrl(): Promise<string>;
|
|
23
|
+
getHtml(): Promise<string>;
|
|
24
|
+
getHttpHeaders(): Promise<Record<string, string | string[]>>;
|
|
25
|
+
get$(): cheerio.CheerioAPI;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=cheerio-driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cheerio-driver.d.ts","sourceRoot":"","sources":["../../../src/gather/driver/cheerio-driver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,qBAAa,aAAc,YAAW,MAAM;IAC1C,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,CAAC,CAAqB;gBAElB,OAAO,EAAE;QACnB,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;KAC7C;WAOmB,aAAa,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,OAAO,KAAa,EAC7B,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GACjE,OAAO,CAAC,aAAa,CAAC;IAiCZ,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAOnD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIzD,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAIzB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAI1B,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAIlE,IAAI,IAAI,OAAO,CAAC,UAAU;CAGlC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Implementación de Driver basada en Fetch + Cheerio para entornos Node.js / CLI.
|
|
3
|
+
*/
|
|
4
|
+
import * as cheerio from 'cheerio';
|
|
5
|
+
export class CheerioDriver {
|
|
6
|
+
url;
|
|
7
|
+
html;
|
|
8
|
+
headers;
|
|
9
|
+
$;
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.url = options.url;
|
|
12
|
+
this.html = options.html;
|
|
13
|
+
this.headers = options.headers || {};
|
|
14
|
+
this.$ = cheerio.load(options.html);
|
|
15
|
+
}
|
|
16
|
+
static async createFromUrl(targetUrl, fetchFn = fetch, options) {
|
|
17
|
+
const defaultHeaders = {
|
|
18
|
+
'User-Agent': options?.userAgent ||
|
|
19
|
+
'Mozilla/5.0 (compatible; AEOLinter/1.0; +https://github.com/aeo-linter)',
|
|
20
|
+
Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
21
|
+
...options?.headers,
|
|
22
|
+
};
|
|
23
|
+
const res = await fetchFn(targetUrl, {
|
|
24
|
+
headers: defaultHeaders,
|
|
25
|
+
redirect: 'follow',
|
|
26
|
+
});
|
|
27
|
+
if (!res.ok) {
|
|
28
|
+
throw new Error(`Error HTTP ${res.status} al cargar ${targetUrl}: ${res.statusText}`);
|
|
29
|
+
}
|
|
30
|
+
const html = await res.text();
|
|
31
|
+
const finalUrl = res.url || targetUrl;
|
|
32
|
+
const headersRecord = {};
|
|
33
|
+
res.headers.forEach((val, key) => {
|
|
34
|
+
headersRecord[key.toLowerCase()] = val;
|
|
35
|
+
});
|
|
36
|
+
return new CheerioDriver({
|
|
37
|
+
url: finalUrl,
|
|
38
|
+
html,
|
|
39
|
+
headers: headersRecord,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async evaluate(script) {
|
|
43
|
+
if (typeof script === 'function') {
|
|
44
|
+
return script();
|
|
45
|
+
}
|
|
46
|
+
throw new Error('evaluate() con string no soportado en CheerioDriver');
|
|
47
|
+
}
|
|
48
|
+
async fetch(url, init) {
|
|
49
|
+
return fetch(url, init);
|
|
50
|
+
}
|
|
51
|
+
async getUrl() {
|
|
52
|
+
return this.url;
|
|
53
|
+
}
|
|
54
|
+
async getHtml() {
|
|
55
|
+
return this.html;
|
|
56
|
+
}
|
|
57
|
+
async getHttpHeaders() {
|
|
58
|
+
return this.headers;
|
|
59
|
+
}
|
|
60
|
+
get$() {
|
|
61
|
+
return this.$;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=cheerio-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cheerio-driver.js","sourceRoot":"","sources":["../../../src/gather/driver/cheerio-driver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAGnC,MAAM,OAAO,aAAa;IAChB,GAAG,CAAS;IACZ,IAAI,CAAS;IACb,OAAO,CAAoC;IAC3C,CAAC,CAAqB;IAE9B,YAAY,OAIX;QACC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,aAAa,CAC/B,SAAiB,EACjB,UAAwB,KAAK,EAC7B,OAAkE;QAElE,MAAM,cAAc,GAAG;YACrB,YAAY,EACV,OAAO,EAAE,SAAS;gBAClB,yEAAyE;YAC3E,MAAM,EAAE,iEAAiE;YACzE,GAAG,OAAO,EAAE,OAAO;SACpB,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE;YACnC,OAAO,EAAE,cAAc;YACvB,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,cAAc,GAAG,CAAC,MAAM,cAAc,SAAS,KAAK,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,IAAI,SAAS,CAAC;QAEtC,MAAM,aAAa,GAAsC,EAAE,CAAC;QAC5D,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC/B,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,GAAG,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,aAAa,CAAC;YACvB,GAAG,EAAE,QAAQ;YACb,IAAI;YACJ,OAAO,EAAE,aAAa;SACvB,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAI,MAA0B;QACjD,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,OAAO,MAAM,EAAE,CAAC;QAClB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,IAAkB;QAChD,OAAO,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEM,KAAK,CAAC,MAAM;QACjB,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,OAAO;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAEM,KAAK,CAAC,cAAc;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAEM,IAAI;QACT,OAAO,IAAI,CAAC,CAAC,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Clase base abstracta para Gatherers en el pipeline de AEO Linter.
|
|
3
|
+
*/
|
|
4
|
+
import type { Artifacts, IGatherer, GathererContext } from '../types/index.js';
|
|
5
|
+
export declare abstract class Gatherer<K extends keyof Artifacts = keyof Artifacts> implements IGatherer<K> {
|
|
6
|
+
abstract readonly name: K;
|
|
7
|
+
/**
|
|
8
|
+
* Extrae el artefacto crudo usando el driver/CDP del contexto
|
|
9
|
+
*/
|
|
10
|
+
abstract getArtifact(context: GathererContext): Promise<Artifacts[K]>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=gatherer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gatherer.d.ts","sourceRoot":"","sources":["../../src/gather/gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE/E,8BAAsB,QAAQ,CAAC,CAAC,SAAS,MAAM,SAAS,GAAG,MAAM,SAAS,CAAE,YAAW,SAAS,CAAC,CAAC,CAAC;IACjG,kBAAyB,IAAI,EAAE,CAAC,CAAC;IAEjC;;OAEG;aACa,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;CAC7E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gatherer.js","sourceRoot":"","sources":["../../src/gather/gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,OAAgB,QAAQ;CAO7B"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview ContentChunksGatherer para segmentación semántica de contenido y estimación de tokens para RAG.
|
|
3
|
+
*/
|
|
4
|
+
import { Gatherer } from '../gatherer.js';
|
|
5
|
+
import type { ContentChunksArtifact, GathererContext } from '../../types/index.js';
|
|
6
|
+
export declare class ContentChunksGatherer extends Gatherer<'ContentChunks'> {
|
|
7
|
+
readonly name: "ContentChunks";
|
|
8
|
+
getArtifact(context: GathererContext): Promise<ContentChunksArtifact>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=content-chunks-gatherer.d.ts.map
|
|
@@ -0,0 +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;CAmG5F"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview ContentChunksGatherer para segmentación semántica de contenido y estimación de tokens para RAG.
|
|
3
|
+
*/
|
|
4
|
+
import * as cheerio from 'cheerio';
|
|
5
|
+
import { Gatherer } from '../gatherer.js';
|
|
6
|
+
export class ContentChunksGatherer extends Gatherer {
|
|
7
|
+
name = 'ContentChunks';
|
|
8
|
+
async getArtifact(context) {
|
|
9
|
+
const html = await context.driver.getHtml();
|
|
10
|
+
const $ = cheerio.load(html);
|
|
11
|
+
// Remover scripts, styles, navs redundantes para el análisis de contenido textual
|
|
12
|
+
$('script, style, noscript, svg, nav, footer, header').remove();
|
|
13
|
+
const semanticTagsUsed = [];
|
|
14
|
+
if ($('main').length > 0)
|
|
15
|
+
semanticTagsUsed.push('main');
|
|
16
|
+
if ($('article').length > 0)
|
|
17
|
+
semanticTagsUsed.push('article');
|
|
18
|
+
if ($('section').length > 0)
|
|
19
|
+
semanticTagsUsed.push('section');
|
|
20
|
+
const chunks = [];
|
|
21
|
+
let chunkCounter = 0;
|
|
22
|
+
// Buscar secciones o elementos principales
|
|
23
|
+
const contentContainers = $('article, section, main');
|
|
24
|
+
const targetElements = contentContainers.length > 0 ? contentContainers : $('body');
|
|
25
|
+
targetElements.each((_, container) => {
|
|
26
|
+
const containerTag = container.tagName.toLowerCase();
|
|
27
|
+
const isSemantic = ['article', 'section', 'main'].includes(containerTag);
|
|
28
|
+
// Dividir el contenedor por encabezados internos o párrafos
|
|
29
|
+
const subNodes = $(container).children('h1, h2, h3, h4, p, ul, ol, table, pre');
|
|
30
|
+
let currentHeading = undefined;
|
|
31
|
+
let bufferText = '';
|
|
32
|
+
let hasList = false;
|
|
33
|
+
let hasTable = false;
|
|
34
|
+
let hasCode = false;
|
|
35
|
+
const flushChunk = () => {
|
|
36
|
+
const text = bufferText.trim().replace(/\s+/g, ' ');
|
|
37
|
+
if (!text)
|
|
38
|
+
return;
|
|
39
|
+
const words = text.split(/\s+/).filter(Boolean);
|
|
40
|
+
const wordCount = words.length;
|
|
41
|
+
if (wordCount < 10)
|
|
42
|
+
return; // Ignorar fragmentos irrelevantes
|
|
43
|
+
const estimatedTokens = Math.round(wordCount * 1.3);
|
|
44
|
+
chunks.push({
|
|
45
|
+
id: `chunk-${++chunkCounter}`,
|
|
46
|
+
headingText: currentHeading?.text,
|
|
47
|
+
headingLevel: currentHeading?.level,
|
|
48
|
+
text,
|
|
49
|
+
wordCount,
|
|
50
|
+
estimatedTokens,
|
|
51
|
+
parentTag: containerTag,
|
|
52
|
+
hasList,
|
|
53
|
+
hasTable,
|
|
54
|
+
hasCode,
|
|
55
|
+
isSemanticContainer: isSemantic,
|
|
56
|
+
});
|
|
57
|
+
bufferText = '';
|
|
58
|
+
hasList = false;
|
|
59
|
+
hasTable = false;
|
|
60
|
+
hasCode = false;
|
|
61
|
+
};
|
|
62
|
+
subNodes.each((_, el) => {
|
|
63
|
+
const tag = el.tagName.toLowerCase();
|
|
64
|
+
if (tag.startsWith('h')) {
|
|
65
|
+
flushChunk();
|
|
66
|
+
const level = parseInt(tag.charAt(1), 10);
|
|
67
|
+
currentHeading = { text: $(el).text().trim(), level };
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
if (['ul', 'ol'].includes(tag))
|
|
71
|
+
hasList = true;
|
|
72
|
+
if (tag === 'table')
|
|
73
|
+
hasTable = true;
|
|
74
|
+
if (tag === 'pre' || $(el).find('code').length > 0)
|
|
75
|
+
hasCode = true;
|
|
76
|
+
bufferText += ' ' + $(el).text().trim();
|
|
77
|
+
// Si el chunk supera ~350 palabras, creamos un sub-chunk para embeddings
|
|
78
|
+
if (bufferText.split(/\s+/).length > 350) {
|
|
79
|
+
flushChunk();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
flushChunk();
|
|
84
|
+
});
|
|
85
|
+
const totalWordCount = chunks.reduce((sum, c) => sum + c.wordCount, 0);
|
|
86
|
+
const totalEstimatedTokens = chunks.reduce((sum, c) => sum + c.estimatedTokens, 0);
|
|
87
|
+
const averageChunkTokenCount = chunks.length > 0 ? Math.round(totalEstimatedTokens / chunks.length) : 0;
|
|
88
|
+
return {
|
|
89
|
+
chunks,
|
|
90
|
+
totalWordCount,
|
|
91
|
+
totalEstimatedTokens,
|
|
92
|
+
averageChunkTokenCount,
|
|
93
|
+
semanticTagsUsed,
|
|
94
|
+
hasSemanticMain: $('main').length > 0,
|
|
95
|
+
hasSemanticArticle: $('article').length > 0,
|
|
96
|
+
hasSemanticSections: $('section').length > 0,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=content-chunks-gatherer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-chunks-gatherer.js","sourceRoot":"","sources":["../../../src/gather/gatherers/content-chunks-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,kFAAkF;QAClF,CAAC,CAAC,mDAAmD,CAAC,CAAC,MAAM,EAAE,CAAC;QAEhE,MAAM,gBAAgB,GAAa,EAAE,CAAC;QACtC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE9D,MAAM,MAAM,GAAmB,EAAE,CAAC;QAClC,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,2CAA2C;QAC3C,MAAM,iBAAiB,GAAG,CAAC,CAAC,wBAAwB,CAAC,CAAC;QACtD,MAAM,cAAc,GAAG,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAEpF,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE;YACnC,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACrD,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAEzE,4DAA4D;YAC5D,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC,CAAC;YAEhF,IAAI,cAAc,GAAgD,SAAS,CAAC;YAC5E,IAAI,UAAU,GAAG,EAAE,CAAC;YACpB,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,OAAO,GAAG,KAAK,CAAC;YAEpB,MAAM,UAAU,GAAG,GAAG,EAAE;gBACtB,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBACpD,IAAI,CAAC,IAAI;oBAAE,OAAO;gBAElB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAChD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC/B,IAAI,SAAS,GAAG,EAAE;oBAAE,OAAO,CAAC,kCAAkC;gBAE9D,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;gBAEpD,MAAM,CAAC,IAAI,CAAC;oBACV,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE;oBAC7B,WAAW,EAAE,cAAc,EAAE,IAAI;oBACjC,YAAY,EAAE,cAAc,EAAE,KAAK;oBACnC,IAAI;oBACJ,SAAS;oBACT,eAAe;oBACf,SAAS,EAAE,YAAY;oBACvB,OAAO;oBACP,QAAQ;oBACR,OAAO;oBACP,mBAAmB,EAAE,UAAU;iBAChC,CAAC,CAAC;gBAEH,UAAU,GAAG,EAAE,CAAC;gBAChB,OAAO,GAAG,KAAK,CAAC;gBAChB,QAAQ,GAAG,KAAK,CAAC;gBACjB,OAAO,GAAG,KAAK,CAAC;YAClB,CAAC,CAAC;YAEF,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;gBACtB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBACrC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxB,UAAU,EAAE,CAAC;oBACb,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC1C,cAAc,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC;gBACxD,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;wBAAE,OAAO,GAAG,IAAI,CAAC;oBAC/C,IAAI,GAAG,KAAK,OAAO;wBAAE,QAAQ,GAAG,IAAI,CAAC;oBACrC,IAAI,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;wBAAE,OAAO,GAAG,IAAI,CAAC;oBAEnE,UAAU,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;oBACxC,yEAAyE;oBACzE,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;wBACzC,UAAU,EAAE,CAAC;oBACf,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,UAAU,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACvE,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;QACnF,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAExG,OAAO;YACL,MAAM;YACN,cAAc;YACd,oBAAoB;YACpB,sBAAsB;YACtB,gBAAgB;YAChB,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;YACrC,kBAAkB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC;YAC3C,mBAAmB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC;SAC7C,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview DirectAnswersGatherer para detectar patrones de preguntas clave y respuestas concisas inmediatas.
|
|
3
|
+
*/
|
|
4
|
+
import { Gatherer } from '../gatherer.js';
|
|
5
|
+
import type { DirectAnswersArtifact, GathererContext } from '../../types/index.js';
|
|
6
|
+
export declare class DirectAnswersGatherer extends Gatherer<'DirectAnswers'> {
|
|
7
|
+
readonly name: "DirectAnswers";
|
|
8
|
+
getArtifact(context: GathererContext): Promise<DirectAnswersArtifact>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=direct-answers-gatherer.d.ts.map
|
|
@@ -0,0 +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;CAyD5F"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview DirectAnswersGatherer para detectar patrones de preguntas clave y respuestas concisas inmediatas.
|
|
3
|
+
*/
|
|
4
|
+
import * as cheerio from 'cheerio';
|
|
5
|
+
import { Gatherer } from '../gatherer.js';
|
|
6
|
+
export class DirectAnswersGatherer extends Gatherer {
|
|
7
|
+
name = 'DirectAnswers';
|
|
8
|
+
async getArtifact(context) {
|
|
9
|
+
const html = await context.driver.getHtml();
|
|
10
|
+
const $ = cheerio.load(html);
|
|
11
|
+
const pairs = [];
|
|
12
|
+
let definitionPatternsFound = 0;
|
|
13
|
+
const questionWordsRegex = /^(¿|\?|qué|que|cómo|como|por qué|porque|cuál|cual|cuándo|cuando|dónde|donde|quién|quien|what|how|why|when|where|who|which|is|are|can|do|does)\b/i;
|
|
14
|
+
const definitionRegex = /\b(es un|es una|es el|es la|son los|son las|se refiere a|se define como|consiste en|hace referencia a|is a|is an|is the|are the|refers to|is defined as|means)\b/i;
|
|
15
|
+
$('h1, h2, h3, h4').each((_, el) => {
|
|
16
|
+
const headingText = $(el).text().trim();
|
|
17
|
+
const isQuestion = headingText.includes('?') || questionWordsRegex.test(headingText);
|
|
18
|
+
if (isQuestion) {
|
|
19
|
+
// Encontrar el siguiente párrafo o lista
|
|
20
|
+
const nextElem = $(el).nextAll('p, ul, ol').first();
|
|
21
|
+
if (nextElem.length > 0) {
|
|
22
|
+
const answerText = nextElem.text().trim().replace(/\s+/g, ' ');
|
|
23
|
+
const words = answerText.split(/\s+/).filter(Boolean);
|
|
24
|
+
const answerWordCount = words.length;
|
|
25
|
+
// Conciso para Answer Engines: típicamente entre 20 y 75 palabras (ideal 30-60)
|
|
26
|
+
const isConcise = answerWordCount >= 20 && answerWordCount <= 75;
|
|
27
|
+
const hasDirectDefinition = definitionRegex.test(answerText.slice(0, 150));
|
|
28
|
+
if (hasDirectDefinition) {
|
|
29
|
+
definitionPatternsFound++;
|
|
30
|
+
}
|
|
31
|
+
let confidence = 0.5;
|
|
32
|
+
if (isConcise)
|
|
33
|
+
confidence += 0.3;
|
|
34
|
+
if (hasDirectDefinition)
|
|
35
|
+
confidence += 0.2;
|
|
36
|
+
pairs.push({
|
|
37
|
+
question: headingText,
|
|
38
|
+
questionSource: 'heading',
|
|
39
|
+
answerText,
|
|
40
|
+
answerWordCount,
|
|
41
|
+
isConcise,
|
|
42
|
+
hasDirectDefinition,
|
|
43
|
+
confidenceScore: Math.min(confidence, 1.0),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
const conciseAnswersCount = pairs.filter((p) => p.isConcise).length;
|
|
49
|
+
const directAnswerRatio = pairs.length > 0 ? conciseAnswersCount / pairs.length : 0;
|
|
50
|
+
return {
|
|
51
|
+
pairs,
|
|
52
|
+
directAnswerRatio,
|
|
53
|
+
conciseAnswersCount,
|
|
54
|
+
definitionPatternsFound,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=direct-answers-gatherer.js.map
|
|
@@ -0,0 +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,kJAAkJ,CAAC;QAC9K,MAAM,eAAe,GAAG,mKAAmK,CAAC;QAE5L,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,yCAAyC;gBACzC,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,gFAAgF;oBAChF,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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview HeadingsHierarchyGatherer para evaluar la jerarquía y secuencia H1-H6.
|
|
3
|
+
*/
|
|
4
|
+
import { Gatherer } from '../gatherer.js';
|
|
5
|
+
import type { HeadingsHierarchyArtifact, GathererContext } from '../../types/index.js';
|
|
6
|
+
export declare class HeadingsHierarchyGatherer extends Gatherer<'HeadingsHierarchy'> {
|
|
7
|
+
readonly name: "HeadingsHierarchy";
|
|
8
|
+
getArtifact(context: GathererContext): Promise<HeadingsHierarchyArtifact>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=headings-hierarchy-gatherer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headings-hierarchy-gatherer.d.ts","sourceRoot":"","sources":["../../../src/gather/gatherers/headings-hierarchy-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,yBAAyB,EAAe,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEpG,qBAAa,yBAA0B,SAAQ,QAAQ,CAAC,mBAAmB,CAAC;IAC1E,SAAyB,IAAI,EAAG,mBAAmB,CAAU;IAEvC,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,yBAAyB,CAAC;CAwDhG"}
|