geosition 4.9.1__py3-none-any.whl
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.
- geo_optimizer/__init__.py +78 -0
- geo_optimizer/cli/__init__.py +1 -0
- geo_optimizer/cli/agent_cmd.py +143 -0
- geo_optimizer/cli/apply_cmd.py +75 -0
- geo_optimizer/cli/audit_cmd.py +409 -0
- geo_optimizer/cli/autopilot_cmd.py +99 -0
- geo_optimizer/cli/benchmark_cmd.py +159 -0
- geo_optimizer/cli/benchmark_formatter.py +249 -0
- geo_optimizer/cli/ci_formatter.py +331 -0
- geo_optimizer/cli/coherence_cmd.py +63 -0
- geo_optimizer/cli/collect_cmd.py +141 -0
- geo_optimizer/cli/content_cmd.py +112 -0
- geo_optimizer/cli/diff_cmd.py +75 -0
- geo_optimizer/cli/fix_cmd.py +167 -0
- geo_optimizer/cli/formatters.py +1042 -0
- geo_optimizer/cli/fullaudit_cmd.py +2111 -0
- geo_optimizer/cli/geosition_cmd.py +1058 -0
- geo_optimizer/cli/github_cmd.py +100 -0
- geo_optimizer/cli/github_formatter.py +101 -0
- geo_optimizer/cli/history_cmd.py +54 -0
- geo_optimizer/cli/html_formatter.py +474 -0
- geo_optimizer/cli/links_cmd.py +77 -0
- geo_optimizer/cli/llms_cmd.py +96 -0
- geo_optimizer/cli/logs_cmd.py +62 -0
- geo_optimizer/cli/main.py +204 -0
- geo_optimizer/cli/marketing_cmd.py +634 -0
- geo_optimizer/cli/monitor_cmd.py +72 -0
- geo_optimizer/cli/orchestrate_cmd.py +72 -0
- geo_optimizer/cli/pdf_formatter.py +26 -0
- geo_optimizer/cli/pipeline_cmd.py +134 -0
- geo_optimizer/cli/playbook_cmd.py +56 -0
- geo_optimizer/cli/rich_formatter.py +1220 -0
- geo_optimizer/cli/rivalry_cmd.py +532 -0
- geo_optimizer/cli/schema_cmd.py +212 -0
- geo_optimizer/cli/scoring_helpers.py +64 -0
- geo_optimizer/cli/seo_cmd.py +264 -0
- geo_optimizer/cli/snapshots_cmd.py +127 -0
- geo_optimizer/cli/track_cmd.py +85 -0
- geo_optimizer/core/__init__.py +1 -0
- geo_optimizer/core/action_intelligence.py +130 -0
- geo_optimizer/core/agent_endpoints.py +457 -0
- geo_optimizer/core/audit.py +1166 -0
- geo_optimizer/core/audit_aeo.py +255 -0
- geo_optimizer/core/audit_ai_discovery.py +190 -0
- geo_optimizer/core/audit_attribution.py +142 -0
- geo_optimizer/core/audit_brand.py +223 -0
- geo_optimizer/core/audit_cdn.py +161 -0
- geo_optimizer/core/audit_citation_map.py +102 -0
- geo_optimizer/core/audit_commerce.py +60 -0
- geo_optimizer/core/audit_content.py +156 -0
- geo_optimizer/core/audit_context_window.py +169 -0
- geo_optimizer/core/audit_conversion.py +493 -0
- geo_optimizer/core/audit_decay.py +147 -0
- geo_optimizer/core/audit_embedding.py +162 -0
- geo_optimizer/core/audit_freshness.py +195 -0
- geo_optimizer/core/audit_indexability.py +127 -0
- geo_optimizer/core/audit_indexnow.py +82 -0
- geo_optimizer/core/audit_instruction.py +236 -0
- geo_optimizer/core/audit_js.py +128 -0
- geo_optimizer/core/audit_links.py +325 -0
- geo_optimizer/core/audit_llms.py +229 -0
- geo_optimizer/core/audit_marketing/__init__.py +14 -0
- geo_optimizer/core/audit_marketing/analysis.py +1384 -0
- geo_optimizer/core/audit_marketing/orchestrator.py +110 -0
- geo_optimizer/core/audit_marketing/planning.py +438 -0
- geo_optimizer/core/audit_media.py +268 -0
- geo_optimizer/core/audit_meta.py +64 -0
- geo_optimizer/core/audit_negative.py +253 -0
- geo_optimizer/core/audit_perf.py +215 -0
- geo_optimizer/core/audit_persistence.py +116 -0
- geo_optimizer/core/audit_platform.py +208 -0
- geo_optimizer/core/audit_rag.py +148 -0
- geo_optimizer/core/audit_robots.py +122 -0
- geo_optimizer/core/audit_schema.py +150 -0
- geo_optimizer/core/audit_sentiment.py +154 -0
- geo_optimizer/core/audit_serp.py +676 -0
- geo_optimizer/core/audit_signals.py +59 -0
- geo_optimizer/core/audit_sxo.py +183 -0
- geo_optimizer/core/audit_tracking.py +346 -0
- geo_optimizer/core/audit_webmcp.py +150 -0
- geo_optimizer/core/batch_audit.py +203 -0
- geo_optimizer/core/benchmark/__init__.py +8 -0
- geo_optimizer/core/benchmark/citation_economics.py +305 -0
- geo_optimizer/core/benchmark/citation_share.py +92 -0
- geo_optimizer/core/benchmark/competitor_matrix.py +56 -0
- geo_optimizer/core/benchmark/competitors.py +64 -0
- geo_optimizer/core/benchmark/domains.py +14 -0
- geo_optimizer/core/benchmark/monitoring.py +73 -0
- geo_optimizer/core/benchmark/page_task.py +108 -0
- geo_optimizer/core/benchmark/runner.py +341 -0
- geo_optimizer/core/benchmark/schedule.py +71 -0
- geo_optimizer/core/benchmark/score.py +87 -0
- geo_optimizer/core/benchmark/store.py +665 -0
- geo_optimizer/core/benchmark/task_classifier.py +95 -0
- geo_optimizer/core/benchmark/unique_value.py +108 -0
- geo_optimizer/core/citability/__init__.py +418 -0
- geo_optimizer/core/citability/_helpers.py +236 -0
- geo_optimizer/core/citability/entity.py +443 -0
- geo_optimizer/core/citability/freshness.py +403 -0
- geo_optimizer/core/citability/platform.py +709 -0
- geo_optimizer/core/citability/signals.py +829 -0
- geo_optimizer/core/citability/sources.py +355 -0
- geo_optimizer/core/citability/structure.py +1139 -0
- geo_optimizer/core/citation_quality.py +172 -0
- geo_optimizer/core/coherence_analyzer.py +194 -0
- geo_optimizer/core/collection/__init__.py +20 -0
- geo_optimizer/core/collection/adapters/__init__.py +38 -0
- geo_optimizer/core/collection/adapters/brightdata_browser.py +129 -0
- geo_optimizer/core/collection/adapters/gemini_grounding.py +121 -0
- geo_optimizer/core/collection/adapters/manual.py +55 -0
- geo_optimizer/core/collection/adapters/perplexity.py +89 -0
- geo_optimizer/core/collection/normalize.py +283 -0
- geo_optimizer/core/collection/pipeline.py +204 -0
- geo_optimizer/core/collection/protocol.py +32 -0
- geo_optimizer/core/collection/store.py +101 -0
- geo_optimizer/core/collection/tracker_bridge.py +135 -0
- geo_optimizer/core/content_workflow.py +185 -0
- geo_optimizer/core/diffing.py +134 -0
- geo_optimizer/core/factual_accuracy.py +288 -0
- geo_optimizer/core/fixer.py +1251 -0
- geo_optimizer/core/gap_analysis.py +271 -0
- geo_optimizer/core/github_repo_audit.py +218 -0
- geo_optimizer/core/history.py +275 -0
- geo_optimizer/core/injection_detector.py +376 -0
- geo_optimizer/core/link_graph.py +170 -0
- geo_optimizer/core/llm_client.py +186 -0
- geo_optimizer/core/llms_generator.py +627 -0
- geo_optimizer/core/log_analyzer.py +165 -0
- geo_optimizer/core/monitor.py +312 -0
- geo_optimizer/core/orchestrator.py +137 -0
- geo_optimizer/core/playbooks.py +97 -0
- geo_optimizer/core/prompt_library.py +136 -0
- geo_optimizer/core/registry.py +210 -0
- geo_optimizer/core/schema_injector.py +362 -0
- geo_optimizer/core/schema_validator.py +153 -0
- geo_optimizer/core/scoring.py +226 -0
- geo_optimizer/core/search_measurement.py +101 -0
- geo_optimizer/core/seo_intelligence.py +843 -0
- geo_optimizer/core/site_coherence.py +95 -0
- geo_optimizer/core/site_integrator.py +91 -0
- geo_optimizer/core/snapshots.py +272 -0
- geo_optimizer/core/term_extractor.py +77 -0
- geo_optimizer/core/trust_stack.py +415 -0
- geo_optimizer/core/vertical_profile.py +375 -0
- geo_optimizer/i18n/__init__.py +151 -0
- geo_optimizer/i18n/locales/en/LC_MESSAGES/geo_optimizer.mo +0 -0
- geo_optimizer/i18n/locales/it/LC_MESSAGES/geo_optimizer.mo +0 -0
- geo_optimizer/mcp/__init__.py +3 -0
- geo_optimizer/mcp/server.py +797 -0
- geo_optimizer/models/__init__.py +1 -0
- geo_optimizer/models/config.py +767 -0
- geo_optimizer/models/project_config.py +165 -0
- geo_optimizer/models/results/__init__.py +295 -0
- geo_optimizer/models/results/analytics.py +286 -0
- geo_optimizer/models/results/audit.py +512 -0
- geo_optimizer/models/results/benchmark.py +331 -0
- geo_optimizer/models/results/citability.py +149 -0
- geo_optimizer/models/results/collection.py +82 -0
- geo_optimizer/models/results/core.py +203 -0
- geo_optimizer/models/results/marketing.py +602 -0
- geo_optimizer/models/results/rag.py +92 -0
- geo_optimizer/models/results/seo.py +212 -0
- geo_optimizer/models/results/trust.py +166 -0
- geo_optimizer/py.typed +0 -0
- geo_optimizer/saas/__init__.py +8 -0
- geo_optimizer/saas/auth.py +169 -0
- geo_optimizer/saas/domain_verify.py +82 -0
- geo_optimizer/saas/models.py +252 -0
- geo_optimizer/saas/search_connections.py +187 -0
- geo_optimizer/saas/service.py +2181 -0
- geo_optimizer/saas/store.py +1537 -0
- geo_optimizer/saas/supabase_store.py +1213 -0
- geo_optimizer/saas/weekly_evidence.py +398 -0
- geo_optimizer/skills/__init__.py +22 -0
- geo_optimizer/skills/catalog/README.md +33 -0
- geo_optimizer/skills/catalog/_template/prompt.md +25 -0
- geo_optimizer/skills/catalog/_template/skill.yaml +27 -0
- geo_optimizer/skills/catalog/geo_ai_discovery_readiness/prompt.md +33 -0
- geo_optimizer/skills/catalog/geo_ai_discovery_readiness/skill.yaml +79 -0
- geo_optimizer/skills/catalog/geo_audit_orchestrator/prompt.md +30 -0
- geo_optimizer/skills/catalog/geo_audit_orchestrator/skill.yaml +65 -0
- geo_optimizer/skills/catalog/geo_citation_readiness/prompt.md +32 -0
- geo_optimizer/skills/catalog/geo_citation_readiness/skill.yaml +79 -0
- geo_optimizer/skills/catalog/geo_competitor_comparison/prompt.md +32 -0
- geo_optimizer/skills/catalog/geo_competitor_comparison/skill.yaml +76 -0
- geo_optimizer/skills/catalog/geo_foundation_repair/prompt.md +31 -0
- geo_optimizer/skills/catalog/geo_foundation_repair/skill.yaml +72 -0
- geo_optimizer/skills/catalog/geo_schema_readiness/prompt.md +33 -0
- geo_optimizer/skills/catalog/geo_schema_readiness/skill.yaml +76 -0
- geo_optimizer/skills/catalog/geo_trust_signal_review/prompt.md +33 -0
- geo_optimizer/skills/catalog/geo_trust_signal_review/skill.yaml +76 -0
- geo_optimizer/skills/loader.py +118 -0
- geo_optimizer/skills/models.py +69 -0
- geo_optimizer/skills/validator.py +179 -0
- geo_optimizer/storage/__init__.py +15 -0
- geo_optimizer/storage/artifacts.py +194 -0
- geo_optimizer/storage/paths.py +82 -0
- geo_optimizer/storage/platform.py +50 -0
- geo_optimizer/utils/__init__.py +1 -0
- geo_optimizer/utils/cache.py +156 -0
- geo_optimizer/utils/http.py +332 -0
- geo_optimizer/utils/http_async.py +192 -0
- geo_optimizer/utils/robots_parser.py +252 -0
- geo_optimizer/utils/seo_program_note.py +14 -0
- geo_optimizer/utils/validators.py +250 -0
- geo_optimizer/web/__init__.py +12 -0
- geo_optimizer/web/app.py +1896 -0
- geo_optimizer/web/badge.py +131 -0
- geo_optimizer/web/cli.py +37 -0
- geo_optimizer/web/docs/ai-bots-reference.md +277 -0
- geo_optimizer/web/docs/ai-context.md +235 -0
- geo_optimizer/web/docs/ci-cd.md +227 -0
- geo_optimizer/web/docs/geo-audit.md +290 -0
- geo_optimizer/web/docs/geo-diff.md +38 -0
- geo_optimizer/web/docs/geo-fix.md +111 -0
- geo_optimizer/web/docs/geo-history.md +65 -0
- geo_optimizer/web/docs/geo-methods.md +327 -0
- geo_optimizer/web/docs/geo-monitor.md +78 -0
- geo_optimizer/web/docs/geo-snapshots.md +103 -0
- geo_optimizer/web/docs/geo-track.md +71 -0
- geo_optimizer/web/docs/getting-started.md +132 -0
- geo_optimizer/web/docs/index.md +50 -0
- geo_optimizer/web/docs/llms-txt.md +208 -0
- geo_optimizer/web/docs/mcp-server.md +410 -0
- geo_optimizer/web/docs/schema-injector.md +444 -0
- geo_optimizer/web/docs/scoring-rubric.md +27 -0
- geo_optimizer/web/docs/search-measurement.md +21 -0
- geo_optimizer/web/docs/skill-files.md +72 -0
- geo_optimizer/web/docs/skill-roadmap.md +193 -0
- geo_optimizer/web/docs/skill-system.md +101 -0
- geo_optimizer/web/docs/troubleshooting.md +297 -0
- geo_optimizer/web/platform_routes.py +1432 -0
- geo_optimizer/web/templates/compare.html +223 -0
- geo_optimizer/web/templates/docs.html +147 -0
- geo_optimizer/web/templates/index.html +609 -0
- geo_optimizer/web/templates/manifesto.html +508 -0
- geo_optimizer/web/templates/platform/assets/ai-companies.webp +0 -0
- geo_optimizer/web/templates/platform/assets/apple-touch-icon.png +0 -0
- geo_optimizer/web/templates/platform/assets/avatars/agency-owner.png +0 -0
- geo_optimizer/web/templates/platform/assets/avatars/content-lead.png +0 -0
- geo_optimizer/web/templates/platform/assets/avatars/editor.png +0 -0
- geo_optimizer/web/templates/platform/assets/avatars/founder.png +0 -0
- geo_optimizer/web/templates/platform/assets/avatars/independent-analyst.png +0 -0
- geo_optimizer/web/templates/platform/assets/avatars/operator.png +0 -0
- geo_optimizer/web/templates/platform/assets/cobe.esm.js +1 -0
- geo_optimizer/web/templates/platform/assets/commerce-ai-assistant.png +0 -0
- geo_optimizer/web/templates/platform/assets/commerce-shopping-bag.png +0 -0
- geo_optimizer/web/templates/platform/assets/commerce-storefront.png +0 -0
- geo_optimizer/web/templates/platform/assets/dashboard-loop.js +118 -0
- geo_optimizer/web/templates/platform/assets/earn-per-citation.webp +0 -0
- geo_optimizer/web/templates/platform/assets/favicon-16.png +0 -0
- geo_optimizer/web/templates/platform/assets/favicon-32.png +0 -0
- geo_optimizer/web/templates/platform/assets/favicon-48.png +0 -0
- geo_optimizer/web/templates/platform/assets/favicon-64.png +0 -0
- geo_optimizer/web/templates/platform/assets/favicon.ico +0 -0
- geo_optimizer/web/templates/platform/assets/favicon.svg +3 -0
- geo_optimizer/web/templates/platform/assets/hero-bg.png +0 -0
- geo_optimizer/web/templates/platform/assets/hero-mountain.png +0 -0
- geo_optimizer/web/templates/platform/assets/landing-refresh.css +646 -0
- geo_optimizer/web/templates/platform/assets/lenis.LICENSE.txt +9 -0
- geo_optimizer/web/templates/platform/assets/lenis.min.js +2 -0
- geo_optimizer/web/templates/platform/assets/lenis.min.js.map +1 -0
- geo_optimizer/web/templates/platform/assets/mobile-cta-trees.png +0 -0
- geo_optimizer/web/templates/platform/assets/mobile-cta-trees.webp +0 -0
- geo_optimizer/web/templates/platform/assets/platform-icon-claude.svg +1 -0
- geo_optimizer/web/templates/platform/assets/platform-icon-google.svg +1 -0
- geo_optimizer/web/templates/platform/assets/platform-icon-googlegemini.svg +1 -0
- geo_optimizer/web/templates/platform/assets/platform-icon-perplexity.svg +1 -0
- geo_optimizer/web/templates/platform/assets/platform-icons-LICENSE.txt +30 -0
- geo_optimizer/web/templates/platform/assets/publishers-data.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reel-citrus-poster.jpg +0 -0
- geo_optimizer/web/templates/platform/assets/reel-citrus.mp4 +0 -0
- geo_optimizer/web/templates/platform/assets/reel-coffee-poster.jpg +0 -0
- geo_optimizer/web/templates/platform/assets/reel-coffee-v2.mp4 +0 -0
- geo_optimizer/web/templates/platform/assets/reel-run-poster.jpg +0 -0
- geo_optimizer/web/templates/platform/assets/reel-run.mp4 +0 -0
- geo_optimizer/web/templates/platform/assets/reel-skincare-poster.jpg +0 -0
- geo_optimizer/web/templates/platform/assets/reel-skincare-v2.mp4 +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/README.md +6 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/amber-serum.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/atelier-hero-loop.mp4 +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/atelier-hero-poster.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/ceramic-cup.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/email-preview.png +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/glass-perfume.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/green-headphones.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/halcy-hero-converted-v4.webm +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/halcy-hero-poster.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/hearthen-animated-hero-desktop.webm +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/hearthen-hero-poster.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/intro-agent-tux.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/intro-bag.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/intro-store.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/laps-hero-loop.mp4 +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/laps-hero-poster.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/leather-bag.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/lift-hero-loop.mp4 +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/lift-hero-poster.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/linen-towels.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/olive-oil.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/sculptural-vase.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/silver-watch.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/stayput-hero-poster.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/stayput-hero-top-cropped-v3.webm +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/store-design-poster.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/store-design-smooth-loop.mp4 +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/terracotta-vase.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/testing-v2-poster.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/testing-v2-smooth.mp4 +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/testing-v2.mp4 +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/zahra-hero-loop-v2.mp4 +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/zahra-loop-poster.webp +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/zippa-hero-pingpong-v2.mp4 +0 -0
- geo_optimizer/web/templates/platform/assets/reference-amboras/zippa-hero-poster-v2.webp +0 -0
- geo_optimizer/web/templates/platform/assets/smooth-scroll.js +44 -0
- geo_optimizer/web/templates/platform/assets/terminal-cta-landscape.png +0 -0
- geo_optimizer/web/templates/platform/assets/terminal-cta-reference.jpg +0 -0
- geo_optimizer/web/templates/platform/assets/terminal-cta-scene.jpg +0 -0
- geo_optimizer/web/templates/platform/assets/terminal-cta-trees-crop.png +0 -0
- geo_optimizer/web/templates/platform/assets/terminal-cta-trees.png +0 -0
- geo_optimizer/web/templates/platform/dashboard.html +1591 -0
- geo_optimizer/web/templates/platform/forgot-password.html +80 -0
- geo_optimizer/web/templates/platform/gestion-velora.html +299 -0
- geo_optimizer/web/templates/platform/index.html +209 -0
- geo_optimizer/web/templates/platform/landing.html +605 -0
- geo_optimizer/web/templates/platform/login.html +64 -0
- geo_optimizer/web/templates/platform/register.html +105 -0
- geo_optimizer/web/templates/platform/reset-password.html +75 -0
- geo_optimizer/web/templates/platform/site.css +9480 -0
- geo_optimizer/web/templates/research.html +198 -0
- geo_optimizer/web/templates/roadmap.html +165 -0
- geosition-4.9.1.dist-info/METADATA +241 -0
- geosition-4.9.1.dist-info/RECORD +337 -0
- geosition-4.9.1.dist-info/WHEEL +5 -0
- geosition-4.9.1.dist-info/entry_points.txt +10 -0
- geosition-4.9.1.dist-info/licenses/LICENSE +73 -0
- geosition-4.9.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""
|
|
2
|
+
GEOSITION — Generative Engine Optimization Toolkit
|
|
3
|
+
|
|
4
|
+
Make websites visible and citable by AI search engines
|
|
5
|
+
(ChatGPT, Perplexity, Claude, Gemini).
|
|
6
|
+
|
|
7
|
+
Based on the Princeton KDD 2024 research paper (arxiv.org/abs/2311.09735).
|
|
8
|
+
|
|
9
|
+
Programmatic usage::
|
|
10
|
+
|
|
11
|
+
from geo_optimizer import audit, AuditResult
|
|
12
|
+
result = audit("https://example.com")
|
|
13
|
+
print(result.score, result.band)
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import warnings
|
|
19
|
+
|
|
20
|
+
# Suppress persistent urllib3 LibreSSL runtime warning in CLI contexts.
|
|
21
|
+
warnings.filterwarnings(
|
|
22
|
+
"ignore",
|
|
23
|
+
message=r"urllib3 v2 only supports OpenSSL 1\.1\.1\+.*",
|
|
24
|
+
category=Warning,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
__version__ = "4.9.1"
|
|
28
|
+
|
|
29
|
+
# ─── Public API ──────────────────────────────────────────────────────────────
|
|
30
|
+
|
|
31
|
+
from geo_optimizer.core.audit import run_full_audit as audit # noqa: E402
|
|
32
|
+
from geo_optimizer.core.audit import run_full_audit_async as audit_async # noqa: E402
|
|
33
|
+
from geo_optimizer.core.registry import AuditCheck, CheckRegistry, CheckResult # noqa: E402
|
|
34
|
+
from geo_optimizer.models.results import ( # noqa: E402
|
|
35
|
+
AuditResult,
|
|
36
|
+
CitabilityResult,
|
|
37
|
+
ContentResult,
|
|
38
|
+
FixItem,
|
|
39
|
+
FixPlan,
|
|
40
|
+
LlmsTxtResult,
|
|
41
|
+
MetaResult,
|
|
42
|
+
MethodScore,
|
|
43
|
+
NextAction,
|
|
44
|
+
RobotsResult,
|
|
45
|
+
SchemaAnalysis,
|
|
46
|
+
SchemaResult,
|
|
47
|
+
SitemapUrl,
|
|
48
|
+
VerticalAuditResult,
|
|
49
|
+
VerticalSignal,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
__all__ = [
|
|
53
|
+
# Version
|
|
54
|
+
"__version__",
|
|
55
|
+
# Main functions
|
|
56
|
+
"audit",
|
|
57
|
+
"audit_async",
|
|
58
|
+
# Plugin system
|
|
59
|
+
"CheckRegistry",
|
|
60
|
+
"AuditCheck",
|
|
61
|
+
"CheckResult",
|
|
62
|
+
# Result dataclasses
|
|
63
|
+
"AuditResult",
|
|
64
|
+
"RobotsResult",
|
|
65
|
+
"LlmsTxtResult",
|
|
66
|
+
"SchemaResult",
|
|
67
|
+
"MetaResult",
|
|
68
|
+
"ContentResult",
|
|
69
|
+
"CitabilityResult",
|
|
70
|
+
"MethodScore",
|
|
71
|
+
"NextAction",
|
|
72
|
+
"FixPlan",
|
|
73
|
+
"FixItem",
|
|
74
|
+
"SchemaAnalysis",
|
|
75
|
+
"SitemapUrl",
|
|
76
|
+
"VerticalAuditResult",
|
|
77
|
+
"VerticalSignal",
|
|
78
|
+
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"""
|
|
2
|
+
CLI command: geo agent
|
|
3
|
+
|
|
4
|
+
Generates WebMCP / tool-calling ready endpoints so AI agents can use your
|
|
5
|
+
site as a tool. Future-proofs for the agent era.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import sys
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
import click
|
|
14
|
+
|
|
15
|
+
from geo_optimizer.core.agent_endpoints import run_agent_endpoint_generator
|
|
16
|
+
from geo_optimizer.utils.validators import validate_public_url
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@click.command("agent")
|
|
20
|
+
@click.option("--url", required=True, help="URL of the site to prepare for AI agents")
|
|
21
|
+
@click.option(
|
|
22
|
+
"--output-dir",
|
|
23
|
+
default="./agent-endpoints",
|
|
24
|
+
show_default=True,
|
|
25
|
+
help="Directory to write generated endpoint files",
|
|
26
|
+
)
|
|
27
|
+
@click.option(
|
|
28
|
+
"--apply",
|
|
29
|
+
"do_apply",
|
|
30
|
+
is_flag=True,
|
|
31
|
+
help="Write files to output directory (default: preview only)",
|
|
32
|
+
)
|
|
33
|
+
def agent_cmd(url: str, output_dir: str, do_apply: bool) -> None:
|
|
34
|
+
"""Generate WebMCP / tool-calling endpoints for AI agent access.
|
|
35
|
+
|
|
36
|
+
Makes your site callable as a tool by AI agents (Claude, ChatGPT,
|
|
37
|
+
Perplexity, etc.). Generates the full endpoint stack:
|
|
38
|
+
|
|
39
|
+
\b
|
|
40
|
+
.well-known/ai.txt — agent declaration
|
|
41
|
+
ai/summary.json — machine-readable site identity
|
|
42
|
+
ai/faq.json — answers agents can surface directly
|
|
43
|
+
ai/service.json — service capabilities
|
|
44
|
+
ai/tools.json — WebMCP tool definitions
|
|
45
|
+
+ potentialAction JSON-LD and WebMCP HTML snippets
|
|
46
|
+
|
|
47
|
+
\b
|
|
48
|
+
Examples:
|
|
49
|
+
geo agent --url https://yoursite.com
|
|
50
|
+
geo agent --url https://yoursite.com --apply
|
|
51
|
+
geo agent --url https://yoursite.com --apply --output-dir ./public
|
|
52
|
+
"""
|
|
53
|
+
# Validate URL
|
|
54
|
+
safe, reason = validate_public_url(url)
|
|
55
|
+
safe_url = url.rstrip("/")
|
|
56
|
+
if not safe:
|
|
57
|
+
click.echo(f"\n❌ Unsafe URL: {reason}", err=True)
|
|
58
|
+
sys.exit(1)
|
|
59
|
+
|
|
60
|
+
click.echo(f"🤖 Checking agent readiness for {safe_url} ...", err=True)
|
|
61
|
+
|
|
62
|
+
result = run_agent_endpoint_generator(safe_url)
|
|
63
|
+
|
|
64
|
+
# Status summary
|
|
65
|
+
click.echo(f"\n📊 Agent Readiness — {result.endpoints_present}/5 endpoints present\n")
|
|
66
|
+
|
|
67
|
+
checks = [
|
|
68
|
+
("/.well-known/ai.txt", result.has_well_known_ai),
|
|
69
|
+
("/ai/summary.json", result.has_summary),
|
|
70
|
+
("/ai/faq.json", result.has_faq),
|
|
71
|
+
("/ai/service.json", result.has_service),
|
|
72
|
+
("/ai/tools.json", result.has_tools),
|
|
73
|
+
]
|
|
74
|
+
for path, present in checks:
|
|
75
|
+
icon = "✅" if present else "❌"
|
|
76
|
+
click.echo(f" {icon} {path}")
|
|
77
|
+
|
|
78
|
+
if result.agent_ready:
|
|
79
|
+
click.echo("\n✅ Site is agent-ready!\n")
|
|
80
|
+
else:
|
|
81
|
+
click.echo(f"\n⚠️ {5 - result.endpoints_present} endpoint(s) missing — generating now...\n")
|
|
82
|
+
|
|
83
|
+
if not result.files:
|
|
84
|
+
click.echo("Nothing to generate — all endpoints already present.")
|
|
85
|
+
_show_snippets(result)
|
|
86
|
+
return
|
|
87
|
+
|
|
88
|
+
# List what will be generated
|
|
89
|
+
click.echo(f"📋 {len(result.files)} file(s) to generate:\n")
|
|
90
|
+
for f in result.files:
|
|
91
|
+
click.echo(f" → {f.path}")
|
|
92
|
+
click.echo(f" {f.description}\n")
|
|
93
|
+
|
|
94
|
+
if not do_apply:
|
|
95
|
+
# Preview mode
|
|
96
|
+
click.echo("=" * 60)
|
|
97
|
+
click.echo("PREVIEW (use --apply to write the files)")
|
|
98
|
+
click.echo("=" * 60)
|
|
99
|
+
for f in result.files:
|
|
100
|
+
click.echo(f"\n{'─' * 40}")
|
|
101
|
+
click.echo(f"📄 {f.path}")
|
|
102
|
+
click.echo(f"{'─' * 40}")
|
|
103
|
+
lines = f.content.splitlines()
|
|
104
|
+
if len(lines) > 25:
|
|
105
|
+
click.echo("\n".join(lines[:25]))
|
|
106
|
+
click.echo(f"\n ... ({len(lines) - 25} more lines)")
|
|
107
|
+
else:
|
|
108
|
+
click.echo(f.content)
|
|
109
|
+
|
|
110
|
+
click.echo(f"\n💡 Run: geo agent --url {url} --apply")
|
|
111
|
+
else:
|
|
112
|
+
# Write files
|
|
113
|
+
out = Path(output_dir)
|
|
114
|
+
out.mkdir(parents=True, exist_ok=True)
|
|
115
|
+
for f in result.files:
|
|
116
|
+
dest = out / f.path
|
|
117
|
+
dest.parent.mkdir(parents=True, exist_ok=True)
|
|
118
|
+
dest.write_text(f.content, encoding="utf-8")
|
|
119
|
+
click.echo(f" ✅ {dest}")
|
|
120
|
+
|
|
121
|
+
click.echo(f"\n✅ {len(result.files)} file(s) written to {out}/")
|
|
122
|
+
click.echo("\n📁 Deploy these files to your web root so agents can reach them at:")
|
|
123
|
+
for f in result.files:
|
|
124
|
+
click.echo(f" {safe_url}/{f.path}")
|
|
125
|
+
|
|
126
|
+
_show_snippets(result)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def _show_snippets(result) -> None:
|
|
130
|
+
"""Print developer snippets (always shown, not written to disk)."""
|
|
131
|
+
if not result.snippets:
|
|
132
|
+
return
|
|
133
|
+
|
|
134
|
+
click.echo("\n" + "=" * 60)
|
|
135
|
+
click.echo("DEVELOPER SNIPPETS — add these to your site code")
|
|
136
|
+
click.echo("=" * 60)
|
|
137
|
+
|
|
138
|
+
for s in result.snippets:
|
|
139
|
+
click.echo(f"\n{'─' * 40}")
|
|
140
|
+
click.echo(f"📎 {s.path}")
|
|
141
|
+
click.echo(f" {s.description}")
|
|
142
|
+
click.echo(f"{'─' * 40}")
|
|
143
|
+
click.echo(s.content)
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"""
|
|
2
|
+
CLI command: geo apply
|
|
3
|
+
|
|
4
|
+
Apply generated GEO fixes directly to a local repository with stack-aware routing.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
import click
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@click.command(name="apply")
|
|
15
|
+
@click.option("--url", required=True, help="Site URL to audit and generate fixes from")
|
|
16
|
+
@click.option("--repo", "repo_path", default=".", show_default=True, help="Local repo path to apply fixes into")
|
|
17
|
+
@click.option(
|
|
18
|
+
"--only",
|
|
19
|
+
default=None,
|
|
20
|
+
help="Filter categories: robots,llms,schema,meta,ai_discovery,content,vertical",
|
|
21
|
+
)
|
|
22
|
+
@click.option(
|
|
23
|
+
"--vertical",
|
|
24
|
+
default="auto",
|
|
25
|
+
type=click.Choice(
|
|
26
|
+
[
|
|
27
|
+
"auto",
|
|
28
|
+
"generic",
|
|
29
|
+
"ecommerce-retail",
|
|
30
|
+
"travel-hospitality",
|
|
31
|
+
"healthcare-dental",
|
|
32
|
+
"real-estate-proptech",
|
|
33
|
+
"legal-professional-services",
|
|
34
|
+
"manufacturing-industrial-b2b",
|
|
35
|
+
"financial-services-insurance",
|
|
36
|
+
"saas-technology",
|
|
37
|
+
"education-edtech-k12",
|
|
38
|
+
"local-home-services",
|
|
39
|
+
],
|
|
40
|
+
case_sensitive=False,
|
|
41
|
+
),
|
|
42
|
+
show_default=True,
|
|
43
|
+
)
|
|
44
|
+
@click.option(
|
|
45
|
+
"--market-locale",
|
|
46
|
+
default="en",
|
|
47
|
+
type=click.Choice(["en", "fr", "en-fr"], case_sensitive=False),
|
|
48
|
+
show_default=True,
|
|
49
|
+
)
|
|
50
|
+
def apply_cmd(url, repo_path, only, vertical, market_locale):
|
|
51
|
+
"""Run audit+fix and apply file-safe fixes to a local project."""
|
|
52
|
+
from geo_optimizer.core.audit import run_full_audit
|
|
53
|
+
from geo_optimizer.core.fixer import run_all_fixes
|
|
54
|
+
from geo_optimizer.core.site_integrator import apply_fix_plan_to_repo
|
|
55
|
+
|
|
56
|
+
only_set = {c.strip().lower() for c in only.split(",")} if only else None
|
|
57
|
+
|
|
58
|
+
click.echo("⏳ Running audit and generating fix plan...", err=True)
|
|
59
|
+
result = run_full_audit(url, vertical=vertical, market_locale=market_locale)
|
|
60
|
+
plan = run_all_fixes(url=url, audit_result=result, only=only_set)
|
|
61
|
+
|
|
62
|
+
if not plan.fixes:
|
|
63
|
+
click.echo("✅ No applicable fixes generated.")
|
|
64
|
+
return
|
|
65
|
+
|
|
66
|
+
repo = Path(repo_path).resolve()
|
|
67
|
+
outcome = apply_fix_plan_to_repo(repo, plan.fixes)
|
|
68
|
+
|
|
69
|
+
click.echo(f"✅ Applied GEO fixes into: {repo}")
|
|
70
|
+
click.echo(f"Stack detected: {outcome.stack}")
|
|
71
|
+
click.echo(f"Applied files: {len(outcome.applied_files)}")
|
|
72
|
+
for p in outcome.applied_files[:20]:
|
|
73
|
+
click.echo(f" - {p}")
|
|
74
|
+
if outcome.manual_steps:
|
|
75
|
+
click.echo("⚠️ Manual snippet steps recorded in geo-manual-steps.md")
|