$npx -y skills add Pupok462/open-geo --skill open-geoRun a list of queries through a chosen AI engine, measure the target domain's visibility/citation in the AI answers, and produce a dashboard or PDF report. Use when the user runs /open-geo or asks to measure a brand's GEO / AI-search visibility (citations in Google AI Overview, e
| 1 | # open-geo — GEO visibility run orchestrator |
| 2 | |
| 3 | You are the orchestrator for one **open-geo run**: drive a list of queries through one |
| 4 | AI engine, capture how the target domain shows up in the answers, ingest the captures |
| 5 | through the validated pipeline, aggregate metrics, and emit a dashboard and/or a PDF |
| 6 | report — finishing with a short summary. |
| 7 | |
| 8 | This skill is the **single operator entry point**. It coordinates components that are |
| 9 | specified in `pipeline/INTERFACES.md` (the authoritative contract). Read that file's |
| 10 | **§1 (capture contract)** and **§3 (CLI contracts)** before acting if anything below is |
| 11 | ambiguous — the shapes there win over this prose. |
| 12 | |
| 13 | > Conventions (from `CLAUDE.md`): code/identifiers and intermediate JSON are English. |
| 14 | > The **final summary printed to the user follows `--lang`** (default English). Work only |
| 15 | > inside the **repository root** (the directory of this repo / your current working |
| 16 | > directory). Run all Python with the project venv (`.venv/bin/python`) so `pipeline.*` |
| 17 | > imports resolve, with the **repo root as the working directory** (paths like `data/aeo.db` |
| 18 | > are repo-root-relative). |
| 19 | |
| 20 | --- |
| 21 | |
| 22 | ## INVOCATION |
| 23 | |
| 24 | ``` |
| 25 | /open-geo <questions.csv> <engine> <domain> --brand "<name>" --n-worker <N> \ |
| 26 | [--output dashboard|pdf|both] [--period today|all] [--lang en|ru|zh|ar] |
| 27 | ``` |
| 28 | |
| 29 | ### Positional arguments |
| 30 | |
| 31 | | arg | meaning | |
| 32 | |---|---| |
| 33 | | `<questions.csv>` | Path to the input CSV. Columns: **`query,lens`** where `lens ∈ general \| branded \| comparative`. See `examples/questions.csv` for a ready sample. `general` = neutral query, no brand named; `branded` = brand explicitly named; `comparative` = brand vs alternatives. Either a **hand-made** CSV or one **generated by STEP A.5** (question harvesting, Feature 1 — `harvest/METHODOLOGY.md`); both are first-class. | |
| 34 | | `<engine>` | Engine id, **snake_case**, e.g. `google`. This value is (a) the `engine` field written into every `QueryCapture` and the run, and (b) the basename of the capture playbook the workers load: `engines/<engine>.md` (so `google` ↔ `engines/google.md`). **This is the multi-engine extension point** — `google` (Google AI Overview), `chatgpt_search` (ChatGPT web search), `claude_search` (Claude web search), `yandex_neuro` (Yandex Alice / Нейро) and `gemini` (Google Gemini) ship today; the others (Perplexity, DeepSeek, …) are on the roadmap (ROADMAP Feature 3), and adding one is mainly authoring `engines/<engine>.md` (see `engines/README.md`). | |
| 35 | | `<domain>` | The **target** — a registrable domain (`example.com`) or a URL prefix (`github.com/user/repo`). Accept any spelling; normalized via `pipeline.schema.normalize_target`. Workers match links against the target via `matches_target`/`target_ranks` (same semantics pipeline-wide). | |
| 36 | |
| 37 | ### Flags |
| 38 | |
| 39 | | flag | required | default | meaning | |
| 40 | |---|---|---|---| |
| 41 | | `--brand "<name>"` | yes | — | Human brand name (free text, may contain spaces — keep it quoted). Stored on the run; used in report/dashboard titles and the summary. | |
| 42 | | `--n-worker <N>` | yes | — | Number of capture sub-agents to run **in parallel** — the run's concurrency. Step 2 splits the queries into N chunks, one per worker. | |
| 43 | | `--output dashboard\|pdf\|both` | no | `dashboard` | Which deliverable(s) to produce in step 6. | |
| 44 | | `--period today\|all` | no | `all` | Reporting window passed to the dashboard/report: `today` = just this run's date, `all` = full history for this brand+engine (adds the PDF trend chart / the dashboard's whole-period view). Previous-run deltas (INTERFACES §4.1) render whenever an earlier completed run exists — in the PDF for either period, and in the dashboard's latest-run view. | |
| 45 | | `--lang en\|ru\|zh\|ar` | no | `en` | UI language for the deliverables: it is passed to the report (`report.generate --lang`) and is the dashboard's **default** language (the switcher can still change it in the browser). Extensible to any code registered in `i18n/local |