geo-visibility-cli 0.2.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.
Files changed (27) hide show
  1. geo_visibility_cli-0.2.1/LICENSE +21 -0
  2. geo_visibility_cli-0.2.1/PKG-INFO +218 -0
  3. geo_visibility_cli-0.2.1/README.md +189 -0
  4. geo_visibility_cli-0.2.1/pyproject.toml +59 -0
  5. geo_visibility_cli-0.2.1/setup.cfg +4 -0
  6. geo_visibility_cli-0.2.1/src/geo_check/__init__.py +3 -0
  7. geo_visibility_cli-0.2.1/src/geo_check/analysis.py +358 -0
  8. geo_visibility_cli-0.2.1/src/geo_check/cli.py +180 -0
  9. geo_visibility_cli-0.2.1/src/geo_check/dryrun.py +38 -0
  10. geo_visibility_cli-0.2.1/src/geo_check/history.py +156 -0
  11. geo_visibility_cli-0.2.1/src/geo_check/html_report.py +177 -0
  12. geo_visibility_cli-0.2.1/src/geo_check/perplexity.py +84 -0
  13. geo_visibility_cli-0.2.1/src/geo_check/questions.py +54 -0
  14. geo_visibility_cli-0.2.1/src/geo_check/report.py +356 -0
  15. geo_visibility_cli-0.2.1/src/geo_check/robots.py +139 -0
  16. geo_visibility_cli-0.2.1/src/geo_visibility_cli.egg-info/PKG-INFO +218 -0
  17. geo_visibility_cli-0.2.1/src/geo_visibility_cli.egg-info/SOURCES.txt +25 -0
  18. geo_visibility_cli-0.2.1/src/geo_visibility_cli.egg-info/dependency_links.txt +1 -0
  19. geo_visibility_cli-0.2.1/src/geo_visibility_cli.egg-info/entry_points.txt +2 -0
  20. geo_visibility_cli-0.2.1/src/geo_visibility_cli.egg-info/requires.txt +3 -0
  21. geo_visibility_cli-0.2.1/src/geo_visibility_cli.egg-info/top_level.txt +1 -0
  22. geo_visibility_cli-0.2.1/tests/test_cli_and_client.py +153 -0
  23. geo_visibility_cli-0.2.1/tests/test_competitors.py +126 -0
  24. geo_visibility_cli-0.2.1/tests/test_history_html_action.py +282 -0
  25. geo_visibility_cli-0.2.1/tests/test_questions_analysis.py +47 -0
  26. geo_visibility_cli-0.2.1/tests/test_report_and_site.py +214 -0
  27. geo_visibility_cli-0.2.1/tests/test_robots.py +61 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Douglas Gouvea Manoel
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
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,218 @@
1
+ Metadata-Version: 2.4
2
+ Name: geo-visibility-cli
3
+ Version: 0.2.1
4
+ Summary: Check how AI answer engines mention your brand (GEO visibility) and whether your site allows AI crawlers.
5
+ Author: Douglas Gouvea
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/DouglasGouvea/geo-visibility-cli
8
+ Project-URL: Repository, https://github.com/DouglasGouvea/geo-visibility-cli
9
+ Project-URL: Issues, https://github.com/DouglasGouvea/geo-visibility-cli/issues
10
+ Project-URL: Changelog, https://github.com/DouglasGouvea/geo-visibility-cli/blob/main/CHANGELOG.md
11
+ Keywords: geo,generative-engine-optimization,ai-visibility,ai-search,perplexity,robots.txt,ai-crawlers,local-seo,cli
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3 :: Only
18
+ Classifier: Programming Language :: Python :: 3.10
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Topic :: Internet
22
+ Classifier: Topic :: Internet :: WWW/HTTP
23
+ Requires-Python: >=3.10
24
+ Description-Content-Type: text/markdown
25
+ License-File: LICENSE
26
+ Provides-Extra: test
27
+ Requires-Dist: pytest; extra == "test"
28
+ Dynamic: license-file
29
+
30
+ # geo-visibility-cli
31
+
32
+ [![CI](https://github.com/DouglasGouvea/geo-visibility-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/DouglasGouvea/geo-visibility-cli/actions/workflows/ci.yml)
33
+ [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
34
+ [![PyPI](https://img.shields.io/pypi/v/geo-visibility-cli.svg)](https://pypi.org/project/geo-visibility-cli/)
35
+
36
+ Check how AI answer engines mention your local business, and whether your site lets AI crawlers in.
37
+
38
+ `geo-check` asks buyer-style questions ("What is the best dentist in Campinas?") through the Perplexity API, several times each, then reports:
39
+
40
+ - how often your brand is mentioned (mention rate),
41
+ - which domains are cited most,
42
+ - candidate competitor names (**heuristic**, always review manually),
43
+ - plain-language takeaways,
44
+ - optionally, which AI crawlers your `robots.txt` allows or blocks (GPTBot, OAI-SearchBot, ChatGPT-User, PerplexityBot, Perplexity-User, ClaudeBot, Claude-Web, anthropic-ai, Google-Extended, CCBot, Bytespider, Applebot-Extended).
45
+
46
+ Only Perplexity is queried in this version. Results vary between runs; treat them as a sample, not a ranking.
47
+
48
+ ## Install
49
+
50
+ From PyPI (once published):
51
+
52
+ ```bash
53
+ pip install geo-visibility-cli
54
+ ```
55
+
56
+ From source:
57
+
58
+ ```bash
59
+ python3 -m venv .venv
60
+ .venv/bin/pip install -e . pytest
61
+ ```
62
+
63
+ Requires Python >= 3.10, no runtime dependencies.
64
+
65
+ ## Usage
66
+
67
+ ```bash
68
+ export PERPLEXITY_API_KEY="..." # from your Perplexity account; never commit it
69
+ geo-check "dentist" "Campinas" --brand "Clinica Exemplo" --site https://example.com --lang en
70
+ ```
71
+
72
+ | Option | Default | Description |
73
+ |---|---|---|
74
+ | `category`, `city` | required | What you sell and where |
75
+ | `--brand` | required | Brand name (case/accent-insensitive match) |
76
+ | `--site URL` | none | Also check `robots.txt` for AI crawlers |
77
+ | `--lang pt\|en` | auto-detect from the category | Language of questions and report |
78
+ | `--runs N` | `3` | Times each question is asked |
79
+ | `--out DIR` | `./reports` | Where the report files go |
80
+ | `--format md\|html\|json` | `md` | `md`: Markdown + JSON files, report printed to stdout. `html`: single self-contained `.html` (inline CSS, no JavaScript) + JSON, paths printed. `json`: only the `.json` file, also printed to stdout |
81
+ | `--history-dir DIR` | none | Append each run to `DIR` and add a "Changes since last check" section |
82
+ | `--dry-run` | off | Deterministic simulation, no network, no API key |
83
+ | `--version` | | Print the version and exit |
84
+
85
+ The Markdown report is printed to stdout and the JSON path is printed at the end.
86
+
87
+ ### History and changes
88
+
89
+ With `--history-dir geo-history`, every run writes a timestamped JSON record (brand, category, city, timestamp, mention rate, cited domains, competitors) to that folder. When an earlier run exists for the same brand/category/city, the report gets a **Changes since last check** section: mention-rate change in points, new/lost cited domains, new/lost competitor candidates. The HTML report also draws a bar chart of the mention rate over time. Works with `--dry-run` too.
90
+
91
+ ```bash
92
+ geo-check "dentist" "Campinas" --brand "Clinica Exemplo" --history-dir geo-history --format html
93
+ ```
94
+
95
+ Try it without a key:
96
+
97
+ ```bash
98
+ geo-check "dentista" "Campinas" --brand "Clinica Exemplo" --dry-run
99
+ ```
100
+
101
+ ## Real example output
102
+
103
+ _Real run, November 2026._ Query: category `dentista`, city `Campinas`, brand `OdontoCompany`.
104
+
105
+ | Metric | Result |
106
+ |---|---|
107
+ | Answers collected | 15 |
108
+ | Mention rate | **0%** (0/15) |
109
+
110
+ Top cited domains:
111
+
112
+ | Domain | Citations |
113
+ |---|---|
114
+ | doctoralia.com.br | 96 |
115
+ | dentmap.com.br | 12 |
116
+ | acheioprofissional.com.br | 9 |
117
+
118
+ AI-recommended competitors (candidates, heuristic): Dra. Júlia Jacob, Dr. Sérgio Moura Guimarães, Dr. Guilherme Garcia.
119
+
120
+ Takeaway (as printed by the report, in Portuguese):
121
+
122
+ > **Invisível para a IA.** Nenhuma das 15 respostas citou OdontoCompany. Hoje, quem pergunta à IA por dentista em Campinas não é direcionado a você.
123
+
124
+ In short: the brand never appeared, and the AI answers lean heavily on one directory (doctoralia.com.br). A complete profile with recent reviews there is the first thing to fix.
125
+
126
+ > Competitor names come from a heuristic over the answer text. They can include false positives and miss real competitors; check them by hand before acting on them.
127
+
128
+ ## GitHub Action
129
+
130
+ Run it on a schedule and keep the report as a build artifact:
131
+
132
+ ```yaml
133
+ name: Weekly GEO check
134
+
135
+ on:
136
+ schedule:
137
+ - cron: "0 9 * * 1" # every Monday, 09:00 UTC
138
+ workflow_dispatch:
139
+
140
+ jobs:
141
+ geo-check:
142
+ runs-on: ubuntu-latest
143
+ steps:
144
+ - uses: DouglasGouvea/geo-visibility-cli@main
145
+ with:
146
+ category: dentist
147
+ city: Campinas
148
+ brand: Clinica Exemplo
149
+ site: https://example.com
150
+ dry-run: "false"
151
+ env:
152
+ PERPLEXITY_API_KEY: ${{ secrets.PERPLEXITY_API_KEY }}
153
+ - uses: actions/upload-artifact@v4
154
+ with:
155
+ name: geo-report
156
+ path: reports/
157
+ ```
158
+
159
+ Store the key as a repository secret (`PERPLEXITY_API_KEY`); it is read from the environment only. The action writes the report files to `./reports`, which the last step uploads.
160
+
161
+ | Input | Default | Description |
162
+ |---|---|---|
163
+ | `category`, `city`, `brand` | required | Same as the CLI |
164
+ | `site` | none | Check `robots.txt` for AI crawlers |
165
+ | `lang` | auto-detect | `pt` or `en` |
166
+ | `runs` | `3` | Runs per question |
167
+ | `history-dir` | none | Enables history and the "changes since last check" section |
168
+ | `format` | `md` | `md`, `html` or `json` |
169
+ | `dry-run` | `false` | Simulate without network or API key |
170
+
171
+ [`examples/weekly.yml`](examples/weekly.yml) is a ready-to-copy workflow: weekly cron plus manual trigger, `history-dir: geo-history`, `format: html`, and a final step that commits `geo-history/` and the latest report back to the repository (only when something changed). It needs `permissions: contents: write`.
172
+
173
+ ## Tests
174
+
175
+ ```bash
176
+ .venv/bin/python3 -m pytest -q
177
+ ```
178
+
179
+ No test touches the network.
180
+
181
+ ## Em português
182
+
183
+ `geo-check` mostra se a sua empresa aparece quando alguém pergunta a uma IA (hoje, a Perplexity) por um serviço na sua cidade, por exemplo "Qual o melhor dentista em Campinas?". Ele repete cada pergunta várias vezes e entrega:
184
+
185
+ - a **taxa de menção** da sua marca,
186
+ - os **domínios mais citados** pela IA (onde vale ter perfil e avaliações),
187
+ - **possíveis concorrentes** (heurística: confira manualmente),
188
+ - um resumo em linguagem simples do que isso significa,
189
+ - com `--site`, quais robôs de IA o seu `robots.txt` permite ou bloqueia.
190
+
191
+ Como usar:
192
+
193
+ ```bash
194
+ pip install geo-visibility-cli # ou: pip install -e . dentro do repositório
195
+ export PERPLEXITY_API_KEY="..." # sua chave da Perplexity; nunca versione
196
+ geo-check "dentista" "Campinas" --brand "Clinica Exemplo" --site https://exemplo.com.br
197
+ ```
198
+
199
+ - `--lang pt|en`: idioma das perguntas e do relatório (padrão: detectado pela categoria).
200
+ - `--runs N`: quantas vezes cada pergunta é feita (padrão 3).
201
+ - `--out DIR`: pasta dos arquivos do relatório (padrão `./reports`).
202
+ - `--format md|html|json`: formato do relatório (padrão `md`). `html` gera um único arquivo autônomo (CSS embutido, sem JavaScript); `json` grava só o `.json`.
203
+ - `--history-dir DIR`: guarda cada execução em `DIR` e acrescenta ao relatório a seção "Mudanças desde a última checagem" (variação da taxa de menção em pontos, domínios e concorrentes novos/perdidos) quando já existe uma execução anterior da mesma marca/categoria/cidade. No HTML, aparece também um gráfico de barras da taxa de menção ao longo do tempo. Funciona com `--dry-run`.
204
+ - `--dry-run`: simula tudo, sem rede e sem chave. Bom para testar.
205
+ - O relatório em Markdown vai para a saída padrão.
206
+ - GitHub Action: além de `category`, `city`, `brand`, `site` e `dry-run`, aceita `lang`, `runs`, `history-dir` e `format`. O exemplo [`examples/weekly.yml`](examples/weekly.yml) roda toda semana e grava o histórico (`geo-history/`) e o último relatório de volta no repositório.
207
+ - Só a Perplexity é consultada nesta versão. Os resultados variam entre execuções: é uma amostra, não um ranking.
208
+
209
+ Exemplo real (novembro de 2026): dentista em Campinas, marca OdontoCompany, 15 respostas, 0% de menção; a IA cita sobretudo doctoralia.com.br (96 citações). Veja a seção "Real example output".
210
+
211
+ ## Full audit / Auditoria completa
212
+
213
+ - Full audit (ChatGPT, Gemini, Perplexity): https://www.fiverr.com/dougmanoel/audit-how-chatgpt-gemini-and-perplexity-mention-your-business
214
+ - Free checker: https://geo-visibility-check.vercel.app
215
+
216
+ ## License
217
+
218
+ MIT, see [LICENSE](LICENSE).
@@ -0,0 +1,189 @@
1
+ # geo-visibility-cli
2
+
3
+ [![CI](https://github.com/DouglasGouvea/geo-visibility-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/DouglasGouvea/geo-visibility-cli/actions/workflows/ci.yml)
4
+ [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
5
+ [![PyPI](https://img.shields.io/pypi/v/geo-visibility-cli.svg)](https://pypi.org/project/geo-visibility-cli/)
6
+
7
+ Check how AI answer engines mention your local business, and whether your site lets AI crawlers in.
8
+
9
+ `geo-check` asks buyer-style questions ("What is the best dentist in Campinas?") through the Perplexity API, several times each, then reports:
10
+
11
+ - how often your brand is mentioned (mention rate),
12
+ - which domains are cited most,
13
+ - candidate competitor names (**heuristic**, always review manually),
14
+ - plain-language takeaways,
15
+ - optionally, which AI crawlers your `robots.txt` allows or blocks (GPTBot, OAI-SearchBot, ChatGPT-User, PerplexityBot, Perplexity-User, ClaudeBot, Claude-Web, anthropic-ai, Google-Extended, CCBot, Bytespider, Applebot-Extended).
16
+
17
+ Only Perplexity is queried in this version. Results vary between runs; treat them as a sample, not a ranking.
18
+
19
+ ## Install
20
+
21
+ From PyPI (once published):
22
+
23
+ ```bash
24
+ pip install geo-visibility-cli
25
+ ```
26
+
27
+ From source:
28
+
29
+ ```bash
30
+ python3 -m venv .venv
31
+ .venv/bin/pip install -e . pytest
32
+ ```
33
+
34
+ Requires Python >= 3.10, no runtime dependencies.
35
+
36
+ ## Usage
37
+
38
+ ```bash
39
+ export PERPLEXITY_API_KEY="..." # from your Perplexity account; never commit it
40
+ geo-check "dentist" "Campinas" --brand "Clinica Exemplo" --site https://example.com --lang en
41
+ ```
42
+
43
+ | Option | Default | Description |
44
+ |---|---|---|
45
+ | `category`, `city` | required | What you sell and where |
46
+ | `--brand` | required | Brand name (case/accent-insensitive match) |
47
+ | `--site URL` | none | Also check `robots.txt` for AI crawlers |
48
+ | `--lang pt\|en` | auto-detect from the category | Language of questions and report |
49
+ | `--runs N` | `3` | Times each question is asked |
50
+ | `--out DIR` | `./reports` | Where the report files go |
51
+ | `--format md\|html\|json` | `md` | `md`: Markdown + JSON files, report printed to stdout. `html`: single self-contained `.html` (inline CSS, no JavaScript) + JSON, paths printed. `json`: only the `.json` file, also printed to stdout |
52
+ | `--history-dir DIR` | none | Append each run to `DIR` and add a "Changes since last check" section |
53
+ | `--dry-run` | off | Deterministic simulation, no network, no API key |
54
+ | `--version` | | Print the version and exit |
55
+
56
+ The Markdown report is printed to stdout and the JSON path is printed at the end.
57
+
58
+ ### History and changes
59
+
60
+ With `--history-dir geo-history`, every run writes a timestamped JSON record (brand, category, city, timestamp, mention rate, cited domains, competitors) to that folder. When an earlier run exists for the same brand/category/city, the report gets a **Changes since last check** section: mention-rate change in points, new/lost cited domains, new/lost competitor candidates. The HTML report also draws a bar chart of the mention rate over time. Works with `--dry-run` too.
61
+
62
+ ```bash
63
+ geo-check "dentist" "Campinas" --brand "Clinica Exemplo" --history-dir geo-history --format html
64
+ ```
65
+
66
+ Try it without a key:
67
+
68
+ ```bash
69
+ geo-check "dentista" "Campinas" --brand "Clinica Exemplo" --dry-run
70
+ ```
71
+
72
+ ## Real example output
73
+
74
+ _Real run, November 2026._ Query: category `dentista`, city `Campinas`, brand `OdontoCompany`.
75
+
76
+ | Metric | Result |
77
+ |---|---|
78
+ | Answers collected | 15 |
79
+ | Mention rate | **0%** (0/15) |
80
+
81
+ Top cited domains:
82
+
83
+ | Domain | Citations |
84
+ |---|---|
85
+ | doctoralia.com.br | 96 |
86
+ | dentmap.com.br | 12 |
87
+ | acheioprofissional.com.br | 9 |
88
+
89
+ AI-recommended competitors (candidates, heuristic): Dra. Júlia Jacob, Dr. Sérgio Moura Guimarães, Dr. Guilherme Garcia.
90
+
91
+ Takeaway (as printed by the report, in Portuguese):
92
+
93
+ > **Invisível para a IA.** Nenhuma das 15 respostas citou OdontoCompany. Hoje, quem pergunta à IA por dentista em Campinas não é direcionado a você.
94
+
95
+ In short: the brand never appeared, and the AI answers lean heavily on one directory (doctoralia.com.br). A complete profile with recent reviews there is the first thing to fix.
96
+
97
+ > Competitor names come from a heuristic over the answer text. They can include false positives and miss real competitors; check them by hand before acting on them.
98
+
99
+ ## GitHub Action
100
+
101
+ Run it on a schedule and keep the report as a build artifact:
102
+
103
+ ```yaml
104
+ name: Weekly GEO check
105
+
106
+ on:
107
+ schedule:
108
+ - cron: "0 9 * * 1" # every Monday, 09:00 UTC
109
+ workflow_dispatch:
110
+
111
+ jobs:
112
+ geo-check:
113
+ runs-on: ubuntu-latest
114
+ steps:
115
+ - uses: DouglasGouvea/geo-visibility-cli@main
116
+ with:
117
+ category: dentist
118
+ city: Campinas
119
+ brand: Clinica Exemplo
120
+ site: https://example.com
121
+ dry-run: "false"
122
+ env:
123
+ PERPLEXITY_API_KEY: ${{ secrets.PERPLEXITY_API_KEY }}
124
+ - uses: actions/upload-artifact@v4
125
+ with:
126
+ name: geo-report
127
+ path: reports/
128
+ ```
129
+
130
+ Store the key as a repository secret (`PERPLEXITY_API_KEY`); it is read from the environment only. The action writes the report files to `./reports`, which the last step uploads.
131
+
132
+ | Input | Default | Description |
133
+ |---|---|---|
134
+ | `category`, `city`, `brand` | required | Same as the CLI |
135
+ | `site` | none | Check `robots.txt` for AI crawlers |
136
+ | `lang` | auto-detect | `pt` or `en` |
137
+ | `runs` | `3` | Runs per question |
138
+ | `history-dir` | none | Enables history and the "changes since last check" section |
139
+ | `format` | `md` | `md`, `html` or `json` |
140
+ | `dry-run` | `false` | Simulate without network or API key |
141
+
142
+ [`examples/weekly.yml`](examples/weekly.yml) is a ready-to-copy workflow: weekly cron plus manual trigger, `history-dir: geo-history`, `format: html`, and a final step that commits `geo-history/` and the latest report back to the repository (only when something changed). It needs `permissions: contents: write`.
143
+
144
+ ## Tests
145
+
146
+ ```bash
147
+ .venv/bin/python3 -m pytest -q
148
+ ```
149
+
150
+ No test touches the network.
151
+
152
+ ## Em português
153
+
154
+ `geo-check` mostra se a sua empresa aparece quando alguém pergunta a uma IA (hoje, a Perplexity) por um serviço na sua cidade, por exemplo "Qual o melhor dentista em Campinas?". Ele repete cada pergunta várias vezes e entrega:
155
+
156
+ - a **taxa de menção** da sua marca,
157
+ - os **domínios mais citados** pela IA (onde vale ter perfil e avaliações),
158
+ - **possíveis concorrentes** (heurística: confira manualmente),
159
+ - um resumo em linguagem simples do que isso significa,
160
+ - com `--site`, quais robôs de IA o seu `robots.txt` permite ou bloqueia.
161
+
162
+ Como usar:
163
+
164
+ ```bash
165
+ pip install geo-visibility-cli # ou: pip install -e . dentro do repositório
166
+ export PERPLEXITY_API_KEY="..." # sua chave da Perplexity; nunca versione
167
+ geo-check "dentista" "Campinas" --brand "Clinica Exemplo" --site https://exemplo.com.br
168
+ ```
169
+
170
+ - `--lang pt|en`: idioma das perguntas e do relatório (padrão: detectado pela categoria).
171
+ - `--runs N`: quantas vezes cada pergunta é feita (padrão 3).
172
+ - `--out DIR`: pasta dos arquivos do relatório (padrão `./reports`).
173
+ - `--format md|html|json`: formato do relatório (padrão `md`). `html` gera um único arquivo autônomo (CSS embutido, sem JavaScript); `json` grava só o `.json`.
174
+ - `--history-dir DIR`: guarda cada execução em `DIR` e acrescenta ao relatório a seção "Mudanças desde a última checagem" (variação da taxa de menção em pontos, domínios e concorrentes novos/perdidos) quando já existe uma execução anterior da mesma marca/categoria/cidade. No HTML, aparece também um gráfico de barras da taxa de menção ao longo do tempo. Funciona com `--dry-run`.
175
+ - `--dry-run`: simula tudo, sem rede e sem chave. Bom para testar.
176
+ - O relatório em Markdown vai para a saída padrão.
177
+ - GitHub Action: além de `category`, `city`, `brand`, `site` e `dry-run`, aceita `lang`, `runs`, `history-dir` e `format`. O exemplo [`examples/weekly.yml`](examples/weekly.yml) roda toda semana e grava o histórico (`geo-history/`) e o último relatório de volta no repositório.
178
+ - Só a Perplexity é consultada nesta versão. Os resultados variam entre execuções: é uma amostra, não um ranking.
179
+
180
+ Exemplo real (novembro de 2026): dentista em Campinas, marca OdontoCompany, 15 respostas, 0% de menção; a IA cita sobretudo doctoralia.com.br (96 citações). Veja a seção "Real example output".
181
+
182
+ ## Full audit / Auditoria completa
183
+
184
+ - Full audit (ChatGPT, Gemini, Perplexity): https://www.fiverr.com/dougmanoel/audit-how-chatgpt-gemini-and-perplexity-mention-your-business
185
+ - Free checker: https://geo-visibility-check.vercel.app
186
+
187
+ ## License
188
+
189
+ MIT, see [LICENSE](LICENSE).
@@ -0,0 +1,59 @@
1
+ [build-system]
2
+ requires = ["setuptools>=77"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "geo-visibility-cli"
7
+ dynamic = ["version"] # single source: geo_check.__version__
8
+ description = "Check how AI answer engines mention your brand (GEO visibility) and whether your site allows AI crawlers."
9
+ readme = { file = "README.md", content-type = "text/markdown" }
10
+ requires-python = ">=3.10"
11
+ license = "MIT"
12
+ license-files = ["LICENSE"]
13
+ authors = [{ name = "Douglas Gouvea" }]
14
+ keywords = [
15
+ "geo",
16
+ "generative-engine-optimization",
17
+ "ai-visibility",
18
+ "ai-search",
19
+ "perplexity",
20
+ "robots.txt",
21
+ "ai-crawlers",
22
+ "local-seo",
23
+ "cli",
24
+ ]
25
+ classifiers = [
26
+ "Development Status :: 4 - Beta",
27
+ "Environment :: Console",
28
+ "Intended Audience :: Developers",
29
+ "Operating System :: OS Independent",
30
+ "Programming Language :: Python :: 3",
31
+ "Programming Language :: Python :: 3 :: Only",
32
+ "Programming Language :: Python :: 3.10",
33
+ "Programming Language :: Python :: 3.11",
34
+ "Programming Language :: Python :: 3.12",
35
+ "Topic :: Internet",
36
+ "Topic :: Internet :: WWW/HTTP",
37
+ ]
38
+ dependencies = []
39
+
40
+ [project.urls]
41
+ Homepage = "https://github.com/DouglasGouvea/geo-visibility-cli"
42
+ Repository = "https://github.com/DouglasGouvea/geo-visibility-cli"
43
+ Issues = "https://github.com/DouglasGouvea/geo-visibility-cli/issues"
44
+ Changelog = "https://github.com/DouglasGouvea/geo-visibility-cli/blob/main/CHANGELOG.md"
45
+
46
+ [project.optional-dependencies]
47
+ test = ["pytest"]
48
+
49
+ [project.scripts]
50
+ geo-check = "geo_check.cli:main"
51
+
52
+ [tool.setuptools.dynamic]
53
+ version = { attr = "geo_check.__version__" }
54
+
55
+ [tool.setuptools.packages.find]
56
+ where = ["src"]
57
+
58
+ [tool.pytest.ini_options]
59
+ testpaths = ["tests"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,3 @@
1
+ """geo-check: measure brand visibility in AI answer engines."""
2
+
3
+ __version__ = "0.2.1"