seo-intel 1.5.2 → 1.5.23
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/CHANGELOG.md +26 -0
- package/Start SEO Intel.command +10 -0
- package/analyses/aeo/scorer.js +60 -6
- package/analyses/blog-draft/index.js +62 -10
- package/analyses/templates/index.js +1 -1
- package/analysis/prompt-builder.js +167 -2
- package/analysis/technical-audit.js +177 -0
- package/cli.js +446 -25
- package/crawler/index.js +36 -2
- package/crawler/sitemap.js +44 -0
- package/db/db.js +62 -9
- package/db/schema.sql +19 -0
- package/exports/queries.js +32 -0
- package/exports/technical.js +181 -1
- package/extractor/qwen.js +135 -13
- package/lib/scan-export.js +204 -0
- package/package.json +1 -1
- package/reports/generate-html.js +517 -50
- package/server.js +319 -25
- package/setup/checks.js +65 -5
- package/setup/engine.js +1 -0
- package/setup/web-routes.js +22 -3
- package/setup/wizard.html +8 -6
package/setup/wizard.html
CHANGED
|
@@ -1344,7 +1344,7 @@ input::placeholder {
|
|
|
1344
1344
|
<!-- Ollama Hosts -->
|
|
1345
1345
|
<div id="ollamaHostsPanel" style="margin-bottom:16px; padding:12px 14px; background:var(--bg-card); border:1px solid var(--border-card); border-radius:var(--radius);">
|
|
1346
1346
|
<div style="display:flex; align-items:center; justify-content:space-between; margin-bottom:8px;">
|
|
1347
|
-
<span style="font-size:0.72rem; font-weight:600; color:var(--text-muted); letter-spacing:0.04em; text-transform:uppercase;">
|
|
1347
|
+
<span style="font-size:0.72rem; font-weight:600; color:var(--text-muted); letter-spacing:0.04em; text-transform:uppercase;">Extraction Hosts</span>
|
|
1348
1348
|
<button class="btn btn-sm" onclick="addOllamaHost()" style="padding:3px 8px; font-size:0.6rem;"><i class="fa-solid fa-plus"></i> Add LAN Host</button>
|
|
1349
1349
|
</div>
|
|
1350
1350
|
<div id="ollamaHostList" style="display:flex; flex-direction:column; gap:6px;">
|
|
@@ -1359,14 +1359,14 @@ input::placeholder {
|
|
|
1359
1359
|
<p id="pingResult" style="font-size:0.6rem; color:var(--text-muted); margin-top:4px;"></p>
|
|
1360
1360
|
</div>
|
|
1361
1361
|
<p style="font-size:0.58rem; color:var(--text-muted); margin-top:6px; line-height:1.4;">
|
|
1362
|
-
|
|
1362
|
+
Ollama (port 11434) or LM Studio (port 1234) on any machine. SEO Intel auto-detects both and falls back through configured hosts.
|
|
1363
1363
|
</p>
|
|
1364
1364
|
</div>
|
|
1365
1365
|
|
|
1366
1366
|
<div class="model-columns">
|
|
1367
1367
|
<div class="model-section" id="extractionSection">
|
|
1368
1368
|
<h3><i class="fa-solid fa-robot"></i> Extraction Tier</h3>
|
|
1369
|
-
<p class="section-note">Local Ollama
|
|
1369
|
+
<p class="section-note">Local model (Ollama or LM Studio) for structured data extraction during crawl</p>
|
|
1370
1370
|
<div id="extractionModels">
|
|
1371
1371
|
<!-- Populated by JS -->
|
|
1372
1372
|
</div>
|
|
@@ -1399,7 +1399,7 @@ input::placeholder {
|
|
|
1399
1399
|
</div>
|
|
1400
1400
|
<div class="model-section" id="analysisSection">
|
|
1401
1401
|
<h3><i class="fa-solid fa-brain"></i> Analysis Tier</h3>
|
|
1402
|
-
<p class="section-note">Local
|
|
1402
|
+
<p class="section-note">Local or cloud model for competitive gap analysis (needs more VRAM than extraction)</p>
|
|
1403
1403
|
<div id="analysisModels">
|
|
1404
1404
|
<!-- Populated by JS -->
|
|
1405
1405
|
</div>
|
|
@@ -2245,13 +2245,15 @@ input::placeholder {
|
|
|
2245
2245
|
list.innerHTML = allHosts.map(h => {
|
|
2246
2246
|
const hostname = h.mode === 'local' ? 'localhost' : new URL(h.host).hostname;
|
|
2247
2247
|
const port = new URL(h.host).port || '11434';
|
|
2248
|
+
const isLmStudio = h.mode === 'lmstudio' || port === '1234';
|
|
2248
2249
|
const dot = h.reachable ? 'color:var(--color-success)' : 'color:var(--color-danger); opacity:0.5';
|
|
2249
2250
|
const status = h.reachable ? `${h.models.length} model(s)` : 'unreachable';
|
|
2251
|
+
const typeLabel = isLmStudio ? '<span style="font-size:0.5rem; padding:1px 4px; border-radius:3px; background:rgba(180,160,255,0.12); color:#b4a0ff; margin-left:4px;">LM Studio</span>' : '';
|
|
2250
2252
|
const active = h.host === state.systemStatus.ollama.host;
|
|
2251
2253
|
return `
|
|
2252
2254
|
<div style="display:flex; align-items:center; gap:8px; padding:6px 8px; background:${active ? 'rgba(142,203,168,0.06)' : 'transparent'}; border:1px solid ${active ? 'rgba(142,203,168,0.15)' : 'var(--border-subtle)'}; border-radius:6px;">
|
|
2253
2255
|
<i class="fa-solid fa-circle" style="font-size:0.45rem; ${dot}"></i>
|
|
2254
|
-
<span style="font-family:var(--font-mono); font-size:0.68rem; color:var(--text-secondary);">${hostname}:${port}</span
|
|
2256
|
+
<span style="font-family:var(--font-mono); font-size:0.68rem; color:var(--text-secondary);">${hostname}:${port}</span>${typeLabel}
|
|
2255
2257
|
<span style="font-size:0.6rem; color:var(--text-muted); margin-left:auto;">${status}</span>
|
|
2256
2258
|
${active ? '<span style="font-size:0.55rem; padding:1px 6px; border-radius:3px; background:rgba(142,203,168,0.12); color:#8ecba8;">active</span>' : ''}
|
|
2257
2259
|
${!h.reachable && h.mode !== 'local' ? `<button class="btn btn-sm" style="padding:1px 5px; font-size:0.5rem;" onclick="removeOllamaHost('${h.host}')"><i class="fa-solid fa-xmark"></i></button>` : ''}
|
|
@@ -3368,7 +3370,7 @@ input::placeholder {
|
|
|
3368
3370
|
['Project', slug],
|
|
3369
3371
|
['Target Domain', document.getElementById('cfgTargetUrl').value || '-'],
|
|
3370
3372
|
['Extraction', state.selectedExtraction || 'none'],
|
|
3371
|
-
['Analysis', state.selectedAnalysis || 'none'],
|
|
3373
|
+
['Analysis', (state.selectedAnalysis || 'none').replace(/^cloud:/, '')],
|
|
3372
3374
|
['Crawl Mode', state.crawlMode],
|
|
3373
3375
|
['Competitor Domains', getListValues('competitorList').length + ' configured'],
|
|
3374
3376
|
['Search Console', state.gscUploaded ? 'Connected' : 'Not configured'],
|