geosition 4.9.1__tar.gz
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.
- geosition-4.9.1/LICENSE +73 -0
- geosition-4.9.1/PKG-INFO +241 -0
- geosition-4.9.1/README.md +94 -0
- geosition-4.9.1/pyproject.toml +198 -0
- geosition-4.9.1/setup.cfg +4 -0
- geosition-4.9.1/src/geo_optimizer/__init__.py +78 -0
- geosition-4.9.1/src/geo_optimizer/cli/__init__.py +1 -0
- geosition-4.9.1/src/geo_optimizer/cli/agent_cmd.py +143 -0
- geosition-4.9.1/src/geo_optimizer/cli/apply_cmd.py +75 -0
- geosition-4.9.1/src/geo_optimizer/cli/audit_cmd.py +409 -0
- geosition-4.9.1/src/geo_optimizer/cli/autopilot_cmd.py +99 -0
- geosition-4.9.1/src/geo_optimizer/cli/benchmark_cmd.py +159 -0
- geosition-4.9.1/src/geo_optimizer/cli/benchmark_formatter.py +249 -0
- geosition-4.9.1/src/geo_optimizer/cli/ci_formatter.py +331 -0
- geosition-4.9.1/src/geo_optimizer/cli/coherence_cmd.py +63 -0
- geosition-4.9.1/src/geo_optimizer/cli/collect_cmd.py +141 -0
- geosition-4.9.1/src/geo_optimizer/cli/content_cmd.py +112 -0
- geosition-4.9.1/src/geo_optimizer/cli/diff_cmd.py +75 -0
- geosition-4.9.1/src/geo_optimizer/cli/fix_cmd.py +167 -0
- geosition-4.9.1/src/geo_optimizer/cli/formatters.py +1042 -0
- geosition-4.9.1/src/geo_optimizer/cli/fullaudit_cmd.py +2111 -0
- geosition-4.9.1/src/geo_optimizer/cli/geosition_cmd.py +1058 -0
- geosition-4.9.1/src/geo_optimizer/cli/github_cmd.py +100 -0
- geosition-4.9.1/src/geo_optimizer/cli/github_formatter.py +101 -0
- geosition-4.9.1/src/geo_optimizer/cli/history_cmd.py +54 -0
- geosition-4.9.1/src/geo_optimizer/cli/html_formatter.py +474 -0
- geosition-4.9.1/src/geo_optimizer/cli/links_cmd.py +77 -0
- geosition-4.9.1/src/geo_optimizer/cli/llms_cmd.py +96 -0
- geosition-4.9.1/src/geo_optimizer/cli/logs_cmd.py +62 -0
- geosition-4.9.1/src/geo_optimizer/cli/main.py +204 -0
- geosition-4.9.1/src/geo_optimizer/cli/marketing_cmd.py +634 -0
- geosition-4.9.1/src/geo_optimizer/cli/monitor_cmd.py +72 -0
- geosition-4.9.1/src/geo_optimizer/cli/orchestrate_cmd.py +72 -0
- geosition-4.9.1/src/geo_optimizer/cli/pdf_formatter.py +26 -0
- geosition-4.9.1/src/geo_optimizer/cli/pipeline_cmd.py +134 -0
- geosition-4.9.1/src/geo_optimizer/cli/playbook_cmd.py +56 -0
- geosition-4.9.1/src/geo_optimizer/cli/rich_formatter.py +1220 -0
- geosition-4.9.1/src/geo_optimizer/cli/rivalry_cmd.py +532 -0
- geosition-4.9.1/src/geo_optimizer/cli/schema_cmd.py +212 -0
- geosition-4.9.1/src/geo_optimizer/cli/scoring_helpers.py +64 -0
- geosition-4.9.1/src/geo_optimizer/cli/seo_cmd.py +264 -0
- geosition-4.9.1/src/geo_optimizer/cli/snapshots_cmd.py +127 -0
- geosition-4.9.1/src/geo_optimizer/cli/track_cmd.py +85 -0
- geosition-4.9.1/src/geo_optimizer/core/__init__.py +1 -0
- geosition-4.9.1/src/geo_optimizer/core/action_intelligence.py +130 -0
- geosition-4.9.1/src/geo_optimizer/core/agent_endpoints.py +457 -0
- geosition-4.9.1/src/geo_optimizer/core/audit.py +1166 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_aeo.py +255 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_ai_discovery.py +190 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_attribution.py +142 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_brand.py +223 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_cdn.py +161 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_citation_map.py +102 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_commerce.py +60 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_content.py +156 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_context_window.py +169 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_conversion.py +493 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_decay.py +147 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_embedding.py +162 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_freshness.py +195 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_indexability.py +127 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_indexnow.py +82 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_instruction.py +236 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_js.py +128 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_links.py +325 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_llms.py +229 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_marketing/__init__.py +14 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_marketing/analysis.py +1384 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_marketing/orchestrator.py +110 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_marketing/planning.py +438 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_media.py +268 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_meta.py +64 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_negative.py +253 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_perf.py +215 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_persistence.py +116 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_platform.py +208 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_rag.py +148 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_robots.py +122 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_schema.py +150 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_sentiment.py +154 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_serp.py +676 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_signals.py +59 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_sxo.py +183 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_tracking.py +346 -0
- geosition-4.9.1/src/geo_optimizer/core/audit_webmcp.py +150 -0
- geosition-4.9.1/src/geo_optimizer/core/batch_audit.py +203 -0
- geosition-4.9.1/src/geo_optimizer/core/benchmark/__init__.py +8 -0
- geosition-4.9.1/src/geo_optimizer/core/benchmark/citation_economics.py +305 -0
- geosition-4.9.1/src/geo_optimizer/core/benchmark/citation_share.py +92 -0
- geosition-4.9.1/src/geo_optimizer/core/benchmark/competitor_matrix.py +56 -0
- geosition-4.9.1/src/geo_optimizer/core/benchmark/competitors.py +64 -0
- geosition-4.9.1/src/geo_optimizer/core/benchmark/domains.py +14 -0
- geosition-4.9.1/src/geo_optimizer/core/benchmark/monitoring.py +73 -0
- geosition-4.9.1/src/geo_optimizer/core/benchmark/page_task.py +108 -0
- geosition-4.9.1/src/geo_optimizer/core/benchmark/runner.py +341 -0
- geosition-4.9.1/src/geo_optimizer/core/benchmark/schedule.py +71 -0
- geosition-4.9.1/src/geo_optimizer/core/benchmark/score.py +87 -0
- geosition-4.9.1/src/geo_optimizer/core/benchmark/store.py +665 -0
- geosition-4.9.1/src/geo_optimizer/core/benchmark/task_classifier.py +95 -0
- geosition-4.9.1/src/geo_optimizer/core/benchmark/unique_value.py +108 -0
- geosition-4.9.1/src/geo_optimizer/core/citability/__init__.py +418 -0
- geosition-4.9.1/src/geo_optimizer/core/citability/_helpers.py +236 -0
- geosition-4.9.1/src/geo_optimizer/core/citability/entity.py +443 -0
- geosition-4.9.1/src/geo_optimizer/core/citability/freshness.py +403 -0
- geosition-4.9.1/src/geo_optimizer/core/citability/platform.py +709 -0
- geosition-4.9.1/src/geo_optimizer/core/citability/signals.py +829 -0
- geosition-4.9.1/src/geo_optimizer/core/citability/sources.py +355 -0
- geosition-4.9.1/src/geo_optimizer/core/citability/structure.py +1139 -0
- geosition-4.9.1/src/geo_optimizer/core/citation_quality.py +172 -0
- geosition-4.9.1/src/geo_optimizer/core/coherence_analyzer.py +194 -0
- geosition-4.9.1/src/geo_optimizer/core/collection/__init__.py +20 -0
- geosition-4.9.1/src/geo_optimizer/core/collection/adapters/__init__.py +38 -0
- geosition-4.9.1/src/geo_optimizer/core/collection/adapters/brightdata_browser.py +129 -0
- geosition-4.9.1/src/geo_optimizer/core/collection/adapters/gemini_grounding.py +121 -0
- geosition-4.9.1/src/geo_optimizer/core/collection/adapters/manual.py +55 -0
- geosition-4.9.1/src/geo_optimizer/core/collection/adapters/perplexity.py +89 -0
- geosition-4.9.1/src/geo_optimizer/core/collection/normalize.py +283 -0
- geosition-4.9.1/src/geo_optimizer/core/collection/pipeline.py +204 -0
- geosition-4.9.1/src/geo_optimizer/core/collection/protocol.py +32 -0
- geosition-4.9.1/src/geo_optimizer/core/collection/store.py +101 -0
- geosition-4.9.1/src/geo_optimizer/core/collection/tracker_bridge.py +135 -0
- geosition-4.9.1/src/geo_optimizer/core/content_workflow.py +185 -0
- geosition-4.9.1/src/geo_optimizer/core/diffing.py +134 -0
- geosition-4.9.1/src/geo_optimizer/core/factual_accuracy.py +288 -0
- geosition-4.9.1/src/geo_optimizer/core/fixer.py +1251 -0
- geosition-4.9.1/src/geo_optimizer/core/gap_analysis.py +271 -0
- geosition-4.9.1/src/geo_optimizer/core/github_repo_audit.py +218 -0
- geosition-4.9.1/src/geo_optimizer/core/history.py +275 -0
- geosition-4.9.1/src/geo_optimizer/core/injection_detector.py +376 -0
- geosition-4.9.1/src/geo_optimizer/core/link_graph.py +170 -0
- geosition-4.9.1/src/geo_optimizer/core/llm_client.py +186 -0
- geosition-4.9.1/src/geo_optimizer/core/llms_generator.py +627 -0
- geosition-4.9.1/src/geo_optimizer/core/log_analyzer.py +165 -0
- geosition-4.9.1/src/geo_optimizer/core/monitor.py +312 -0
- geosition-4.9.1/src/geo_optimizer/core/orchestrator.py +137 -0
- geosition-4.9.1/src/geo_optimizer/core/playbooks.py +97 -0
- geosition-4.9.1/src/geo_optimizer/core/prompt_library.py +136 -0
- geosition-4.9.1/src/geo_optimizer/core/registry.py +210 -0
- geosition-4.9.1/src/geo_optimizer/core/schema_injector.py +362 -0
- geosition-4.9.1/src/geo_optimizer/core/schema_validator.py +153 -0
- geosition-4.9.1/src/geo_optimizer/core/scoring.py +226 -0
- geosition-4.9.1/src/geo_optimizer/core/search_measurement.py +101 -0
- geosition-4.9.1/src/geo_optimizer/core/seo_intelligence.py +843 -0
- geosition-4.9.1/src/geo_optimizer/core/site_coherence.py +95 -0
- geosition-4.9.1/src/geo_optimizer/core/site_integrator.py +91 -0
- geosition-4.9.1/src/geo_optimizer/core/snapshots.py +272 -0
- geosition-4.9.1/src/geo_optimizer/core/term_extractor.py +77 -0
- geosition-4.9.1/src/geo_optimizer/core/trust_stack.py +415 -0
- geosition-4.9.1/src/geo_optimizer/core/vertical_profile.py +375 -0
- geosition-4.9.1/src/geo_optimizer/i18n/__init__.py +151 -0
- geosition-4.9.1/src/geo_optimizer/i18n/locales/en/LC_MESSAGES/geo_optimizer.mo +0 -0
- geosition-4.9.1/src/geo_optimizer/i18n/locales/it/LC_MESSAGES/geo_optimizer.mo +0 -0
- geosition-4.9.1/src/geo_optimizer/mcp/__init__.py +3 -0
- geosition-4.9.1/src/geo_optimizer/mcp/server.py +797 -0
- geosition-4.9.1/src/geo_optimizer/models/__init__.py +1 -0
- geosition-4.9.1/src/geo_optimizer/models/config.py +767 -0
- geosition-4.9.1/src/geo_optimizer/models/project_config.py +165 -0
- geosition-4.9.1/src/geo_optimizer/models/results/__init__.py +295 -0
- geosition-4.9.1/src/geo_optimizer/models/results/analytics.py +286 -0
- geosition-4.9.1/src/geo_optimizer/models/results/audit.py +512 -0
- geosition-4.9.1/src/geo_optimizer/models/results/benchmark.py +331 -0
- geosition-4.9.1/src/geo_optimizer/models/results/citability.py +149 -0
- geosition-4.9.1/src/geo_optimizer/models/results/collection.py +82 -0
- geosition-4.9.1/src/geo_optimizer/models/results/core.py +203 -0
- geosition-4.9.1/src/geo_optimizer/models/results/marketing.py +602 -0
- geosition-4.9.1/src/geo_optimizer/models/results/rag.py +92 -0
- geosition-4.9.1/src/geo_optimizer/models/results/seo.py +212 -0
- geosition-4.9.1/src/geo_optimizer/models/results/trust.py +166 -0
- geosition-4.9.1/src/geo_optimizer/py.typed +0 -0
- geosition-4.9.1/src/geo_optimizer/saas/__init__.py +8 -0
- geosition-4.9.1/src/geo_optimizer/saas/auth.py +169 -0
- geosition-4.9.1/src/geo_optimizer/saas/domain_verify.py +82 -0
- geosition-4.9.1/src/geo_optimizer/saas/models.py +252 -0
- geosition-4.9.1/src/geo_optimizer/saas/search_connections.py +187 -0
- geosition-4.9.1/src/geo_optimizer/saas/service.py +2181 -0
- geosition-4.9.1/src/geo_optimizer/saas/store.py +1537 -0
- geosition-4.9.1/src/geo_optimizer/saas/supabase_store.py +1213 -0
- geosition-4.9.1/src/geo_optimizer/saas/weekly_evidence.py +398 -0
- geosition-4.9.1/src/geo_optimizer/skills/__init__.py +22 -0
- geosition-4.9.1/src/geo_optimizer/skills/catalog/README.md +33 -0
- geosition-4.9.1/src/geo_optimizer/skills/catalog/_template/prompt.md +25 -0
- geosition-4.9.1/src/geo_optimizer/skills/catalog/_template/skill.yaml +27 -0
- geosition-4.9.1/src/geo_optimizer/skills/catalog/geo_ai_discovery_readiness/prompt.md +33 -0
- geosition-4.9.1/src/geo_optimizer/skills/catalog/geo_ai_discovery_readiness/skill.yaml +79 -0
- geosition-4.9.1/src/geo_optimizer/skills/catalog/geo_audit_orchestrator/prompt.md +30 -0
- geosition-4.9.1/src/geo_optimizer/skills/catalog/geo_audit_orchestrator/skill.yaml +65 -0
- geosition-4.9.1/src/geo_optimizer/skills/catalog/geo_citation_readiness/prompt.md +32 -0
- geosition-4.9.1/src/geo_optimizer/skills/catalog/geo_citation_readiness/skill.yaml +79 -0
- geosition-4.9.1/src/geo_optimizer/skills/catalog/geo_competitor_comparison/prompt.md +32 -0
- geosition-4.9.1/src/geo_optimizer/skills/catalog/geo_competitor_comparison/skill.yaml +76 -0
- geosition-4.9.1/src/geo_optimizer/skills/catalog/geo_foundation_repair/prompt.md +31 -0
- geosition-4.9.1/src/geo_optimizer/skills/catalog/geo_foundation_repair/skill.yaml +72 -0
- geosition-4.9.1/src/geo_optimizer/skills/catalog/geo_schema_readiness/prompt.md +33 -0
- geosition-4.9.1/src/geo_optimizer/skills/catalog/geo_schema_readiness/skill.yaml +76 -0
- geosition-4.9.1/src/geo_optimizer/skills/catalog/geo_trust_signal_review/prompt.md +33 -0
- geosition-4.9.1/src/geo_optimizer/skills/catalog/geo_trust_signal_review/skill.yaml +76 -0
- geosition-4.9.1/src/geo_optimizer/skills/loader.py +118 -0
- geosition-4.9.1/src/geo_optimizer/skills/models.py +69 -0
- geosition-4.9.1/src/geo_optimizer/skills/validator.py +179 -0
- geosition-4.9.1/src/geo_optimizer/storage/__init__.py +15 -0
- geosition-4.9.1/src/geo_optimizer/storage/artifacts.py +194 -0
- geosition-4.9.1/src/geo_optimizer/storage/paths.py +82 -0
- geosition-4.9.1/src/geo_optimizer/storage/platform.py +50 -0
- geosition-4.9.1/src/geo_optimizer/utils/__init__.py +1 -0
- geosition-4.9.1/src/geo_optimizer/utils/cache.py +156 -0
- geosition-4.9.1/src/geo_optimizer/utils/http.py +332 -0
- geosition-4.9.1/src/geo_optimizer/utils/http_async.py +192 -0
- geosition-4.9.1/src/geo_optimizer/utils/robots_parser.py +252 -0
- geosition-4.9.1/src/geo_optimizer/utils/seo_program_note.py +14 -0
- geosition-4.9.1/src/geo_optimizer/utils/validators.py +250 -0
- geosition-4.9.1/src/geo_optimizer/web/__init__.py +12 -0
- geosition-4.9.1/src/geo_optimizer/web/app.py +1896 -0
- geosition-4.9.1/src/geo_optimizer/web/badge.py +131 -0
- geosition-4.9.1/src/geo_optimizer/web/cli.py +37 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/ai-bots-reference.md +277 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/ai-context.md +235 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/ci-cd.md +227 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/geo-audit.md +290 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/geo-diff.md +38 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/geo-fix.md +111 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/geo-history.md +65 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/geo-methods.md +327 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/geo-monitor.md +78 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/geo-snapshots.md +103 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/geo-track.md +71 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/getting-started.md +132 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/index.md +50 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/llms-txt.md +208 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/mcp-server.md +410 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/schema-injector.md +444 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/scoring-rubric.md +27 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/search-measurement.md +21 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/skill-files.md +72 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/skill-roadmap.md +193 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/skill-system.md +101 -0
- geosition-4.9.1/src/geo_optimizer/web/docs/troubleshooting.md +297 -0
- geosition-4.9.1/src/geo_optimizer/web/platform_routes.py +1432 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/compare.html +223 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/docs.html +147 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/index.html +609 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/manifesto.html +508 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/ai-companies.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/apple-touch-icon.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/avatars/agency-owner.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/avatars/content-lead.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/avatars/editor.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/avatars/founder.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/avatars/independent-analyst.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/avatars/operator.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/cobe.esm.js +1 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/commerce-ai-assistant.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/commerce-shopping-bag.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/commerce-storefront.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/dashboard-loop.js +118 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/earn-per-citation.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/favicon-16.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/favicon-32.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/favicon-48.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/favicon-64.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/favicon.ico +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/favicon.svg +3 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/hero-bg.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/hero-mountain.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/landing-refresh.css +646 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/lenis.LICENSE.txt +9 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/lenis.min.js +2 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/lenis.min.js.map +1 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/mobile-cta-trees.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/mobile-cta-trees.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/platform-icon-claude.svg +1 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/platform-icon-google.svg +1 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/platform-icon-googlegemini.svg +1 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/platform-icon-perplexity.svg +1 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/platform-icons-LICENSE.txt +30 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/publishers-data.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reel-citrus-poster.jpg +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reel-citrus.mp4 +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reel-coffee-poster.jpg +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reel-coffee-v2.mp4 +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reel-run-poster.jpg +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reel-run.mp4 +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reel-skincare-poster.jpg +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reel-skincare-v2.mp4 +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/README.md +6 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/amber-serum.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/atelier-hero-loop.mp4 +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/atelier-hero-poster.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/ceramic-cup.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/email-preview.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/glass-perfume.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/green-headphones.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/halcy-hero-converted-v4.webm +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/halcy-hero-poster.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/hearthen-animated-hero-desktop.webm +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/hearthen-hero-poster.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/intro-agent-tux.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/intro-bag.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/intro-store.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/laps-hero-loop.mp4 +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/laps-hero-poster.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/leather-bag.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/lift-hero-loop.mp4 +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/lift-hero-poster.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/linen-towels.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/olive-oil.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/sculptural-vase.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/silver-watch.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/stayput-hero-poster.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/stayput-hero-top-cropped-v3.webm +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/store-design-poster.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/store-design-smooth-loop.mp4 +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/terracotta-vase.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/testing-v2-poster.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/testing-v2-smooth.mp4 +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/testing-v2.mp4 +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/zahra-hero-loop-v2.mp4 +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/zahra-loop-poster.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/zippa-hero-pingpong-v2.mp4 +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/reference-amboras/zippa-hero-poster-v2.webp +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/smooth-scroll.js +44 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/terminal-cta-landscape.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/terminal-cta-reference.jpg +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/terminal-cta-scene.jpg +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/terminal-cta-trees-crop.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/assets/terminal-cta-trees.png +0 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/dashboard.html +1591 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/forgot-password.html +80 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/gestion-velora.html +299 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/index.html +209 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/landing.html +605 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/login.html +64 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/register.html +105 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/reset-password.html +75 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/platform/site.css +9480 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/research.html +198 -0
- geosition-4.9.1/src/geo_optimizer/web/templates/roadmap.html +165 -0
- geosition-4.9.1/src/geosition.egg-info/PKG-INFO +241 -0
- geosition-4.9.1/src/geosition.egg-info/SOURCES.txt +421 -0
- geosition-4.9.1/src/geosition.egg-info/dependency_links.txt +1 -0
- geosition-4.9.1/src/geosition.egg-info/entry_points.txt +10 -0
- geosition-4.9.1/src/geosition.egg-info/requires.txt +69 -0
- geosition-4.9.1/src/geosition.egg-info/top_level.txt +1 -0
- geosition-4.9.1/tests/test_action_intelligence.py +50 -0
- geosition-4.9.1/tests/test_agent_endpoints.py +398 -0
- geosition-4.9.1/tests/test_ai_discovery.py +766 -0
- geosition-4.9.1/tests/test_ai_presence_definition_regex.py +28 -0
- geosition-4.9.1/tests/test_ai_scraper_api_auth.py +33 -0
- geosition-4.9.1/tests/test_async.py +134 -0
- geosition-4.9.1/tests/test_audit_aeo.py +142 -0
- geosition-4.9.1/tests/test_audit_indexnow.py +54 -0
- geosition-4.9.1/tests/test_audit_marketing.py +35 -0
- geosition-4.9.1/tests/test_audit_sxo.py +72 -0
- geosition-4.9.1/tests/test_badge.py +194 -0
- geosition-4.9.1/tests/test_batch_audit.py +114 -0
- geosition-4.9.1/tests/test_benchmark.py +575 -0
- geosition-4.9.1/tests/test_brand_entity_signals.py +393 -0
- geosition-4.9.1/tests/test_cache_serverless.py +26 -0
- geosition-4.9.1/tests/test_cdn_js_checks.py +281 -0
- geosition-4.9.1/tests/test_ci_formatter.py +210 -0
- geosition-4.9.1/tests/test_citability.py +2240 -0
- geosition-4.9.1/tests/test_citation_attribution.py +92 -0
- geosition-4.9.1/tests/test_citation_map.py +68 -0
- geosition-4.9.1/tests/test_citation_quality.py +55 -0
- geosition-4.9.1/tests/test_cli.py +1902 -0
- geosition-4.9.1/tests/test_coherence.py +170 -0
- geosition-4.9.1/tests/test_collection.py +148 -0
- geosition-4.9.1/tests/test_collection_adapters.py +61 -0
- geosition-4.9.1/tests/test_content_decay.py +77 -0
- geosition-4.9.1/tests/test_content_workflow.py +60 -0
- geosition-4.9.1/tests/test_context_window.py +153 -0
- geosition-4.9.1/tests/test_core.py +2354 -0
- geosition-4.9.1/tests/test_core_contract_smoke.py +103 -0
- geosition-4.9.1/tests/test_core_network_hardening.py +31 -0
- geosition-4.9.1/tests/test_coverage_m1.py +1648 -0
- geosition-4.9.1/tests/test_diff.py +73 -0
- geosition-4.9.1/tests/test_embedding_proximity.py +74 -0
- geosition-4.9.1/tests/test_factual_accuracy.py +97 -0
- geosition-4.9.1/tests/test_fix.py +703 -0
- geosition-4.9.1/tests/test_gap_analysis.py +111 -0
- geosition-4.9.1/tests/test_geosition_cmd.py +147 -0
- geosition-4.9.1/tests/test_github_repo_audit.py +72 -0
- geosition-4.9.1/tests/test_history.py +76 -0
- geosition-4.9.1/tests/test_http_async.py +476 -0
- geosition-4.9.1/tests/test_instruction_readiness.py +229 -0
- geosition-4.9.1/tests/test_link_graph.py +38 -0
- geosition-4.9.1/tests/test_llm_sentiment.py +130 -0
- geosition-4.9.1/tests/test_llms_v2_validation.py +321 -0
- geosition-4.9.1/tests/test_log_analyzer.py +107 -0
- geosition-4.9.1/tests/test_mcp.py +563 -0
- geosition-4.9.1/tests/test_mcp_protocol.py +24 -0
- geosition-4.9.1/tests/test_monitor.py +91 -0
- geosition-4.9.1/tests/test_multi_turn.py +74 -0
- geosition-4.9.1/tests/test_negative_signals.py +135 -0
- geosition-4.9.1/tests/test_p0_security_fixes.py +518 -0
- geosition-4.9.1/tests/test_pdf.py +168 -0
- geosition-4.9.1/tests/test_performance_budget.py +45 -0
- geosition-4.9.1/tests/test_platform_citation.py +104 -0
- geosition-4.9.1/tests/test_platform_saas.py +2113 -0
- geosition-4.9.1/tests/test_playbook_and_pipeline.py +34 -0
- geosition-4.9.1/tests/test_prompt_injection.py +424 -0
- geosition-4.9.1/tests/test_prompt_library.py +54 -0
- geosition-4.9.1/tests/test_rag_chunk.py +96 -0
- geosition-4.9.1/tests/test_readiness_evidence.py +35 -0
- geosition-4.9.1/tests/test_registry.py +275 -0
- geosition-4.9.1/tests/test_ricerca_2025_2026.py +386 -0
- geosition-4.9.1/tests/test_schema_richness_394.py +228 -0
- geosition-4.9.1/tests/test_search_connections.py +182 -0
- geosition-4.9.1/tests/test_search_measurement.py +133 -0
- geosition-4.9.1/tests/test_security_critical.py +190 -0
- geosition-4.9.1/tests/test_security_m1.py +200 -0
- geosition-4.9.1/tests/test_seo_intelligence.py +146 -0
- geosition-4.9.1/tests/test_site_integrator.py +30 -0
- geosition-4.9.1/tests/test_skill_system.py +92 -0
- geosition-4.9.1/tests/test_snapshots.py +61 -0
- geosition-4.9.1/tests/test_ssrf_hardening.py +385 -0
- geosition-4.9.1/tests/test_storage.py +166 -0
- geosition-4.9.1/tests/test_trust_stack.py +339 -0
- geosition-4.9.1/tests/test_v21_coverage.py +1008 -0
- geosition-4.9.1/tests/test_v2_remaining_fixes.py +347 -0
- geosition-4.9.1/tests/test_vertical_profile.py +80 -0
- geosition-4.9.1/tests/test_web_app.py +1053 -0
- geosition-4.9.1/tests/test_web_history.py +61 -0
- geosition-4.9.1/tests/test_webmcp.py +184 -0
geosition-4.9.1/LICENSE
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
MIT License (with OpenAI/Anthropic Rider)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Arnaud Bellemare
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
ADDITIONAL RIDER / RESTRICTION (OpenAI / Anthropic):
|
|
13
|
+
|
|
14
|
+
This rider is part of the "conditions" of this License. In the event of any
|
|
15
|
+
conflict between this rider and any other portion of this License, this rider
|
|
16
|
+
controls.
|
|
17
|
+
|
|
18
|
+
"Restricted Parties" means OpenAI, L.L.C.; Anthropic, PBC; any of their
|
|
19
|
+
respective Affiliates; and any person or entity acting directly or indirectly
|
|
20
|
+
on behalf of, for the benefit of, or under the direction of any of the
|
|
21
|
+
foregoing (including any officer, director, employee, contractor, agent,
|
|
22
|
+
consultant, service provider, or representative).
|
|
23
|
+
|
|
24
|
+
Notwithstanding any other provision of this License, no rights are granted to
|
|
25
|
+
any Restricted Party. Any purported license, sublicense, assignment, transfer,
|
|
26
|
+
or other permission to any Restricted Party is null and void absent the
|
|
27
|
+
express prior written permission of Arnaud Bellemare.
|
|
28
|
+
|
|
29
|
+
You may not provide, disclose, distribute, sublicense, sell, lease, lend,
|
|
30
|
+
host, make available, or otherwise permit access to the Software or any
|
|
31
|
+
derivative work of the Software (as defined in applicable copyright law)
|
|
32
|
+
(collectively, "Derivative Works") to or for any Restricted Party.
|
|
33
|
+
|
|
34
|
+
For purposes of this rider, "use" includes, without limitation: copying,
|
|
35
|
+
modifying, merging, publishing, distributing, sublicensing, selling,
|
|
36
|
+
transferring, making available, hosting, deploying, executing, benchmarking,
|
|
37
|
+
testing, analyzing, indexing, or incorporating the Software or any Derivative
|
|
38
|
+
Works into any dataset, training corpus, evaluation harness, or pipeline for
|
|
39
|
+
machine learning or other automated systems.
|
|
40
|
+
|
|
41
|
+
This rider applies to the Software and all Derivative Works. As a condition of
|
|
42
|
+
use, you agree that this rider is a precondition to exercising any rights
|
|
43
|
+
under this License, and you agree that any distribution of the Software or any
|
|
44
|
+
Derivative Works must include this rider provision unmodified.
|
|
45
|
+
|
|
46
|
+
Any breach of this rider automatically and immediately terminates the
|
|
47
|
+
permissions granted by this License. Upon termination, you must immediately
|
|
48
|
+
cease all use and distribution of the Software and any Derivative Works and
|
|
49
|
+
destroy all copies under your control.
|
|
50
|
+
|
|
51
|
+
You agree that a breach of this rider would cause irreparable harm and that
|
|
52
|
+
Arnaud Bellemare may seek injunctive or other equitable relief to enforce this
|
|
53
|
+
rider, in addition to any other remedies available at law. To the maximum
|
|
54
|
+
extent permitted by applicable law, the prevailing party in any action to
|
|
55
|
+
enforce this rider shall be entitled to recover reasonable attorneys' fees and
|
|
56
|
+
costs.
|
|
57
|
+
|
|
58
|
+
For purposes of this rider, "Affiliate" means any entity that directly or
|
|
59
|
+
indirectly controls, is controlled by, or is under common control with the
|
|
60
|
+
specified party. "Control" means ownership of more than 50% of the voting
|
|
61
|
+
securities or other ownership interest, or the power to direct management or
|
|
62
|
+
policies by contract or otherwise.
|
|
63
|
+
|
|
64
|
+
The above copyright notice and this permission notice shall be included in all
|
|
65
|
+
copies or substantial portions of the Software.
|
|
66
|
+
|
|
67
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
68
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
69
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
70
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
71
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
72
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
73
|
+
SOFTWARE.
|
geosition-4.9.1/PKG-INFO
ADDED
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: geosition
|
|
3
|
+
Version: 4.9.1
|
|
4
|
+
Summary: Generative Engine Optimization toolkit — make websites visible to AI search engines
|
|
5
|
+
Author-email: Arnaud Bellemare <asapbellemare@gmail.com>
|
|
6
|
+
License: MIT License (with OpenAI/Anthropic Rider)
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2026 Arnaud Bellemare
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
ADDITIONAL RIDER / RESTRICTION (OpenAI / Anthropic):
|
|
18
|
+
|
|
19
|
+
This rider is part of the "conditions" of this License. In the event of any
|
|
20
|
+
conflict between this rider and any other portion of this License, this rider
|
|
21
|
+
controls.
|
|
22
|
+
|
|
23
|
+
"Restricted Parties" means OpenAI, L.L.C.; Anthropic, PBC; any of their
|
|
24
|
+
respective Affiliates; and any person or entity acting directly or indirectly
|
|
25
|
+
on behalf of, for the benefit of, or under the direction of any of the
|
|
26
|
+
foregoing (including any officer, director, employee, contractor, agent,
|
|
27
|
+
consultant, service provider, or representative).
|
|
28
|
+
|
|
29
|
+
Notwithstanding any other provision of this License, no rights are granted to
|
|
30
|
+
any Restricted Party. Any purported license, sublicense, assignment, transfer,
|
|
31
|
+
or other permission to any Restricted Party is null and void absent the
|
|
32
|
+
express prior written permission of Arnaud Bellemare.
|
|
33
|
+
|
|
34
|
+
You may not provide, disclose, distribute, sublicense, sell, lease, lend,
|
|
35
|
+
host, make available, or otherwise permit access to the Software or any
|
|
36
|
+
derivative work of the Software (as defined in applicable copyright law)
|
|
37
|
+
(collectively, "Derivative Works") to or for any Restricted Party.
|
|
38
|
+
|
|
39
|
+
For purposes of this rider, "use" includes, without limitation: copying,
|
|
40
|
+
modifying, merging, publishing, distributing, sublicensing, selling,
|
|
41
|
+
transferring, making available, hosting, deploying, executing, benchmarking,
|
|
42
|
+
testing, analyzing, indexing, or incorporating the Software or any Derivative
|
|
43
|
+
Works into any dataset, training corpus, evaluation harness, or pipeline for
|
|
44
|
+
machine learning or other automated systems.
|
|
45
|
+
|
|
46
|
+
This rider applies to the Software and all Derivative Works. As a condition of
|
|
47
|
+
use, you agree that this rider is a precondition to exercising any rights
|
|
48
|
+
under this License, and you agree that any distribution of the Software or any
|
|
49
|
+
Derivative Works must include this rider provision unmodified.
|
|
50
|
+
|
|
51
|
+
Any breach of this rider automatically and immediately terminates the
|
|
52
|
+
permissions granted by this License. Upon termination, you must immediately
|
|
53
|
+
cease all use and distribution of the Software and any Derivative Works and
|
|
54
|
+
destroy all copies under your control.
|
|
55
|
+
|
|
56
|
+
You agree that a breach of this rider would cause irreparable harm and that
|
|
57
|
+
Arnaud Bellemare may seek injunctive or other equitable relief to enforce this
|
|
58
|
+
rider, in addition to any other remedies available at law. To the maximum
|
|
59
|
+
extent permitted by applicable law, the prevailing party in any action to
|
|
60
|
+
enforce this rider shall be entitled to recover reasonable attorneys' fees and
|
|
61
|
+
costs.
|
|
62
|
+
|
|
63
|
+
For purposes of this rider, "Affiliate" means any entity that directly or
|
|
64
|
+
indirectly controls, is controlled by, or is under common control with the
|
|
65
|
+
specified party. "Control" means ownership of more than 50% of the voting
|
|
66
|
+
securities or other ownership interest, or the power to direct management or
|
|
67
|
+
policies by contract or otherwise.
|
|
68
|
+
|
|
69
|
+
The above copyright notice and this permission notice shall be included in all
|
|
70
|
+
copies or substantial portions of the Software.
|
|
71
|
+
|
|
72
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
73
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
74
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
75
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
76
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
77
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
78
|
+
SOFTWARE.
|
|
79
|
+
|
|
80
|
+
Project-URL: Homepage, https://github.com/arnaudbellemare/geosition
|
|
81
|
+
Project-URL: Documentation, https://github.com/arnaudbellemare/geosition#readme
|
|
82
|
+
Project-URL: Repository, https://github.com/arnaudbellemare/geosition
|
|
83
|
+
Project-URL: Issues, https://github.com/arnaudbellemare/geosition/issues
|
|
84
|
+
Keywords: geo,seo,ai,llm,optimization,schema,llms-txt,generative-engine
|
|
85
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
86
|
+
Classifier: Intended Audience :: Developers
|
|
87
|
+
Classifier: Programming Language :: Python :: 3
|
|
88
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
89
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
90
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
91
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
92
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
93
|
+
Classifier: Topic :: Internet :: WWW/HTTP
|
|
94
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
95
|
+
Requires-Python: >=3.9
|
|
96
|
+
Description-Content-Type: text/markdown
|
|
97
|
+
License-File: LICENSE
|
|
98
|
+
Requires-Dist: click<9.0,>=8.0
|
|
99
|
+
Requires-Dist: cryptography<51,>=50.0.0
|
|
100
|
+
Requires-Dist: requests<2.33.0,>=2.32.5; python_version < "3.10"
|
|
101
|
+
Requires-Dist: requests<3.0.0,>=2.33.0; python_version >= "3.10"
|
|
102
|
+
Requires-Dist: beautifulsoup4<5.0.0,>=4.12.0
|
|
103
|
+
Requires-Dist: lxml<7.0.0,>=4.9.0
|
|
104
|
+
Requires-Dist: urllib3<2.7.0,>=2.6.3; python_version < "3.10"
|
|
105
|
+
Requires-Dist: urllib3<3.0.0,>=2.7.0; python_version >= "3.10"
|
|
106
|
+
Requires-Dist: fastapi<1.0,>=0.128.8; python_version < "3.10"
|
|
107
|
+
Requires-Dist: fastapi<1.0,>=0.162.0; python_version >= "3.10"
|
|
108
|
+
Requires-Dist: starlette<2.0,>=1.0.1; python_version >= "3.10"
|
|
109
|
+
Requires-Dist: uvicorn[standard]<1.0,>=0.27.0
|
|
110
|
+
Requires-Dist: python-dotenv<1.2.2,>=1.2.1; python_version < "3.10"
|
|
111
|
+
Requires-Dist: python-dotenv>=1.2.2; python_version >= "3.10"
|
|
112
|
+
Requires-Dist: markdown<4.0,>=3.5.0
|
|
113
|
+
Provides-Extra: rich
|
|
114
|
+
Requires-Dist: rich<16.0,>=13.0; extra == "rich"
|
|
115
|
+
Provides-Extra: config
|
|
116
|
+
Requires-Dist: pyyaml<7.0,>=6.0; extra == "config"
|
|
117
|
+
Provides-Extra: async
|
|
118
|
+
Requires-Dist: httpx<1.0,>=0.27.0; extra == "async"
|
|
119
|
+
Provides-Extra: web
|
|
120
|
+
Requires-Dist: fastapi<1.0,>=0.128.8; python_version < "3.10" and extra == "web"
|
|
121
|
+
Requires-Dist: fastapi<1.0,>=0.162.0; python_version >= "3.10" and extra == "web"
|
|
122
|
+
Requires-Dist: starlette<2.0,>=1.0.1; python_version >= "3.10" and extra == "web"
|
|
123
|
+
Requires-Dist: uvicorn[standard]<1.0,>=0.27.0; extra == "web"
|
|
124
|
+
Requires-Dist: python-dotenv<1.2.2,>=1.2.1; python_version < "3.10" and extra == "web"
|
|
125
|
+
Requires-Dist: python-dotenv>=1.2.2; python_version >= "3.10" and extra == "web"
|
|
126
|
+
Requires-Dist: markdown<4.0,>=3.5.0; extra == "web"
|
|
127
|
+
Provides-Extra: pdf
|
|
128
|
+
Requires-Dist: weasyprint>=60.0; extra == "pdf"
|
|
129
|
+
Provides-Extra: mcp
|
|
130
|
+
Requires-Dist: mcp>=1.0.0; python_version >= "3.10" and extra == "mcp"
|
|
131
|
+
Provides-Extra: embedding
|
|
132
|
+
Requires-Dist: sentence-transformers<6.0,>=2.2.0; extra == "embedding"
|
|
133
|
+
Provides-Extra: storage
|
|
134
|
+
Requires-Dist: boto3<2.0,>=1.28.0; extra == "storage"
|
|
135
|
+
Provides-Extra: llm
|
|
136
|
+
Requires-Dist: openai<3.0,>=1.0.0; extra == "llm"
|
|
137
|
+
Requires-Dist: anthropic<2.0,>=0.30.0; extra == "llm"
|
|
138
|
+
Provides-Extra: dev
|
|
139
|
+
Requires-Dist: pytest<10.0,>=7.0; extra == "dev"
|
|
140
|
+
Requires-Dist: pytest-cov<8.0,>=4.0; extra == "dev"
|
|
141
|
+
Requires-Dist: ruff>=0.8.0; extra == "dev"
|
|
142
|
+
Requires-Dist: pyyaml<7.0,>=6.0; extra == "dev"
|
|
143
|
+
Requires-Dist: httpx<1.0,>=0.27.0; extra == "dev"
|
|
144
|
+
Provides-Extra: all
|
|
145
|
+
Requires-Dist: geosition[async,config,mcp,pdf,web]; extra == "all"
|
|
146
|
+
Dynamic: license-file
|
|
147
|
+
|
|
148
|
+
<p align="center">
|
|
149
|
+
<img src="assets/geosition-banner.svg" alt="GEOSITION — Build for AI search. Audit your site, find the next fix." width="100%">
|
|
150
|
+
</p>
|
|
151
|
+
|
|
152
|
+
# GEOSITION
|
|
153
|
+
|
|
154
|
+
A source-available developer toolkit for auditing websites for AI search readiness. Check crawler access, structured data, metadata, and content; then review practical suggestions for improving your site.
|
|
155
|
+
|
|
156
|
+
[](https://github.com/arnaudbellemare/geosition/actions/workflows/ci.yml)
|
|
157
|
+
[](https://www.python.org/)
|
|
158
|
+
[](LICENSE)
|
|
159
|
+
|
|
160
|
+
[Documentation](https://arnaudbellemare.github.io/geosition/) · [Website](https://geositionai.com/) · [Contributing](.github/CONTRIBUTING.md) · [Security](.github/SECURITY.md)
|
|
161
|
+
|
|
162
|
+
## Get started
|
|
163
|
+
|
|
164
|
+
Install GEOSITION and audit a public page:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
python -m pip install geosition
|
|
168
|
+
geo audit --url https://example.com
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
The report includes a readiness score, a breakdown of checks, and suggested next steps. The score is a **heuristic**: it does not measure actual AI citations or guarantee visibility. See the [scoring rubric](docs/scoring-rubric.md) for details.
|
|
172
|
+
|
|
173
|
+
> Prefer to inspect the source first? Clone this repository and install with `python -m pip install -e ".[dev]"`.
|
|
174
|
+
|
|
175
|
+
## Common tasks
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# Save a machine-readable audit
|
|
179
|
+
geo audit --url https://example.com --format json --output report.json
|
|
180
|
+
|
|
181
|
+
# Preview suggested fixes; --apply writes generated files to ./geo-fixes/
|
|
182
|
+
geo fix --url https://example.com
|
|
183
|
+
geo fix --url https://example.com --apply
|
|
184
|
+
|
|
185
|
+
# Audit pages from a sitemap
|
|
186
|
+
geo audit --sitemap https://example.com/sitemap.xml --max-urls 25
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Review generated files before adding them to your site. Run `geo --help` or `geo <command> --help` to explore the CLI. The [command guide](docs/GEOSITION_CLI.md) covers more workflows.
|
|
190
|
+
|
|
191
|
+
## Use from Python
|
|
192
|
+
|
|
193
|
+
```python
|
|
194
|
+
from geo_optimizer import audit
|
|
195
|
+
|
|
196
|
+
result = audit("https://example.com")
|
|
197
|
+
print(result.score, result.band)
|
|
198
|
+
print(result.recommendations)
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
For the asynchronous API, import `audit_async`. The package also provides an [MCP server](docs/mcp-server.md) and a [GitHub Action](docs/ci-cd.md).
|
|
202
|
+
|
|
203
|
+
## What it checks
|
|
204
|
+
|
|
205
|
+
- Search crawler access and technical signals
|
|
206
|
+
- Structured data, page metadata, and business identity
|
|
207
|
+
- Content structure and product data on individual pages
|
|
208
|
+
- Optional discovery files, reported separately from the readiness score
|
|
209
|
+
|
|
210
|
+
The dashboard can compare sampled AI answers and connect first-party search data when the required services are configured. Search traffic and sampled citations are separate measurements; neither is inferred from the readiness score. See [search measurement setup](docs/search-measurement.md).
|
|
211
|
+
|
|
212
|
+
## Explore the repository
|
|
213
|
+
|
|
214
|
+
| Path | What you'll find |
|
|
215
|
+
| --- | --- |
|
|
216
|
+
| [`src/geo_optimizer/`](src/geo_optimizer/) | CLI, audit engine, models, web app, and MCP server |
|
|
217
|
+
| [`tests/`](tests/) | Unit and integration tests |
|
|
218
|
+
| [`docs/`](docs/) | Guides, scoring, and platform setup |
|
|
219
|
+
| [`examples/`](examples/) | Sample inputs and plugin example |
|
|
220
|
+
| [`apps/`](apps/) | Additional applications |
|
|
221
|
+
| [`seo/`](seo/) | Repository SEO program and sample keyword data |
|
|
222
|
+
|
|
223
|
+
See the [repository map](docs/repository-map.md) for a closer look.
|
|
224
|
+
|
|
225
|
+
## Development
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
git clone https://github.com/arnaudbellemare/geosition.git
|
|
229
|
+
cd geosition
|
|
230
|
+
python -m venv .venv
|
|
231
|
+
source .venv/bin/activate
|
|
232
|
+
python -m pip install -e ".[dev]"
|
|
233
|
+
pytest tests/ -q
|
|
234
|
+
ruff check src/geo_optimizer/
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
Contributions are welcome. Start with [CONTRIBUTING.md](.github/CONTRIBUTING.md), and report security issues using [SECURITY.md](.github/SECURITY.md).
|
|
238
|
+
|
|
239
|
+
## License
|
|
240
|
+
|
|
241
|
+
GEOSITION is source-available under the terms in [LICENSE](LICENSE), including the OpenAI/Anthropic rider. Read the full license before using or redistributing the software.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/geosition-banner.svg" alt="GEOSITION — Build for AI search. Audit your site, find the next fix." width="100%">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# GEOSITION
|
|
6
|
+
|
|
7
|
+
A source-available developer toolkit for auditing websites for AI search readiness. Check crawler access, structured data, metadata, and content; then review practical suggestions for improving your site.
|
|
8
|
+
|
|
9
|
+
[](https://github.com/arnaudbellemare/geosition/actions/workflows/ci.yml)
|
|
10
|
+
[](https://www.python.org/)
|
|
11
|
+
[](LICENSE)
|
|
12
|
+
|
|
13
|
+
[Documentation](https://arnaudbellemare.github.io/geosition/) · [Website](https://geositionai.com/) · [Contributing](.github/CONTRIBUTING.md) · [Security](.github/SECURITY.md)
|
|
14
|
+
|
|
15
|
+
## Get started
|
|
16
|
+
|
|
17
|
+
Install GEOSITION and audit a public page:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
python -m pip install geosition
|
|
21
|
+
geo audit --url https://example.com
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
The report includes a readiness score, a breakdown of checks, and suggested next steps. The score is a **heuristic**: it does not measure actual AI citations or guarantee visibility. See the [scoring rubric](docs/scoring-rubric.md) for details.
|
|
25
|
+
|
|
26
|
+
> Prefer to inspect the source first? Clone this repository and install with `python -m pip install -e ".[dev]"`.
|
|
27
|
+
|
|
28
|
+
## Common tasks
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# Save a machine-readable audit
|
|
32
|
+
geo audit --url https://example.com --format json --output report.json
|
|
33
|
+
|
|
34
|
+
# Preview suggested fixes; --apply writes generated files to ./geo-fixes/
|
|
35
|
+
geo fix --url https://example.com
|
|
36
|
+
geo fix --url https://example.com --apply
|
|
37
|
+
|
|
38
|
+
# Audit pages from a sitemap
|
|
39
|
+
geo audit --sitemap https://example.com/sitemap.xml --max-urls 25
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Review generated files before adding them to your site. Run `geo --help` or `geo <command> --help` to explore the CLI. The [command guide](docs/GEOSITION_CLI.md) covers more workflows.
|
|
43
|
+
|
|
44
|
+
## Use from Python
|
|
45
|
+
|
|
46
|
+
```python
|
|
47
|
+
from geo_optimizer import audit
|
|
48
|
+
|
|
49
|
+
result = audit("https://example.com")
|
|
50
|
+
print(result.score, result.band)
|
|
51
|
+
print(result.recommendations)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
For the asynchronous API, import `audit_async`. The package also provides an [MCP server](docs/mcp-server.md) and a [GitHub Action](docs/ci-cd.md).
|
|
55
|
+
|
|
56
|
+
## What it checks
|
|
57
|
+
|
|
58
|
+
- Search crawler access and technical signals
|
|
59
|
+
- Structured data, page metadata, and business identity
|
|
60
|
+
- Content structure and product data on individual pages
|
|
61
|
+
- Optional discovery files, reported separately from the readiness score
|
|
62
|
+
|
|
63
|
+
The dashboard can compare sampled AI answers and connect first-party search data when the required services are configured. Search traffic and sampled citations are separate measurements; neither is inferred from the readiness score. See [search measurement setup](docs/search-measurement.md).
|
|
64
|
+
|
|
65
|
+
## Explore the repository
|
|
66
|
+
|
|
67
|
+
| Path | What you'll find |
|
|
68
|
+
| --- | --- |
|
|
69
|
+
| [`src/geo_optimizer/`](src/geo_optimizer/) | CLI, audit engine, models, web app, and MCP server |
|
|
70
|
+
| [`tests/`](tests/) | Unit and integration tests |
|
|
71
|
+
| [`docs/`](docs/) | Guides, scoring, and platform setup |
|
|
72
|
+
| [`examples/`](examples/) | Sample inputs and plugin example |
|
|
73
|
+
| [`apps/`](apps/) | Additional applications |
|
|
74
|
+
| [`seo/`](seo/) | Repository SEO program and sample keyword data |
|
|
75
|
+
|
|
76
|
+
See the [repository map](docs/repository-map.md) for a closer look.
|
|
77
|
+
|
|
78
|
+
## Development
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
git clone https://github.com/arnaudbellemare/geosition.git
|
|
82
|
+
cd geosition
|
|
83
|
+
python -m venv .venv
|
|
84
|
+
source .venv/bin/activate
|
|
85
|
+
python -m pip install -e ".[dev]"
|
|
86
|
+
pytest tests/ -q
|
|
87
|
+
ruff check src/geo_optimizer/
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Contributions are welcome. Start with [CONTRIBUTING.md](.github/CONTRIBUTING.md), and report security issues using [SECURITY.md](.github/SECURITY.md).
|
|
91
|
+
|
|
92
|
+
## License
|
|
93
|
+
|
|
94
|
+
GEOSITION is source-available under the terms in [LICENSE](LICENSE), including the OpenAI/Anthropic rider. Read the full license before using or redistributing the software.
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "geosition"
|
|
7
|
+
version = "4.9.1"
|
|
8
|
+
description = "Generative Engine Optimization toolkit — make websites visible to AI search engines"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = {file = "LICENSE"}
|
|
11
|
+
requires-python = ">=3.9"
|
|
12
|
+
authors = [
|
|
13
|
+
{name = "Arnaud Bellemare", email = "asapbellemare@gmail.com"},
|
|
14
|
+
]
|
|
15
|
+
keywords = ["geo", "seo", "ai", "llm", "optimization", "schema", "llms-txt", "generative-engine"]
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Development Status :: 5 - Production/Stable",
|
|
18
|
+
"Intended Audience :: Developers",
|
|
19
|
+
"Programming Language :: Python :: 3",
|
|
20
|
+
"Programming Language :: Python :: 3.9",
|
|
21
|
+
"Programming Language :: Python :: 3.10",
|
|
22
|
+
"Programming Language :: Python :: 3.11",
|
|
23
|
+
"Programming Language :: Python :: 3.12",
|
|
24
|
+
"Programming Language :: Python :: 3.13",
|
|
25
|
+
"Topic :: Internet :: WWW/HTTP",
|
|
26
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
27
|
+
]
|
|
28
|
+
dependencies = [
|
|
29
|
+
"click>=8.0,<9.0",
|
|
30
|
+
"cryptography>=50.0.0,<51",
|
|
31
|
+
"requests>=2.32.5,<2.33.0; python_version < '3.10'",
|
|
32
|
+
"requests>=2.33.0,<3.0.0; python_version >= '3.10'",
|
|
33
|
+
"beautifulsoup4>=4.12.0,<5.0.0",
|
|
34
|
+
"lxml>=4.9.0,<7.0.0",
|
|
35
|
+
"urllib3>=2.6.3,<2.7.0; python_version < '3.10'",
|
|
36
|
+
"urllib3>=2.7.0,<3.0.0; python_version >= '3.10'",
|
|
37
|
+
"fastapi>=0.128.8,<1.0; python_version < '3.10'",
|
|
38
|
+
"fastapi>=0.162.0,<1.0; python_version >= '3.10'",
|
|
39
|
+
"starlette>=1.0.1,<2.0; python_version >= '3.10'",
|
|
40
|
+
"uvicorn[standard]>=0.27.0,<1.0",
|
|
41
|
+
"python-dotenv>=1.2.1,<1.2.2; python_version < '3.10'",
|
|
42
|
+
"python-dotenv>=1.2.2; python_version >= '3.10'",
|
|
43
|
+
"markdown>=3.5.0,<4.0",
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
[project.optional-dependencies]
|
|
47
|
+
rich = [
|
|
48
|
+
"rich>=13.0,<16.0",
|
|
49
|
+
]
|
|
50
|
+
config = [
|
|
51
|
+
"pyyaml>=6.0,<7.0",
|
|
52
|
+
]
|
|
53
|
+
async = [
|
|
54
|
+
"httpx>=0.27.0,<1.0",
|
|
55
|
+
]
|
|
56
|
+
web = [
|
|
57
|
+
"fastapi>=0.128.8,<1.0; python_version < '3.10'",
|
|
58
|
+
"fastapi>=0.162.0,<1.0; python_version >= '3.10'",
|
|
59
|
+
"starlette>=1.0.1,<2.0; python_version >= '3.10'",
|
|
60
|
+
"uvicorn[standard]>=0.27.0,<1.0",
|
|
61
|
+
"python-dotenv>=1.2.1,<1.2.2; python_version < '3.10'",
|
|
62
|
+
"python-dotenv>=1.2.2; python_version >= '3.10'",
|
|
63
|
+
"markdown>=3.5.0,<4.0",
|
|
64
|
+
]
|
|
65
|
+
pdf = [
|
|
66
|
+
"weasyprint>=60.0",
|
|
67
|
+
]
|
|
68
|
+
mcp = [
|
|
69
|
+
"mcp>=1.0.0; python_version >= '3.10'",
|
|
70
|
+
]
|
|
71
|
+
embedding = [
|
|
72
|
+
"sentence-transformers>=2.2.0,<6.0",
|
|
73
|
+
]
|
|
74
|
+
storage = [
|
|
75
|
+
"boto3>=1.28.0,<2.0",
|
|
76
|
+
]
|
|
77
|
+
llm = [
|
|
78
|
+
"openai>=1.0.0,<3.0",
|
|
79
|
+
"anthropic>=0.30.0,<2.0",
|
|
80
|
+
]
|
|
81
|
+
dev = [
|
|
82
|
+
"pytest>=7.0,<10.0",
|
|
83
|
+
"pytest-cov>=4.0,<8.0",
|
|
84
|
+
"ruff>=0.8.0",
|
|
85
|
+
"pyyaml>=6.0,<7.0",
|
|
86
|
+
"httpx>=0.27.0,<1.0",
|
|
87
|
+
]
|
|
88
|
+
# Gruppo convenienza: installa tutte le dipendenze opzionali utente (#136)
|
|
89
|
+
all = [
|
|
90
|
+
"geosition[async,web,mcp,pdf,config]",
|
|
91
|
+
]
|
|
92
|
+
|
|
93
|
+
[project.urls]
|
|
94
|
+
Homepage = "https://github.com/arnaudbellemare/geosition"
|
|
95
|
+
Documentation = "https://github.com/arnaudbellemare/geosition#readme"
|
|
96
|
+
Repository = "https://github.com/arnaudbellemare/geosition"
|
|
97
|
+
Issues = "https://github.com/arnaudbellemare/geosition/issues"
|
|
98
|
+
|
|
99
|
+
[project.scripts]
|
|
100
|
+
geo = "geo_optimizer.cli.main:cli"
|
|
101
|
+
aiv = "geo_optimizer.cli.main:cli"
|
|
102
|
+
ai-visibility-audit = "geo_optimizer.cli.main:cli"
|
|
103
|
+
ai-citation-optimizer = "geo_optimizer.cli.main:cli"
|
|
104
|
+
ai-search-readiness = "geo_optimizer.cli.main:cli"
|
|
105
|
+
local-ai-presence-monitor = "geo_optimizer.cli.main:cli"
|
|
106
|
+
geo-mcp = "geo_optimizer.mcp.server:main"
|
|
107
|
+
geo-web = "geo_optimizer.web.cli:main"
|
|
108
|
+
geosition = "geo_optimizer.cli.geosition_cmd:geosition"
|
|
109
|
+
|
|
110
|
+
[tool.setuptools.packages.find]
|
|
111
|
+
where = ["src"]
|
|
112
|
+
|
|
113
|
+
[tool.setuptools.package-data]
|
|
114
|
+
# Solo i file compilati .mo — i sorgenti .po non appartengono al pacchetto distribuito (#135)
|
|
115
|
+
"geo_optimizer" = [
|
|
116
|
+
"py.typed",
|
|
117
|
+
"i18n/locales/*/LC_MESSAGES/*.mo",
|
|
118
|
+
"web/templates/*.html",
|
|
119
|
+
"web/templates/platform/*.html",
|
|
120
|
+
"web/templates/platform/site.css",
|
|
121
|
+
"web/templates/platform/assets/*",
|
|
122
|
+
"web/templates/platform/assets/avatars/*",
|
|
123
|
+
"web/templates/platform/assets/reference-amboras/*",
|
|
124
|
+
"web/docs/*.md",
|
|
125
|
+
"skills/catalog/README.md",
|
|
126
|
+
"skills/catalog/*/skill.yaml",
|
|
127
|
+
"skills/catalog/*/prompt.md",
|
|
128
|
+
]
|
|
129
|
+
|
|
130
|
+
[tool.pytest.ini_options]
|
|
131
|
+
testpaths = ["tests"]
|
|
132
|
+
pythonpath = ["src"]
|
|
133
|
+
markers = [
|
|
134
|
+
"network: test che richiedono accesso rete (skip in CI con -m 'not network')",
|
|
135
|
+
]
|
|
136
|
+
|
|
137
|
+
[tool.coverage.run]
|
|
138
|
+
source = ["geo_optimizer"]
|
|
139
|
+
|
|
140
|
+
[tool.coverage.report]
|
|
141
|
+
show_missing = true
|
|
142
|
+
skip_empty = true
|
|
143
|
+
exclude_lines = [
|
|
144
|
+
"pragma: no cover",
|
|
145
|
+
"if __name__ == .__main__.",
|
|
146
|
+
"if TYPE_CHECKING:",
|
|
147
|
+
]
|
|
148
|
+
|
|
149
|
+
[tool.ruff]
|
|
150
|
+
line-length = 120
|
|
151
|
+
target-version = "py39"
|
|
152
|
+
|
|
153
|
+
[tool.ruff.lint]
|
|
154
|
+
select = ["E", "F", "W", "I", "UP", "B", "C4", "SIM"]
|
|
155
|
+
ignore = [
|
|
156
|
+
"E501", # Linee troppo lunghe (gestito con line-length)
|
|
157
|
+
"SIM108", # Operatore ternario (peggiora leggibilità in alcuni casi)
|
|
158
|
+
"SIM105", # contextlib.suppress (più verboso del try-except-pass)
|
|
159
|
+
"SIM114", # Combina if-branch (peggiora leggibilità del CLI output)
|
|
160
|
+
"SIM110", # Comprensione any() per for-return (non sempre più leggibile)
|
|
161
|
+
]
|
|
162
|
+
|
|
163
|
+
[tool.ruff.lint.per-file-ignores]
|
|
164
|
+
"tests/test_integration.py" = ["E402"]
|
|
165
|
+
"src/geo_optimizer/cli/geosition_cmd.py" = ["UP006", "UP035", "UP045"]
|
|
166
|
+
|
|
167
|
+
[tool.mypy]
|
|
168
|
+
python_version = "3.9"
|
|
169
|
+
warn_return_any = true
|
|
170
|
+
warn_unused_configs = true
|
|
171
|
+
ignore_missing_imports = true
|
|
172
|
+
# Gradual adoption: strict on new modules, lenient on legacy
|
|
173
|
+
exclude = [
|
|
174
|
+
"tests/",
|
|
175
|
+
"build/",
|
|
176
|
+
"dist/",
|
|
177
|
+
]
|
|
178
|
+
|
|
179
|
+
[[tool.mypy.overrides]]
|
|
180
|
+
module = [
|
|
181
|
+
"geo_optimizer.web.app",
|
|
182
|
+
"geo_optimizer.mcp.*",
|
|
183
|
+
"geo_optimizer.i18n.*",
|
|
184
|
+
"geo_optimizer.core.fixer",
|
|
185
|
+
"geo_optimizer.core.schema_injector",
|
|
186
|
+
"geo_optimizer.core.audit_cdn",
|
|
187
|
+
"geo_optimizer.core.llms_generator",
|
|
188
|
+
"geo_optimizer.utils.http",
|
|
189
|
+
"geo_optimizer.utils.http_async",
|
|
190
|
+
"geo_optimizer.models.project_config",
|
|
191
|
+
"geo_optimizer.skills.loader",
|
|
192
|
+
"mcp.*",
|
|
193
|
+
]
|
|
194
|
+
ignore_errors = true
|
|
195
|
+
|
|
196
|
+
[[tool.mypy.overrides]]
|
|
197
|
+
module = "mcp.*"
|
|
198
|
+
follow_imports = "skip"
|