geopilot 0.0.0-stage → 0.0.1-bootstrap.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/LICENSE +202 -0
- package/README.md +72 -2
- package/dist/agent/install.d.ts +23 -0
- package/dist/agent/install.js +75 -0
- package/dist/agent/install.js.map +1 -0
- package/dist/cache/runs.d.ts +18 -0
- package/dist/cache/runs.js +91 -0
- package/dist/cache/runs.js.map +1 -0
- package/dist/cli/args.d.ts +20 -0
- package/dist/cli/args.js +116 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +2 -0
- package/dist/cli/commands/agent.js +48 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/fix.d.ts +2 -0
- package/dist/cli/commands/fix.js +284 -0
- package/dist/cli/commands/fix.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.js +62 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/insights.d.ts +17 -0
- package/dist/cli/commands/insights.js +143 -0
- package/dist/cli/commands/insights.js.map +1 -0
- package/dist/cli/commands/rules.d.ts +5 -0
- package/dist/cli/commands/rules.js +86 -0
- package/dist/cli/commands/rules.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +14 -0
- package/dist/cli/commands/scan.js +127 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands-list.d.ts +6 -0
- package/dist/cli/commands-list.js +15 -0
- package/dist/cli/commands-list.js.map +1 -0
- package/dist/cli/context.d.ts +26 -0
- package/dist/cli/context.js +108 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/io.d.ts +16 -0
- package/dist/cli/io.js +28 -0
- package/dist/cli/io.js.map +1 -0
- package/dist/cli/main.d.ts +15 -0
- package/dist/cli/main.js +118 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/collect/crawl.d.ts +51 -0
- package/dist/collect/crawl.js +187 -0
- package/dist/collect/crawl.js.map +1 -0
- package/dist/config/config.d.ts +86 -0
- package/dist/config/config.js +396 -0
- package/dist/config/config.js.map +1 -0
- package/dist/core/errors.d.ts +20 -0
- package/dist/core/errors.js +32 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/hash.d.ts +7 -0
- package/dist/core/hash.js +28 -0
- package/dist/core/hash.js.map +1 -0
- package/dist/core/redact.d.ts +3 -0
- package/dist/core/redact.js +23 -0
- package/dist/core/redact.js.map +1 -0
- package/dist/core/tty.d.ts +12 -0
- package/dist/core/tty.js +33 -0
- package/dist/core/tty.js.map +1 -0
- package/dist/core/version.d.ts +6 -0
- package/dist/core/version.js +10 -0
- package/dist/core/version.js.map +1 -0
- package/dist/fix/apply.d.ts +119 -0
- package/dist/fix/apply.js +334 -0
- package/dist/fix/apply.js.map +1 -0
- package/dist/fix/diff.d.ts +1 -0
- package/dist/fix/diff.js +35 -0
- package/dist/fix/diff.js.map +1 -0
- package/dist/fix/plan.d.ts +42 -0
- package/dist/fix/plan.js +385 -0
- package/dist/fix/plan.js.map +1 -0
- package/dist/fix/serve.d.ts +13 -0
- package/dist/fix/serve.js +112 -0
- package/dist/fix/serve.js.map +1 -0
- package/dist/fix/variants.d.ts +13 -0
- package/dist/fix/variants.js +8 -0
- package/dist/fix/variants.js.map +1 -0
- package/dist/frameworks/ast.d.ts +84 -0
- package/dist/frameworks/ast.js +231 -0
- package/dist/frameworks/ast.js.map +1 -0
- package/dist/frameworks/nextjs-app/analyze.d.ts +92 -0
- package/dist/frameworks/nextjs-app/analyze.js +350 -0
- package/dist/frameworks/nextjs-app/analyze.js.map +1 -0
- package/dist/frameworks/static/analyze.d.ts +18 -0
- package/dist/frameworks/static/analyze.js +66 -0
- package/dist/frameworks/static/analyze.js.map +1 -0
- package/dist/html/parse.d.ts +50 -0
- package/dist/html/parse.js +205 -0
- package/dist/html/parse.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/insights/validate.d.ts +74 -0
- package/dist/insights/validate.js +213 -0
- package/dist/insights/validate.js.map +1 -0
- package/dist/net/address.d.ts +10 -0
- package/dist/net/address.js +116 -0
- package/dist/net/address.js.map +1 -0
- package/dist/net/fetch.d.ts +53 -0
- package/dist/net/fetch.js +281 -0
- package/dist/net/fetch.js.map +1 -0
- package/dist/repo/detect.d.ts +3 -0
- package/dist/repo/detect.js +92 -0
- package/dist/repo/detect.js.map +1 -0
- package/dist/repo/reader.d.ts +12 -0
- package/dist/repo/reader.js +97 -0
- package/dist/repo/reader.js.map +1 -0
- package/dist/report/render.d.ts +20 -0
- package/dist/report/render.js +176 -0
- package/dist/report/render.js.map +1 -0
- package/dist/robots/crawlers.d.ts +10 -0
- package/dist/robots/crawlers.js +20 -0
- package/dist/robots/crawlers.js.map +1 -0
- package/dist/robots/robots.d.ts +33 -0
- package/dist/robots/robots.js +133 -0
- package/dist/robots/robots.js.map +1 -0
- package/dist/rules/catalogue.d.ts +43 -0
- package/dist/rules/catalogue.js +361 -0
- package/dist/rules/catalogue.js.map +1 -0
- package/dist/rules/context.d.ts +36 -0
- package/dist/rules/context.js +129 -0
- package/dist/rules/context.js.map +1 -0
- package/dist/rules/evaluate.d.ts +11 -0
- package/dist/rules/evaluate.js +1070 -0
- package/dist/rules/evaluate.js.map +1 -0
- package/dist/rules/finalize.d.ts +34 -0
- package/dist/rules/finalize.js +93 -0
- package/dist/rules/finalize.js.map +1 -0
- package/dist/scan.d.ts +27 -0
- package/dist/scan.js +147 -0
- package/dist/scan.js.map +1 -0
- package/dist/scoring/compare.d.ts +21 -0
- package/dist/scoring/compare.js +47 -0
- package/dist/scoring/compare.js.map +1 -0
- package/dist/scoring/score.d.ts +21 -0
- package/dist/scoring/score.js +112 -0
- package/dist/scoring/score.js.map +1 -0
- package/dist/sitemap/sitemap.d.ts +10 -0
- package/dist/sitemap/sitemap.js +48 -0
- package/dist/sitemap/sitemap.js.map +1 -0
- package/dist/types.d.ts +155 -0
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -0
- package/hosts/claude-project/.claude/agents/geopilot-explainer.md +36 -0
- package/hosts/claude-project/.claude/agents/geopilot-fixer.md +42 -0
- package/hosts/claude-project/.claude/agents/geopilot-investigator.md +45 -0
- package/hosts/claude-project/.claude/agents/geopilot-reviewer.md +41 -0
- package/hosts/claude-project/.claude/agents/geopilot-scanner.md +47 -0
- package/hosts/claude-project/.claude/skills/geo/SKILL.md +95 -0
- package/hosts/claude-project/.claude/skills/geo/references/frameworks.md +20 -0
- package/hosts/claude-project/.claude/skills/geo/references/insight-contract.md +42 -0
- package/hosts/claude-project/.claude/skills/geo/references/safety.md +30 -0
- package/hosts/claude-project/.claude/skills/geo/references/workflow-explain.md +8 -0
- package/hosts/claude-project/.claude/skills/geo/references/workflow-fix.md +20 -0
- package/hosts/claude-project/.claude/skills/geo/references/workflow-init.md +6 -0
- package/hosts/claude-project/.claude/skills/geo/references/workflow-insights.md +13 -0
- package/hosts/claude-project/.claude/skills/geo/references/workflow-plan.md +13 -0
- package/hosts/claude-project/.claude/skills/geo/references/workflow-review.md +8 -0
- package/hosts/claude-project/.claude/skills/geo/references/workflow-scan.md +18 -0
- package/hosts/claude-project/.claude/skills/geo/schemas/insights.schema.json +255 -0
- package/hosts/claude-project/.claude/skills/geo/scripts/geo.ps1 +11 -0
- package/hosts/claude-project/.claude/skills/geo/scripts/geo.sh +11 -0
- package/hosts/claude-project/.claude/skills/geopilot-explain/SKILL.md +9 -0
- package/hosts/claude-project/.claude/skills/geopilot-fix/SKILL.md +12 -0
- package/hosts/claude-project/.claude/skills/geopilot-init/SKILL.md +15 -0
- package/hosts/claude-project/.claude/skills/geopilot-insights/SKILL.md +11 -0
- package/hosts/claude-project/.claude/skills/geopilot-review/SKILL.md +11 -0
- package/hosts/claude-project/.claude/skills/geopilot-scan/SKILL.md +11 -0
- package/hosts/geopilot/.claude-plugin/plugin.json +22 -0
- package/hosts/geopilot/README.md +25 -0
- package/hosts/geopilot/agents/explainer.agent.md +36 -0
- package/hosts/geopilot/agents/fixer.agent.md +42 -0
- package/hosts/geopilot/agents/investigator.agent.md +45 -0
- package/hosts/geopilot/agents/reviewer.agent.md +41 -0
- package/hosts/geopilot/agents/scanner.agent.md +47 -0
- package/hosts/geopilot/assets/icon.png +0 -0
- package/hosts/geopilot/skills/explain/SKILL.md +9 -0
- package/hosts/geopilot/skills/fix/SKILL.md +12 -0
- package/hosts/geopilot/skills/geo/SKILL.md +95 -0
- package/hosts/geopilot/skills/geo/references/frameworks.md +20 -0
- package/hosts/geopilot/skills/geo/references/insight-contract.md +42 -0
- package/hosts/geopilot/skills/geo/references/safety.md +30 -0
- package/hosts/geopilot/skills/geo/references/workflow-explain.md +8 -0
- package/hosts/geopilot/skills/geo/references/workflow-fix.md +20 -0
- package/hosts/geopilot/skills/geo/references/workflow-init.md +6 -0
- package/hosts/geopilot/skills/geo/references/workflow-insights.md +13 -0
- package/hosts/geopilot/skills/geo/references/workflow-plan.md +13 -0
- package/hosts/geopilot/skills/geo/references/workflow-review.md +8 -0
- package/hosts/geopilot/skills/geo/references/workflow-scan.md +18 -0
- package/hosts/geopilot/skills/geo/schemas/insights.schema.json +255 -0
- package/hosts/geopilot/skills/geo/scripts/geo.ps1 +11 -0
- package/hosts/geopilot/skills/geo/scripts/geo.sh +11 -0
- package/hosts/geopilot/skills/init/SKILL.md +15 -0
- package/hosts/geopilot/skills/insights/SKILL.md +11 -0
- package/hosts/geopilot/skills/review/SKILL.md +11 -0
- package/hosts/geopilot/skills/scan/SKILL.md +11 -0
- package/hosts/opencode/.opencode/agents/geopilot-explainer.md +39 -0
- package/hosts/opencode/.opencode/agents/geopilot-fixer.md +45 -0
- package/hosts/opencode/.opencode/agents/geopilot-investigator.md +48 -0
- package/hosts/opencode/.opencode/agents/geopilot-reviewer.md +44 -0
- package/hosts/opencode/.opencode/agents/geopilot-scanner.md +50 -0
- package/hosts/opencode/.opencode/commands/geopilot-explain.md +8 -0
- package/hosts/opencode/.opencode/commands/geopilot-fix.md +10 -0
- package/hosts/opencode/.opencode/commands/geopilot-init.md +12 -0
- package/hosts/opencode/.opencode/commands/geopilot-insights.md +10 -0
- package/hosts/opencode/.opencode/commands/geopilot-review.md +10 -0
- package/hosts/opencode/.opencode/commands/geopilot-scan.md +10 -0
- package/hosts/opencode/.opencode/skills/geo/SKILL.md +95 -0
- package/hosts/opencode/.opencode/skills/geo/references/frameworks.md +20 -0
- package/hosts/opencode/.opencode/skills/geo/references/insight-contract.md +42 -0
- package/hosts/opencode/.opencode/skills/geo/references/safety.md +30 -0
- package/hosts/opencode/.opencode/skills/geo/references/workflow-explain.md +8 -0
- package/hosts/opencode/.opencode/skills/geo/references/workflow-fix.md +20 -0
- package/hosts/opencode/.opencode/skills/geo/references/workflow-init.md +6 -0
- package/hosts/opencode/.opencode/skills/geo/references/workflow-insights.md +13 -0
- package/hosts/opencode/.opencode/skills/geo/references/workflow-plan.md +13 -0
- package/hosts/opencode/.opencode/skills/geo/references/workflow-review.md +8 -0
- package/hosts/opencode/.opencode/skills/geo/references/workflow-scan.md +18 -0
- package/hosts/opencode/.opencode/skills/geo/schemas/insights.schema.json +255 -0
- package/hosts/opencode/.opencode/skills/geo/scripts/geo.ps1 +11 -0
- package/hosts/opencode/.opencode/skills/geo/scripts/geo.sh +11 -0
- package/package.json +65 -4
- package/schemas/config-v1.json +392 -0
- package/schemas/insights-v1.json +255 -0
- package/schemas/merged-v1.json +71 -0
- package/schemas/report-v1.json +836 -0
- package/skill/geo/SKILL.md +95 -0
- package/skill/geo/references/frameworks.md +20 -0
- package/skill/geo/references/insight-contract.md +42 -0
- package/skill/geo/references/safety.md +30 -0
- package/skill/geo/references/workflow-explain.md +8 -0
- package/skill/geo/references/workflow-fix.md +20 -0
- package/skill/geo/references/workflow-init.md +6 -0
- package/skill/geo/references/workflow-insights.md +13 -0
- package/skill/geo/references/workflow-plan.md +13 -0
- package/skill/geo/references/workflow-review.md +8 -0
- package/skill/geo/references/workflow-scan.md +18 -0
- package/skill/geo/schemas/insights.schema.json +255 -0
- package/skill/geo/scripts/geo.ps1 +11 -0
- package/skill/geo/scripts/geo.sh +11 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// A tolerant HTML tokenizer: enough of the WHATWG tokenizer to read the head
|
|
2
|
+
// and the links of a served document without a dependency. It understands
|
|
3
|
+
// comments, doctype, raw-text elements (script, style, textarea, title),
|
|
4
|
+
// quoted/unquoted attributes and character references in attribute values and
|
|
5
|
+
// text. It does not build a tree; callers ask for elements by name.
|
|
6
|
+
const RAW_TEXT = new Set(['script', 'style', 'title', 'textarea', 'xmp', 'iframe', 'noembed', 'noframes']);
|
|
7
|
+
const NAMED = { amp: '&', lt: '<', gt: '>', quot: '"', apos: "'", nbsp: ' ', copy: '©', reg: '®', hellip: '…', mdash: '—', ndash: '–', rsquo: '’', lsquo: '‘', rdquo: '”', ldquo: '“' };
|
|
8
|
+
export function decodeEntities(text) {
|
|
9
|
+
return text.replace(/&(#x[0-9a-f]+|#\d+|[a-z]+);?/gi, (m, ref) => {
|
|
10
|
+
if (ref[0] === '#') {
|
|
11
|
+
const code = ref[1] === 'x' || ref[1] === 'X' ? parseInt(ref.slice(2), 16) : parseInt(ref.slice(1), 10);
|
|
12
|
+
return Number.isFinite(code) && code > 0 && code < 0x110000 ? String.fromCodePoint(code) : m;
|
|
13
|
+
}
|
|
14
|
+
return NAMED[ref.toLowerCase()] ?? m;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function parseAttrs(src, from, to) {
|
|
18
|
+
const attrs = new Map();
|
|
19
|
+
const re = /([^\s"'>\/=]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'=<>`]+)))?/g;
|
|
20
|
+
re.lastIndex = from;
|
|
21
|
+
const body = src.slice(0, to);
|
|
22
|
+
let m;
|
|
23
|
+
while ((m = re.exec(body)) !== null) {
|
|
24
|
+
const name = m[1].toLowerCase();
|
|
25
|
+
if (!attrs.has(name))
|
|
26
|
+
attrs.set(name, decodeEntities(m[2] ?? m[3] ?? m[4] ?? ''));
|
|
27
|
+
}
|
|
28
|
+
return attrs;
|
|
29
|
+
}
|
|
30
|
+
/** Index of the `>` closing a tag that starts at `from`, honouring quotes. */
|
|
31
|
+
function tagEnd(src, from) {
|
|
32
|
+
let quote = null;
|
|
33
|
+
for (let i = from; i < src.length; i++) {
|
|
34
|
+
const c = src[i];
|
|
35
|
+
if (quote) {
|
|
36
|
+
if (c === quote)
|
|
37
|
+
quote = null;
|
|
38
|
+
}
|
|
39
|
+
else if (c === '"' || c === "'") {
|
|
40
|
+
quote = c;
|
|
41
|
+
}
|
|
42
|
+
else if (c === '>') {
|
|
43
|
+
return i;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return -1;
|
|
47
|
+
}
|
|
48
|
+
export function parseHtml(source) {
|
|
49
|
+
const elements = [];
|
|
50
|
+
const text = [];
|
|
51
|
+
let i = 0;
|
|
52
|
+
let inHead = true;
|
|
53
|
+
let noscript = 0;
|
|
54
|
+
const n = source.length;
|
|
55
|
+
while (i < n) {
|
|
56
|
+
const lt = source.indexOf('<', i);
|
|
57
|
+
if (lt === -1) {
|
|
58
|
+
text.push(source.slice(i));
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
if (lt > i)
|
|
62
|
+
text.push(source.slice(i, lt));
|
|
63
|
+
if (source.startsWith('<!--', lt)) {
|
|
64
|
+
const close = source.indexOf('-->', lt + 4);
|
|
65
|
+
i = close === -1 ? n : close + 3;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (source[lt + 1] === '!' || source[lt + 1] === '?') {
|
|
69
|
+
const close = source.indexOf('>', lt);
|
|
70
|
+
i = close === -1 ? n : close + 1;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
const closing = source[lt + 1] === '/';
|
|
74
|
+
const nameMatch = /^[a-zA-Z][^\s\/>]*/.exec(source.slice(lt + (closing ? 2 : 1), lt + 64));
|
|
75
|
+
if (!nameMatch) {
|
|
76
|
+
text.push('<');
|
|
77
|
+
i = lt + 1;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const name = nameMatch[0].toLowerCase();
|
|
81
|
+
const end = tagEnd(source, lt);
|
|
82
|
+
if (end === -1)
|
|
83
|
+
break;
|
|
84
|
+
if (closing) {
|
|
85
|
+
if (name === 'head')
|
|
86
|
+
inHead = false;
|
|
87
|
+
if (name === 'noscript' && noscript > 0)
|
|
88
|
+
noscript--;
|
|
89
|
+
i = end + 1;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (name === 'body')
|
|
93
|
+
inHead = false;
|
|
94
|
+
const attrs = parseAttrs(source, lt + 1 + name.length, end);
|
|
95
|
+
if (RAW_TEXT.has(name)) {
|
|
96
|
+
const closeRe = new RegExp(`</${name}\\s*>`, 'i');
|
|
97
|
+
const rest = source.slice(end + 1);
|
|
98
|
+
const m = closeRe.exec(rest);
|
|
99
|
+
const inner = m ? rest.slice(0, m.index) : rest;
|
|
100
|
+
elements.push({ name, attrs, start: lt, end: end + 1, text: inner, inHead, depthInNoscript: noscript > 0 });
|
|
101
|
+
if (name === 'title' || name === 'textarea')
|
|
102
|
+
text.push(` ${inner} `);
|
|
103
|
+
i = m ? end + 1 + m.index + m[0].length : n;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (name === 'noscript')
|
|
107
|
+
noscript++;
|
|
108
|
+
// A body-only element implies the head has ended even without </head>.
|
|
109
|
+
if (inHead && !['html', 'head', 'meta', 'link', 'base', 'noscript', 'template'].includes(name))
|
|
110
|
+
inHead = false;
|
|
111
|
+
elements.push({ name, attrs, start: lt, end: end + 1, inHead, depthInNoscript: noscript > 0 });
|
|
112
|
+
i = end + 1;
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
source,
|
|
116
|
+
elements,
|
|
117
|
+
text: decodeEntities(text.join(' ')).replace(/\s+/g, ' ').trim(),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
export function lineOf(source, offset) {
|
|
121
|
+
let line = 1;
|
|
122
|
+
for (let i = 0; i < offset && i < source.length; i++)
|
|
123
|
+
if (source.charCodeAt(i) === 10)
|
|
124
|
+
line++;
|
|
125
|
+
return line;
|
|
126
|
+
}
|
|
127
|
+
export function headFacts(doc) {
|
|
128
|
+
let lang = null;
|
|
129
|
+
let title = null;
|
|
130
|
+
let description = null;
|
|
131
|
+
const robots = [];
|
|
132
|
+
const canonical = [];
|
|
133
|
+
const jsonLd = [];
|
|
134
|
+
const links = [];
|
|
135
|
+
let hasMain = false;
|
|
136
|
+
for (const el of doc.elements) {
|
|
137
|
+
switch (el.name) {
|
|
138
|
+
case 'html':
|
|
139
|
+
if (lang === null && el.attrs.has('lang'))
|
|
140
|
+
lang = el.attrs.get('lang').trim();
|
|
141
|
+
break;
|
|
142
|
+
case 'title':
|
|
143
|
+
if (title === null && !el.depthInNoscript)
|
|
144
|
+
title = decodeEntities(el.text ?? '').replace(/\s+/g, ' ').trim();
|
|
145
|
+
break;
|
|
146
|
+
case 'meta': {
|
|
147
|
+
const name = (el.attrs.get('name') ?? '').toLowerCase();
|
|
148
|
+
const content = el.attrs.get('content') ?? '';
|
|
149
|
+
if (name === 'description' && description === null)
|
|
150
|
+
description = content.trim();
|
|
151
|
+
if (name === 'robots' || name === 'googlebot' || name === 'bingbot')
|
|
152
|
+
robots.push({ name, content });
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
case 'link': {
|
|
156
|
+
const rel = (el.attrs.get('rel') ?? '').toLowerCase().split(/\s+/);
|
|
157
|
+
if (rel.includes('canonical') && el.attrs.has('href'))
|
|
158
|
+
canonical.push(el.attrs.get('href').trim());
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
case 'script':
|
|
162
|
+
if ((el.attrs.get('type') ?? '').trim().toLowerCase() === 'application/ld+json') {
|
|
163
|
+
jsonLd.push({ raw: el.text ?? '', offset: el.start });
|
|
164
|
+
}
|
|
165
|
+
break;
|
|
166
|
+
case 'a':
|
|
167
|
+
if (el.attrs.has('href'))
|
|
168
|
+
links.push(el.attrs.get('href').trim());
|
|
169
|
+
break;
|
|
170
|
+
case 'main':
|
|
171
|
+
hasMain = true;
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return { lang, title, description, robots, canonical, jsonLd, links, hasMain };
|
|
176
|
+
}
|
|
177
|
+
const DIRECTIVE_PREFIXES = new Set(['max-snippet', 'max-image-preview', 'max-video-preview', 'unavailable_after']);
|
|
178
|
+
/**
|
|
179
|
+
* Parse one robots meta content or X-Robots-Tag header value. A header may be
|
|
180
|
+
* scoped (`googlebot: noindex`); a leading token followed by a colon is an
|
|
181
|
+
* agent unless it is itself a directive name such as `max-snippet`.
|
|
182
|
+
*/
|
|
183
|
+
export function parseDirectives(value, agent = '*') {
|
|
184
|
+
let scope = agent;
|
|
185
|
+
let body = value;
|
|
186
|
+
const m = /^\s*([a-z0-9_-]+)\s*:\s*(.*)$/i.exec(value);
|
|
187
|
+
if (m && !DIRECTIVE_PREFIXES.has(m[1].toLowerCase())) {
|
|
188
|
+
scope = m[1].toLowerCase();
|
|
189
|
+
body = m[2];
|
|
190
|
+
}
|
|
191
|
+
const values = new Set();
|
|
192
|
+
for (const part of body.split(',')) {
|
|
193
|
+
const d = part.trim().toLowerCase().replace(/\s*:\s*/, ':');
|
|
194
|
+
if (d)
|
|
195
|
+
values.add(d);
|
|
196
|
+
}
|
|
197
|
+
return { agent: scope, values };
|
|
198
|
+
}
|
|
199
|
+
export function blocksIndexing(d) {
|
|
200
|
+
return d.values.has('noindex') || d.values.has('none');
|
|
201
|
+
}
|
|
202
|
+
export function restrictsSnippets(d) {
|
|
203
|
+
return d.values.has('nosnippet') || d.values.has('max-snippet:0');
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/html/parse.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { scan, type ScanOptions, type ScanResult } from './scan.ts';
|
|
2
|
+
export { loadConfig, validateConfig, DEFAULT_CONFIG, type GeoConfig } from './config/config.ts';
|
|
3
|
+
export { RULES, findRule, type RuleMeta } from './rules/catalogue.ts';
|
|
4
|
+
export { score } from './scoring/score.ts';
|
|
5
|
+
export { compareReports } from './scoring/compare.ts';
|
|
6
|
+
export { renderJson, renderMarkdown, renderPretty } from './report/render.ts';
|
|
7
|
+
export { parseRobots, evaluate as evaluateRobots } from './robots/robots.ts';
|
|
8
|
+
export { VARIANTS } from './fix/plan.ts';
|
|
9
|
+
export { run } from './cli/main.ts';
|
|
10
|
+
export type * from './types.ts';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Library entry. The agent skill never imports this; it invokes the CLI.
|
|
2
|
+
export { scan } from "./scan.js";
|
|
3
|
+
export { loadConfig, validateConfig, DEFAULT_CONFIG } from "./config/config.js";
|
|
4
|
+
export { RULES, findRule } from "./rules/catalogue.js";
|
|
5
|
+
export { score } from "./scoring/score.js";
|
|
6
|
+
export { compareReports } from "./scoring/compare.js";
|
|
7
|
+
export { renderJson, renderMarkdown, renderPretty } from "./report/render.js";
|
|
8
|
+
export { parseRobots, evaluate as evaluateRobots } from "./robots/robots.js";
|
|
9
|
+
export { VARIANTS } from "./fix/plan.js";
|
|
10
|
+
export { run } from "./cli/main.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,OAAO,EAAE,IAAI,EAAqC,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAkB,MAAM,oBAAoB,CAAC;AAChG,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAiB,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { type Element } from '../html/parse.ts';
|
|
2
|
+
import type { LoadedRun } from '../cache/runs.ts';
|
|
3
|
+
export type InsightKind = 'recommendation' | 'hypothesis';
|
|
4
|
+
export interface InsightEvidence {
|
|
5
|
+
readonly type: 'file' | 'url' | 'finding' | 'note';
|
|
6
|
+
readonly path?: string;
|
|
7
|
+
readonly lines?: {
|
|
8
|
+
readonly start: number;
|
|
9
|
+
readonly end: number;
|
|
10
|
+
};
|
|
11
|
+
readonly quote?: string;
|
|
12
|
+
readonly url?: string;
|
|
13
|
+
readonly selector?: string;
|
|
14
|
+
readonly fingerprint?: string;
|
|
15
|
+
readonly detail?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface Insight {
|
|
18
|
+
readonly id: string;
|
|
19
|
+
readonly kind: InsightKind;
|
|
20
|
+
readonly category: string;
|
|
21
|
+
readonly title: string;
|
|
22
|
+
readonly description: string;
|
|
23
|
+
readonly evidence: readonly InsightEvidence[];
|
|
24
|
+
readonly related: {
|
|
25
|
+
readonly fingerprints: readonly string[];
|
|
26
|
+
readonly routes: readonly string[];
|
|
27
|
+
readonly files: readonly string[];
|
|
28
|
+
readonly insights: readonly string[];
|
|
29
|
+
};
|
|
30
|
+
readonly conflictsWith: readonly string[];
|
|
31
|
+
readonly confidence: 'low' | 'medium' | 'high';
|
|
32
|
+
readonly priority: 'low' | 'medium' | 'high';
|
|
33
|
+
readonly effort: 'small' | 'medium' | 'large';
|
|
34
|
+
readonly expectedBenefit: string;
|
|
35
|
+
readonly suggestedAction: string;
|
|
36
|
+
readonly fixClass: 'contextual' | 'editorial' | 'unsupported';
|
|
37
|
+
readonly approvalRequired: boolean;
|
|
38
|
+
readonly verification: 'V2' | 'V4' | 'none';
|
|
39
|
+
readonly uncertainty: string;
|
|
40
|
+
}
|
|
41
|
+
export interface InsightsDoc {
|
|
42
|
+
readonly schemaVersion: 'geo-insights/v1';
|
|
43
|
+
readonly producer: {
|
|
44
|
+
readonly host: string;
|
|
45
|
+
readonly model: string;
|
|
46
|
+
readonly skillVersion: string;
|
|
47
|
+
};
|
|
48
|
+
readonly basedOn: {
|
|
49
|
+
readonly runId: string;
|
|
50
|
+
readonly reportSha256: string;
|
|
51
|
+
readonly gitCommit: string | null;
|
|
52
|
+
};
|
|
53
|
+
readonly insights: readonly Insight[];
|
|
54
|
+
}
|
|
55
|
+
export type RefStatus = 'valid_references' | 'reference_invalid' | 'stale' | 'duplicate_exact' | 'unchecked';
|
|
56
|
+
export interface InsightResult {
|
|
57
|
+
readonly id: string;
|
|
58
|
+
readonly kind: InsightKind;
|
|
59
|
+
readonly status: RefStatus;
|
|
60
|
+
readonly reasons: readonly string[];
|
|
61
|
+
}
|
|
62
|
+
export interface ValidationResult {
|
|
63
|
+
readonly schemaErrors: readonly string[];
|
|
64
|
+
readonly results: readonly InsightResult[];
|
|
65
|
+
readonly evidenceAvailable: boolean;
|
|
66
|
+
}
|
|
67
|
+
export declare function validateSchema(raw: unknown): {
|
|
68
|
+
doc: InsightsDoc | null;
|
|
69
|
+
errors: string[];
|
|
70
|
+
};
|
|
71
|
+
/** A deliberately small selector engine: compound selectors (tag, #id, .class, [attr], [attr=value]); for descendant selectors only the last compound is matched. */
|
|
72
|
+
export declare function matchesSelector(elements: readonly Element[], selector: string): boolean;
|
|
73
|
+
export declare function validateReferences(doc: InsightsDoc, run: LoadedRun | null, repoRoot: string | null): ValidationResult;
|
|
74
|
+
export declare function statusLabel(s: RefStatus): string;
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { parseHtml } from "../html/parse.js";
|
|
3
|
+
const isObj = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
4
|
+
const isStrArr = (v) => Array.isArray(v) && v.every((x) => typeof x === 'string');
|
|
5
|
+
export function validateSchema(raw) {
|
|
6
|
+
const e = [];
|
|
7
|
+
if (!isObj(raw))
|
|
8
|
+
return { doc: null, errors: ['document must be a JSON object'] };
|
|
9
|
+
if (raw.schemaVersion !== 'geo-insights/v1')
|
|
10
|
+
e.push('schemaVersion must be "geo-insights/v1"');
|
|
11
|
+
const prod = raw.producer;
|
|
12
|
+
if (!isObj(prod) || typeof prod.host !== 'string' || typeof prod.model !== 'string' || typeof prod.skillVersion !== 'string')
|
|
13
|
+
e.push('producer needs host, model and skillVersion strings');
|
|
14
|
+
const based = raw.basedOn;
|
|
15
|
+
if (!isObj(based) || typeof based.runId !== 'string' || typeof based.reportSha256 !== 'string' || !(based.gitCommit === null || typeof based.gitCommit === 'string'))
|
|
16
|
+
e.push('basedOn needs runId, reportSha256 and gitCommit (string or null)');
|
|
17
|
+
if (!Array.isArray(raw.insights))
|
|
18
|
+
e.push('insights must be an array');
|
|
19
|
+
const ids = new Set();
|
|
20
|
+
(Array.isArray(raw.insights) ? raw.insights : []).forEach((ins, i) => {
|
|
21
|
+
const at = `insights[${i}]`;
|
|
22
|
+
if (!isObj(ins))
|
|
23
|
+
return e.push(`${at} must be an object`);
|
|
24
|
+
if (typeof ins.id !== 'string' || !ins.id)
|
|
25
|
+
e.push(`${at}.id is required`);
|
|
26
|
+
else if (ids.has(ins.id))
|
|
27
|
+
e.push(`${at}.id ${ins.id} is duplicated`);
|
|
28
|
+
else
|
|
29
|
+
ids.add(ins.id);
|
|
30
|
+
if (ins.kind === 'verified')
|
|
31
|
+
e.push(`${at}.kind "verified" is not allowed: agent output is a recommendation or a hypothesis, never a verified result`);
|
|
32
|
+
else if (ins.kind !== 'recommendation' && ins.kind !== 'hypothesis')
|
|
33
|
+
e.push(`${at}.kind must be recommendation or hypothesis`);
|
|
34
|
+
for (const k of ['category', 'title', 'description', 'expectedBenefit', 'suggestedAction', 'uncertainty'])
|
|
35
|
+
if (typeof ins[k] !== 'string')
|
|
36
|
+
e.push(`${at}.${k} must be a string`);
|
|
37
|
+
if (!['low', 'medium', 'high'].includes(String(ins.confidence)))
|
|
38
|
+
e.push(`${at}.confidence must be low, medium or high`);
|
|
39
|
+
if (!['low', 'medium', 'high'].includes(String(ins.priority)))
|
|
40
|
+
e.push(`${at}.priority must be low, medium or high`);
|
|
41
|
+
if (!['small', 'medium', 'large'].includes(String(ins.effort)))
|
|
42
|
+
e.push(`${at}.effort must be small, medium or large`);
|
|
43
|
+
if (!['contextual', 'editorial', 'unsupported'].includes(String(ins.fixClass)))
|
|
44
|
+
e.push(`${at}.fixClass must be contextual, editorial or unsupported (safe/guarded fixes are engine fixes)`);
|
|
45
|
+
if (typeof ins.approvalRequired !== 'boolean')
|
|
46
|
+
e.push(`${at}.approvalRequired must be a boolean`);
|
|
47
|
+
if (!['V2', 'V4', 'none'].includes(String(ins.verification)))
|
|
48
|
+
e.push(`${at}.verification must be V2, V4 or none`);
|
|
49
|
+
if (!isStrArr(ins.conflictsWith))
|
|
50
|
+
e.push(`${at}.conflictsWith must be an array of insight ids`);
|
|
51
|
+
const rel = ins.related;
|
|
52
|
+
if (!isObj(rel) || !isStrArr(rel.fingerprints) || !isStrArr(rel.routes) || !isStrArr(rel.files) || !isStrArr(rel.insights))
|
|
53
|
+
e.push(`${at}.related needs fingerprints, routes, files and insights arrays`);
|
|
54
|
+
if (!Array.isArray(ins.evidence) || ins.evidence.length === 0)
|
|
55
|
+
e.push(`${at}.evidence needs at least one item`);
|
|
56
|
+
else
|
|
57
|
+
ins.evidence.forEach((ev, j) => {
|
|
58
|
+
const eat = `${at}.evidence[${j}]`;
|
|
59
|
+
if (!isObj(ev))
|
|
60
|
+
return e.push(`${eat} must be an object`);
|
|
61
|
+
if (ev.type === 'file') {
|
|
62
|
+
if (typeof ev.path !== 'string')
|
|
63
|
+
e.push(`${eat}.path is required for file evidence`);
|
|
64
|
+
if (ev.lines !== undefined && !(isObj(ev.lines) && Number.isInteger(ev.lines.start) && Number.isInteger(ev.lines.end) && ev.lines.start >= 1 && ev.lines.end >= ev.lines.start))
|
|
65
|
+
e.push(`${eat}.lines must be { start, end } with 1 <= start <= end`);
|
|
66
|
+
}
|
|
67
|
+
else if (ev.type === 'url') {
|
|
68
|
+
if (typeof ev.url !== 'string')
|
|
69
|
+
e.push(`${eat}.url is required for url evidence`);
|
|
70
|
+
}
|
|
71
|
+
else if (ev.type === 'finding') {
|
|
72
|
+
if (typeof ev.fingerprint !== 'string')
|
|
73
|
+
e.push(`${eat}.fingerprint is required for finding evidence`);
|
|
74
|
+
}
|
|
75
|
+
else if (ev.type !== 'note')
|
|
76
|
+
e.push(`${eat}.type must be file, url, finding or note`);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
return { doc: e.length === 0 ? raw : null, errors: e };
|
|
80
|
+
}
|
|
81
|
+
const norm = (s) => s.replace(/\s+/g, ' ').trim();
|
|
82
|
+
function git(root, args) {
|
|
83
|
+
try {
|
|
84
|
+
return execFileSync('git', args, { cwd: root, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], maxBuffer: 16 * 1024 * 1024 });
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** A deliberately small selector engine: compound selectors (tag, #id, .class, [attr], [attr=value]); for descendant selectors only the last compound is matched. */
|
|
91
|
+
export function matchesSelector(elements, selector) {
|
|
92
|
+
const last = selector.trim().split(/\s+|>/).filter(Boolean).pop() ?? '';
|
|
93
|
+
const m = /^([a-z][a-z0-9-]*)?((?:#[\w-]+|\.[\w-]+|\[[^\]]+\])*)$/i.exec(last);
|
|
94
|
+
if (!m)
|
|
95
|
+
return false;
|
|
96
|
+
const tag = m[1]?.toLowerCase();
|
|
97
|
+
const parts = m[2].match(/#[\w-]+|\.[\w-]+|\[[^\]]+\]/g) ?? [];
|
|
98
|
+
return elements.some((el) => {
|
|
99
|
+
if (tag && el.name !== tag)
|
|
100
|
+
return false;
|
|
101
|
+
for (const part of parts) {
|
|
102
|
+
if (part.startsWith('#') && el.attrs.get('id') !== part.slice(1))
|
|
103
|
+
return false;
|
|
104
|
+
if (part.startsWith('.') && !(el.attrs.get('class') ?? '').split(/\s+/).includes(part.slice(1)))
|
|
105
|
+
return false;
|
|
106
|
+
if (part.startsWith('[')) {
|
|
107
|
+
const am = /^\[\s*([\w:-]+)\s*(?:([~|^$*]?=)\s*["']?([^"'\]]*)["']?)?\s*\]$/.exec(part);
|
|
108
|
+
if (!am)
|
|
109
|
+
return false;
|
|
110
|
+
const v = el.attrs.get(am[1].toLowerCase());
|
|
111
|
+
if (v === undefined)
|
|
112
|
+
return false;
|
|
113
|
+
if (am[2] === '=' && v !== am[3])
|
|
114
|
+
return false;
|
|
115
|
+
if (am[2] === '~=' && !v.split(/\s+/).includes(am[3]))
|
|
116
|
+
return false;
|
|
117
|
+
if (am[2] === '*=' && !v.includes(am[3]))
|
|
118
|
+
return false;
|
|
119
|
+
if (am[2] === '^=' && !v.startsWith(am[3]))
|
|
120
|
+
return false;
|
|
121
|
+
if (am[2] === '$=' && !v.endsWith(am[3]))
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return true;
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
export function validateReferences(doc, run, repoRoot) {
|
|
129
|
+
const results = [];
|
|
130
|
+
const seen = new Map();
|
|
131
|
+
const ids = new Set(doc.insights.map((i) => i.id));
|
|
132
|
+
const fps = new Set(run?.report.evaluations.flatMap((e) => e.findings.map((f) => f.fingerprint)) ?? []);
|
|
133
|
+
const fetched = new Set(run?.report.routes.flatMap((r) => r.urls) ?? []);
|
|
134
|
+
const reportStale = run !== null && run.reportSha256 !== doc.basedOn.reportSha256;
|
|
135
|
+
const commit = doc.basedOn.gitCommit;
|
|
136
|
+
for (const ins of doc.insights) {
|
|
137
|
+
const reasons = [];
|
|
138
|
+
let stale = reportStale;
|
|
139
|
+
let unchecked = false;
|
|
140
|
+
if (reportStale)
|
|
141
|
+
reasons.push('report hash differs from basedOn.reportSha256');
|
|
142
|
+
const key = JSON.stringify([ins.kind, norm(ins.title), norm(ins.description), ins.evidence]);
|
|
143
|
+
if (seen.has(key)) {
|
|
144
|
+
results.push({ id: ins.id, kind: ins.kind, status: 'duplicate_exact', reasons: [`same as ${seen.get(key)}`] });
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
seen.set(key, ins.id);
|
|
148
|
+
for (const ref of [...ins.related.insights, ...ins.conflictsWith])
|
|
149
|
+
if (!ids.has(ref))
|
|
150
|
+
reasons.push(`unknown insight id ${ref}`);
|
|
151
|
+
for (const fp of ins.related.fingerprints)
|
|
152
|
+
if (run && !fps.has(fp))
|
|
153
|
+
reasons.push(`fingerprint ${fp} is not in run ${doc.basedOn.runId}`);
|
|
154
|
+
for (const ev of ins.evidence) {
|
|
155
|
+
if (ev.type === 'finding') {
|
|
156
|
+
if (!run)
|
|
157
|
+
unchecked = true;
|
|
158
|
+
else if (!fps.has(ev.fingerprint))
|
|
159
|
+
reasons.push(`fingerprint ${ev.fingerprint} is not in run ${doc.basedOn.runId}`);
|
|
160
|
+
}
|
|
161
|
+
else if (ev.type === 'url') {
|
|
162
|
+
if (!run) {
|
|
163
|
+
unchecked = true;
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (!fetched.has(ev.url)) {
|
|
167
|
+
reasons.push(`${ev.url} was not fetched in run ${doc.basedOn.runId}`);
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (ev.selector) {
|
|
171
|
+
const html = run.dom.get(ev.url);
|
|
172
|
+
if (html === undefined)
|
|
173
|
+
unchecked = true;
|
|
174
|
+
else if (!matchesSelector(parseHtml(html).elements, ev.selector))
|
|
175
|
+
reasons.push(`selector ${ev.selector} matches nothing in the retained snapshot of ${ev.url}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else if (ev.type === 'file') {
|
|
179
|
+
if (!repoRoot || !commit) {
|
|
180
|
+
unchecked = true;
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
const content = git(repoRoot, ['show', `${commit}:${ev.path}`]);
|
|
184
|
+
if (content === null) {
|
|
185
|
+
reasons.push(`${ev.path} does not exist at ${commit.slice(0, 12)}`);
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
const lines = content.split('\n');
|
|
189
|
+
if (ev.lines && ev.lines.end > lines.length) {
|
|
190
|
+
reasons.push(`${ev.path} has ${lines.length} lines at ${commit.slice(0, 12)}; cited ${ev.lines.start}-${ev.lines.end}`);
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (ev.quote) {
|
|
194
|
+
const span = ev.lines ? lines.slice(ev.lines.start - 1, ev.lines.end).join('\n') : content;
|
|
195
|
+
if (!norm(span).includes(norm(ev.quote)))
|
|
196
|
+
reasons.push(`quote not found in ${ev.path}${ev.lines ? `:${ev.lines.start}-${ev.lines.end}` : ''}`);
|
|
197
|
+
}
|
|
198
|
+
if (git(repoRoot, ['diff', '--quiet', commit, '--', ev.path]) === null) {
|
|
199
|
+
stale = true;
|
|
200
|
+
reasons.push(`${ev.path} changed since ${commit.slice(0, 12)}`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const invalid = reasons.some((r) => !/changed since|report hash/.test(r));
|
|
205
|
+
const status = invalid ? 'reference_invalid' : stale ? 'stale' : unchecked ? 'unchecked' : 'valid_references';
|
|
206
|
+
results.push({ id: ins.id, kind: ins.kind, status, reasons });
|
|
207
|
+
}
|
|
208
|
+
return { schemaErrors: [], results, evidenceAvailable: run !== null };
|
|
209
|
+
}
|
|
210
|
+
export function statusLabel(s) {
|
|
211
|
+
return s === 'valid_references' ? 'evidence resolved' : s.replace('_', ' ');
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/insights/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type AddressClass = 'public' | 'loopback' | 'private' | 'link-local' | 'cgnat' | 'ula' | 'multicast' | 'unspecified' | 'reserved';
|
|
2
|
+
export declare function classifyV4(ip: string): AddressClass;
|
|
3
|
+
/** Expand any textual IPv6 (including embedded dotted IPv4) to 8 hextets. */
|
|
4
|
+
export declare function expandV6(ip: string): number[] | null;
|
|
5
|
+
export declare function classifyV6(ip: string): AddressClass;
|
|
6
|
+
export declare function classifyAddress(ip: string): AddressClass;
|
|
7
|
+
export declare function isPublicAddress(ip: string): boolean;
|
|
8
|
+
/** URL hostnames keep IPv6 brackets; net APIs want them stripped. */
|
|
9
|
+
export declare function bareHost(hostname: string): string;
|
|
10
|
+
export declare function isLoopbackUrl(url: URL): boolean;
|