rankrush-cli 0.1.37__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.
- rankrush_cli-0.1.37/LICENSE +21 -0
- rankrush_cli-0.1.37/PKG-INFO +301 -0
- rankrush_cli-0.1.37/README.md +263 -0
- rankrush_cli-0.1.37/pyproject.toml +79 -0
- rankrush_cli-0.1.37/rankrush/__init__.py +3 -0
- rankrush_cli-0.1.37/rankrush/cache.py +83 -0
- rankrush_cli-0.1.37/rankrush/cli.py +241 -0
- rankrush_cli-0.1.37/rankrush/client.py +227 -0
- rankrush_cli-0.1.37/rankrush/commands/__init__.py +0 -0
- rankrush_cli-0.1.37/rankrush/commands/audit.py +307 -0
- rankrush_cli-0.1.37/rankrush/commands/blog.py +175 -0
- rankrush_cli-0.1.37/rankrush/commands/buzz/__init__.py +0 -0
- rankrush_cli-0.1.37/rankrush/commands/buzz/drafts.py +84 -0
- rankrush_cli-0.1.37/rankrush/commands/buzz/posts.py +97 -0
- rankrush_cli-0.1.37/rankrush/commands/buzz/research.py +108 -0
- rankrush_cli-0.1.37/rankrush/commands/buzz/strategy.py +47 -0
- rankrush_cli-0.1.37/rankrush/commands/cms.py +80 -0
- rankrush_cli-0.1.37/rankrush/commands/init.py +223 -0
- rankrush_cli-0.1.37/rankrush/commands/keywords.py +91 -0
- rankrush_cli-0.1.37/rankrush/commands/leadgen.py +125 -0
- rankrush_cli-0.1.37/rankrush/commands/leads.py +253 -0
- rankrush_cli-0.1.37/rankrush/commands/nodes.py +227 -0
- rankrush_cli-0.1.37/rankrush/commands/profiles.py +64 -0
- rankrush_cli-0.1.37/rankrush/commands/report.py +279 -0
- rankrush_cli-0.1.37/rankrush/commands/scans.py +88 -0
- rankrush_cli-0.1.37/rankrush/commands/smoke.py +147 -0
- rankrush_cli-0.1.37/rankrush/commands/visibility.py +354 -0
- rankrush_cli-0.1.37/rankrush/config.py +44 -0
- rankrush_cli-0.1.37/rankrush/edge.py +299 -0
- rankrush_cli-0.1.37/rankrush/env_file.py +140 -0
- rankrush_cli-0.1.37/rankrush/errors.py +119 -0
- rankrush_cli-0.1.37/rankrush/first_run.py +117 -0
- rankrush_cli-0.1.37/rankrush/leadgen/__init__.py +39 -0
- rankrush_cli-0.1.37/rankrush/leadgen/dedupe.py +135 -0
- rankrush_cli-0.1.37/rankrush/leadgen/footprints.py +156 -0
- rankrush_cli-0.1.37/rankrush/leadgen/pipeline.py +191 -0
- rankrush_cli-0.1.37/rankrush/leadgen/sampler.py +161 -0
- rankrush_cli-0.1.37/rankrush/leadgen/store.py +101 -0
- rankrush_cli-0.1.37/rankrush/leadgen/wat_parser.py +180 -0
- rankrush_cli-0.1.37/rankrush/mcp_server.py +363 -0
- rankrush_cli-0.1.37/rankrush/options.py +40 -0
- rankrush_cli-0.1.37/rankrush/output.py +56 -0
- rankrush_cli-0.1.37/rankrush_cli.egg-info/PKG-INFO +301 -0
- rankrush_cli-0.1.37/rankrush_cli.egg-info/SOURCES.txt +149 -0
- rankrush_cli-0.1.37/rankrush_cli.egg-info/dependency_links.txt +1 -0
- rankrush_cli-0.1.37/rankrush_cli.egg-info/entry_points.txt +3 -0
- rankrush_cli-0.1.37/rankrush_cli.egg-info/requires.txt +18 -0
- rankrush_cli-0.1.37/rankrush_cli.egg-info/top_level.txt +2 -0
- rankrush_cli-0.1.37/rankrush_client/__init__.py +232 -0
- rankrush_cli-0.1.37/rankrush_client/api/__init__.py +11 -0
- rankrush_cli-0.1.37/rankrush_client/api/admin_api.py +1181 -0
- rankrush_cli-0.1.37/rankrush_client/api/audit_api.py +1178 -0
- rankrush_cli-0.1.37/rankrush_client/api/blog_api.py +1467 -0
- rankrush_cli-0.1.37/rankrush_client/api/buzz_api.py +2322 -0
- rankrush_cli-0.1.37/rankrush_client/api/jwt_only_api.py +2021 -0
- rankrush_cli-0.1.37/rankrush_client/api/profiles_api.py +600 -0
- rankrush_cli-0.1.37/rankrush_client/api/visibility_api.py +898 -0
- rankrush_cli-0.1.37/rankrush_client/api_client.py +804 -0
- rankrush_cli-0.1.37/rankrush_client/api_response.py +21 -0
- rankrush_cli-0.1.37/rankrush_client/configuration.py +640 -0
- rankrush_cli-0.1.37/rankrush_client/exceptions.py +218 -0
- rankrush_cli-0.1.37/rankrush_client/models/__init__.py +102 -0
- rankrush_cli-0.1.37/rankrush_client/models/audit_enqueue_request.py +104 -0
- rankrush_cli-0.1.37/rankrush_client/models/audit_enqueue_response.py +112 -0
- rankrush_cli-0.1.37/rankrush_client/models/audit_run.py +142 -0
- rankrush_cli-0.1.37/rankrush_client/models/audit_run_get_request.py +91 -0
- rankrush_cli-0.1.37/rankrush_client/models/audit_run_get_response.py +104 -0
- rankrush_cli-0.1.37/rankrush_client/models/blog_topic.py +108 -0
- rankrush_cli-0.1.37/rankrush_client/models/blog_topics_list_request.py +92 -0
- rankrush_cli-0.1.37/rankrush_client/models/blog_topics_list_response.py +101 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_brand_research_response.py +100 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_brand_research_response_research_summary.py +106 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_brand_research_response_research_summary_sentiment_breakdown.py +92 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_brand_research_response_research_summary_top_subreddits_inner.py +90 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_draft_approve_request.py +92 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_engagement.py +135 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_engagements_list_request.py +98 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_engagements_list_response.py +100 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_extract_profile_response.py +94 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_extract_profile_response_extracted.py +98 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_generate_drafts_request.py +102 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_generate_drafts_response.py +114 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_mention.py +134 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_opportunity_search_response.py +96 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_profile_get_response.py +104 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_research_list_request.py +94 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_research_list_response.py +101 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_visibility_score_response.py +125 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_visibility_score_response_engagement_metrics.py +96 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_visibility_score_response_top_subreddits_inner.py +94 -0
- rankrush_cli-0.1.37/rankrush_client/models/buzz_wait_request.py +90 -0
- rankrush_cli-0.1.37/rankrush_client/models/cap_error.py +108 -0
- rankrush_cli-0.1.37/rankrush_client/models/check_ai_visibility_request.py +112 -0
- rankrush_cli-0.1.37/rankrush_client/models/check_ai_visibility_response.py +114 -0
- rankrush_cli-0.1.37/rankrush_client/models/check_ai_visibility_response_dropped_inner.py +92 -0
- rankrush_cli-0.1.37/rankrush_client/models/create_lead_account_request.py +105 -0
- rankrush_cli-0.1.37/rankrush_client/models/create_lead_account_response.py +109 -0
- rankrush_cli-0.1.37/rankrush_client/models/create_lead_account_response_scan.py +99 -0
- rankrush_cli-0.1.37/rankrush_client/models/delete_audit_run_request.py +88 -0
- rankrush_cli-0.1.37/rankrush_client/models/delete_audit_run_response.py +101 -0
- rankrush_cli-0.1.37/rankrush_client/models/delete_audit_run_response_deleted.py +92 -0
- rankrush_cli-0.1.37/rankrush_client/models/error.py +102 -0
- rankrush_cli-0.1.37/rankrush_client/models/extract_offerings_request.py +90 -0
- rankrush_cli-0.1.37/rankrush_client/models/extract_offerings_response.py +108 -0
- rankrush_cli-0.1.37/rankrush_client/models/generate_blog_post_request.py +93 -0
- rankrush_cli-0.1.37/rankrush_client/models/generate_blog_post_response.py +98 -0
- rankrush_cli-0.1.37/rankrush_client/models/generate_blog_topics_request.py +93 -0
- rankrush_cli-0.1.37/rankrush_client/models/generate_content_strategy_response.py +97 -0
- rankrush_cli-0.1.37/rankrush_client/models/generate_node_content_request.py +133 -0
- rankrush_cli-0.1.37/rankrush_client/models/generate_node_content_response.py +101 -0
- rankrush_cli-0.1.37/rankrush_client/models/generate_node_content_response_content.py +143 -0
- rankrush_cli-0.1.37/rankrush_client/models/generate_visibility_keywords_response.py +115 -0
- rankrush_cli-0.1.37/rankrush_client/models/generate_visibility_keywords_response_keywords_inner.py +100 -0
- rankrush_cli-0.1.37/rankrush_client/models/generate_visibility_keywords_response_sources.py +90 -0
- rankrush_cli-0.1.37/rankrush_client/models/gsc_fetch_queries_response.py +105 -0
- rankrush_cli-0.1.37/rankrush_client/models/gsc_fetch_queries_response_queries_inner.py +96 -0
- rankrush_cli-0.1.37/rankrush_client/models/gsc_select_property_request.py +90 -0
- rankrush_cli-0.1.37/rankrush_client/models/job_queued_response.py +109 -0
- rankrush_cli-0.1.37/rankrush_client/models/keywords_list_request.py +92 -0
- rankrush_cli-0.1.37/rankrush_client/models/keywords_list_response.py +93 -0
- rankrush_cli-0.1.37/rankrush_client/models/lead_enqueue_request.py +98 -0
- rankrush_cli-0.1.37/rankrush_client/models/lead_enqueue_response.py +114 -0
- rankrush_cli-0.1.37/rankrush_client/models/lead_enqueue_result.py +103 -0
- rankrush_cli-0.1.37/rankrush_client/models/lead_item.py +110 -0
- rankrush_cli-0.1.37/rankrush_client/models/node_complete_request.py +92 -0
- rankrush_cli-0.1.37/rankrush_client/models/node_complete_response.py +108 -0
- rankrush_cli-0.1.37/rankrush_client/models/node_progress.py +115 -0
- rankrush_cli-0.1.37/rankrush_client/models/node_progress_summary.py +97 -0
- rankrush_cli-0.1.37/rankrush_client/models/nodes_list_request.py +104 -0
- rankrush_cli-0.1.37/rankrush_client/models/nodes_list_response.py +101 -0
- rankrush_cli-0.1.37/rankrush_client/models/ok_response.py +95 -0
- rankrush_cli-0.1.37/rankrush_client/models/profile.py +122 -0
- rankrush_cli-0.1.37/rankrush_client/models/profile_id_camel_request.py +88 -0
- rankrush_cli-0.1.37/rankrush_client/models/profile_id_snake_request.py +88 -0
- rankrush_cli-0.1.37/rankrush_client/models/profile_update_request.py +104 -0
- rankrush_cli-0.1.37/rankrush_client/models/profiles_list_request.py +89 -0
- rankrush_cli-0.1.37/rankrush_client/models/rate_limit_error.py +112 -0
- rankrush_cli-0.1.37/rankrush_client/models/report_job_get_request.py +89 -0
- rankrush_cli-0.1.37/rankrush_client/models/report_job_get_response.py +142 -0
- rankrush_cli-0.1.37/rankrush_client/models/save_cms_connection_request.py +96 -0
- rankrush_cli-0.1.37/rankrush_client/models/save_cms_connection_response.py +99 -0
- rankrush_cli-0.1.37/rankrush_client/models/suggest_competitors_request.py +118 -0
- rankrush_cli-0.1.37/rankrush_client/models/suggest_competitors_response.py +107 -0
- rankrush_cli-0.1.37/rankrush_client/models/suggest_competitors_response_category.py +96 -0
- rankrush_cli-0.1.37/rankrush_client/models/suggest_competitors_response_competitors_inner.py +102 -0
- rankrush_cli-0.1.37/rankrush_client/models/validation_error_body.py +102 -0
- rankrush_cli-0.1.37/rankrush_client/models/verify_blog_posts_request.py +90 -0
- rankrush_cli-0.1.37/rankrush_client/models/verify_blog_posts_response.py +98 -0
- rankrush_cli-0.1.37/rankrush_client/py.typed +0 -0
- rankrush_cli-0.1.37/rankrush_client/rest.py +263 -0
- rankrush_cli-0.1.37/setup.cfg +4 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Gabriel Gircenko
|
|
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
|
|
13
|
+
all 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
|
|
21
|
+
THE SOFTWARE.
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: rankrush-cli
|
|
3
|
+
Version: 0.1.37
|
|
4
|
+
Summary: Agent-native CLI wrapper for the RankRush platform — wraps Supabase Edge Functions and REST API into structured, scriptable commands with --json output.
|
|
5
|
+
Author-email: Gabriel Gircenko <gabriel.gircenko@gmail.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://rankrush.ai
|
|
8
|
+
Project-URL: Repository, https://github.com/nikolapevic/rankrush
|
|
9
|
+
Keywords: rankrush,seo,aeo,ai-visibility,cli,agent
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Environment :: Console
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Operating System :: OS Independent
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Requires-Python: >=3.10
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
License-File: LICENSE
|
|
21
|
+
Requires-Dist: click>=8.1
|
|
22
|
+
Requires-Dist: requests>=2.31
|
|
23
|
+
Requires-Dist: python-dotenv>=1.0
|
|
24
|
+
Requires-Dist: urllib3<3,>=2.1
|
|
25
|
+
Requires-Dist: python-dateutil>=2.8.2
|
|
26
|
+
Requires-Dist: pydantic>=2.11
|
|
27
|
+
Requires-Dist: typing-extensions>=4.7.1
|
|
28
|
+
Requires-Dist: certifi>=2024.2.2
|
|
29
|
+
Provides-Extra: mcp
|
|
30
|
+
Requires-Dist: mcp>=1.2; extra == "mcp"
|
|
31
|
+
Provides-Extra: dev
|
|
32
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
33
|
+
Requires-Dist: pytest-mock>=3.12; extra == "dev"
|
|
34
|
+
Requires-Dist: build>=1.0; extra == "dev"
|
|
35
|
+
Requires-Dist: coverage>=7.4; extra == "dev"
|
|
36
|
+
Requires-Dist: mcp>=1.2; extra == "dev"
|
|
37
|
+
Dynamic: license-file
|
|
38
|
+
|
|
39
|
+
# rankrush-cli
|
|
40
|
+
|
|
41
|
+
[](https://github.com/nikolapevic/rankrush/actions/workflows/cli-test-matrix.yml)
|
|
42
|
+

|
|
43
|
+
[](LICENSE)
|
|
44
|
+
|
|
45
|
+
Agent-native command-line interface for [RankRush](https://rankrush.ai) — the AI visibility and on-site SEO platform. The CLI wraps RankRush's edge functions and REST API into structured, scriptable commands with `--json` output, so humans on a terminal and agents like Claude Code can interact with the platform without a browser.
|
|
46
|
+
|
|
47
|
+
Inspired by [CLI-Anything](https://github.com/HKUDS/CLI-Anything): *"Today's Software Serves Humans. Tomorrow's Users will be Agents."*
|
|
48
|
+
|
|
49
|
+
- **Homepage:** <https://rankrush.ai>
|
|
50
|
+
- **Source:** <https://github.com/nikolapevic/rankrush>
|
|
51
|
+
- **Issues:** <https://github.com/nikolapevic/rankrush/issues>
|
|
52
|
+
- **License:** MIT (see [LICENSE](LICENSE))
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Install
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
pip install rankrush-cli
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Requires Python 3.10, 3.11, or 3.12.
|
|
63
|
+
|
|
64
|
+
**Developing locally** (clone the repo first):
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
git clone https://github.com/nikolapevic/rankrush.git
|
|
68
|
+
cd rankrush/cli
|
|
69
|
+
python3 -m venv .venv
|
|
70
|
+
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
71
|
+
pip install -e .
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Verify the install:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
rankrush --version
|
|
78
|
+
rankrush --help
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
`rankrush init` writes `~/.config/rankrush/.env` (or `./.env` with
|
|
82
|
+
`--target cwd`) with `0600` permissions. Re-run any time to update the key.
|
|
83
|
+
|
|
84
|
+
> **Working in the repo?** Developers can also place values in
|
|
85
|
+
> `cli/.env` for repo-local overrides. Shell exports → `cli/.env` →
|
|
86
|
+
> `~/.config/rankrush/.env` is the resolution order, first wins.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Authenticate
|
|
91
|
+
|
|
92
|
+
1. Sign in at <https://rankrush.ai> and open **Settings → API Keys**.
|
|
93
|
+
2. Click **Generate key**. Your key looks like `rr_live_<random>`. Copy it.
|
|
94
|
+
3. Run the setup wizard:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
rankrush init
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
The wizard prompts for `RANKRUSH_API_KEY`, writes it to `~/.config/rankrush/.env` (mode `0600`), and validates the key against the live backend. Re-run any time to update the key.
|
|
101
|
+
|
|
102
|
+
Resolution order for the API key (first match wins):
|
|
103
|
+
|
|
104
|
+
1. Shell environment (`export RANKRUSH_API_KEY=...`).
|
|
105
|
+
2. `./.env` in the current working directory (use `rankrush init --target cwd` to scaffold it).
|
|
106
|
+
3. `~/.config/rankrush/.env` (default `rankrush init` target).
|
|
107
|
+
|
|
108
|
+
To override without an interactive prompt:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
rankrush init --api-key rr_live_xxx --skip-validate # offline machines
|
|
112
|
+
rankrush init --force # overwrite without confirmation
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Testing against stage
|
|
116
|
+
|
|
117
|
+
`--stage` points any command at the stage environment (`app.stage.rankrush.ai`)
|
|
118
|
+
instead of production — the stage URL and publishable key are bundled, so you
|
|
119
|
+
only need a stage API key. Configure it once, then prefix commands with
|
|
120
|
+
`--stage`:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
rankrush init --stage # paste a stage key (from app.stage.rankrush.ai → Settings → API Keys)
|
|
124
|
+
rankrush --stage smoke
|
|
125
|
+
rankrush --stage audit run --profile-id <stage-profile-id>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
The stage key is stored as `RANKRUSH_STAGE_API_KEY` (separate from your prod
|
|
129
|
+
`RANKRUSH_API_KEY`, same env file), so prod and stage never collide. Power users
|
|
130
|
+
can also point at any backend with `RANKRUSH_SUPABASE_URL` +
|
|
131
|
+
`SUPABASE_PUBLISHABLE_KEY`.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Your first 5 minutes
|
|
136
|
+
|
|
137
|
+
After `rankrush init` succeeds, run these three commands in order:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
# 1. Confirm the live backend accepts your key and the four edge functions are healthy.
|
|
141
|
+
rankrush smoke
|
|
142
|
+
|
|
143
|
+
# 2. List the business profiles in your account. Copy a profile UUID for the next step.
|
|
144
|
+
rankrush profiles list
|
|
145
|
+
|
|
146
|
+
# 3. Run a full AI visibility check — keywords, ChatGPT/Claude/Perplexity/Gemini scores, citations.
|
|
147
|
+
rankrush visibility check --profile-id <profile-id>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
If `rankrush smoke` reports a 401, your key is wrong or missing — re-run `rankrush init`. If it reports a network error, you're offline or behind a proxy.
|
|
151
|
+
|
|
152
|
+
Every command supports `--json` for machine-readable output.
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Command reference
|
|
157
|
+
|
|
158
|
+
| Command | Description |
|
|
159
|
+
|---|---|
|
|
160
|
+
| `rankrush init` | Interactive setup wizard. Writes API key to `~/.config/rankrush/.env`, validates against the backend. Flags: `--target user\|cwd`, `--api-key`, `--publishable-key`, `--skip-validate`, `--force`, `--stage` (configure the stage key). |
|
|
161
|
+
| _global_ `--stage` | Prefix any command to target stage (`app.stage.rankrush.ai`): `rankrush --stage smoke`. Uses `RANKRUSH_STAGE_API_KEY`. |
|
|
162
|
+
| `rankrush smoke` | Health-check the critical edge functions. Exits 0 if all pass, 1 otherwise. |
|
|
163
|
+
| `rankrush profiles list` | List all business profiles belonging to your API key. |
|
|
164
|
+
| `rankrush keywords generate` | Generate AEO keywords via the LLM and replace the profile's tracked set in `aeo_keywords`. Flags: `--profile-id`, `--json`. |
|
|
165
|
+
| `rankrush keywords list` | Show the currently tracked AEO keywords for a profile. Flags: `--profile-id`, `--json`. |
|
|
166
|
+
| `rankrush visibility check` | Run a full AI visibility analysis for a profile (ChatGPT, Claude, Perplexity, Gemini). |
|
|
167
|
+
| `rankrush visibility delta` | Compare the two most recent cached visibility snapshots for a profile. |
|
|
168
|
+
| `rankrush audit run` | Trigger a full bulk on-site website audit (legacy v1, synchronous). Flags: `--url` (required), `--profile-id`, `--industry b2b_saas\|local_service\|ecommerce`, `--language`, `--force-refresh`, `--json`. |
|
|
169
|
+
| `rankrush audit start` | Enqueue a v2 audit (writes to `audit_runs`/`node_progress`, visible in the web app). Flags: `--profile-id`, `--node-id` (single-node mode), `--wait`, `--poll-interval`, `--timeout`, `--json`. |
|
|
170
|
+
| `rankrush audit status` | Show the current status of a v2 audit run. Arg: `<run-id>`. Flags: `--json`. |
|
|
171
|
+
| `rankrush audit get` | Fetch the full `audit_runs` row plus an aggregated per-node summary. Arg: `<run-id>`. Flags: `--json`. |
|
|
172
|
+
| `rankrush audit delete` | Permanently delete an audit run and its node rows (admin-only). Arg: `<run-id>`. Flags: `--json`. |
|
|
173
|
+
| `rankrush nodes list` | List `node_progress` rows for a profile. Flags: `--profile-id`, `--status`, `--json`. |
|
|
174
|
+
| `rankrush nodes suggestions` | Surface `recommended_fixes` for nodes that still need work, each stamped with a stable `suggestion_id`. Flags: `--profile-id`, `--include-resolved`, `--json`. |
|
|
175
|
+
| `rankrush nodes complete` | Mark a node `status='complete'` (notify back from the vault). Arg: `<node-id>`. Flags: `--profile-id`, `--json`. |
|
|
176
|
+
| `rankrush leadgen harvest` | Mine Common Crawl WAT shards into the `cc_citation_leads` lead store. Flags: `--crawl`, `--shards`, `--seed`, `--workers`, `--dry-run`, `--out`, `--json`. |
|
|
177
|
+
| `rankrush buzz research refresh` | Pull new Reddit/Quora mentions for a profile. |
|
|
178
|
+
| `rankrush buzz research highlights` | List high-relevance unseen research mentions, best-first. |
|
|
179
|
+
| `rankrush buzz strategy suggest` | Generate a Reddit posting strategy from the profile's research. |
|
|
180
|
+
| `rankrush buzz drafts list` | List Buzz posts filtered by status (`draft`/`approved`/`scheduled`/`posted`/`failed`). |
|
|
181
|
+
| `rankrush buzz drafts approve` | Approve a draft post, optionally scheduling it. |
|
|
182
|
+
| `rankrush buzz posts performance` | Show published posts within a time window. |
|
|
183
|
+
| `rankrush report daily` | Composite daily digest: visibility delta + research highlights + draft count. |
|
|
184
|
+
| `rankrush report weekly` | 7-day visibility trend + post performance + AEO gap analysis. |
|
|
185
|
+
| `rankrush report aeo-gaps` | List AI platforms where visibility score is below a threshold. |
|
|
186
|
+
| `rankrush blog topics generate` | Generate blog topics for a profile over an N-day window (`--days`, default 30, clamped 1–180). |
|
|
187
|
+
| `rankrush blog topics list` | List tracked blog topics (title / generation stage / scheduled-for) for a profile. |
|
|
188
|
+
| `rankrush blog post generate` | Draft a full blog post from a topic (`--topic-id`). Requires a CMS connection; subject to a tier daily cap. |
|
|
189
|
+
| `rankrush blog strategy` | Generate an overall content strategy for a profile. |
|
|
190
|
+
| `rankrush cms connect` | Verify and store CMS (WordPress app-password) credentials for a profile. Username + app password are collected via **hidden prompts**, never flags. |
|
|
191
|
+
| `rankrush scans enqueue` | Enqueue a background scan (`ai_visibility`/`web_audit`/`node_check`) for a profile. Optional `--url` override and `--priority`. |
|
|
192
|
+
| `rankrush leads create` | **Admin-only.** Create a RankRush account for a sales lead, run a first-impression scan, and return a set-password invite link. |
|
|
193
|
+
| `rankrush repl` | Start an interactive REPL — run commands without the `rankrush` prefix. |
|
|
194
|
+
|
|
195
|
+
Every command accepts `--help` and (where applicable) `--json`. The top-level `--debug` flag re-raises the underlying exception with a full traceback instead of the friendly one-line message.
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## Common workflows
|
|
200
|
+
|
|
201
|
+
### Daily check
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
rankrush visibility check --profile-id <id> # caches snapshot in ~/.rankrush/cache/
|
|
205
|
+
rankrush buzz research refresh --profile-id <id>
|
|
206
|
+
rankrush report daily --profile-id <id> --json
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
`report daily` reads from the local cache; run `visibility check` and `research refresh` first.
|
|
210
|
+
|
|
211
|
+
### Compare two visibility snapshots
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
# Day 1
|
|
215
|
+
rankrush visibility check --profile-id <id>
|
|
216
|
+
|
|
217
|
+
# Day 2
|
|
218
|
+
rankrush visibility check --profile-id <id>
|
|
219
|
+
rankrush visibility delta --profile-id <id> --threshold 5
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
`delta` flags drops greater than the threshold (default 5 points).
|
|
223
|
+
|
|
224
|
+
### Approve a Buzz draft and schedule it
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
rankrush buzz drafts list --profile-id <id>
|
|
228
|
+
rankrush buzz drafts approve --id <draft-uuid> --schedule-at 2026-05-15T09:00:00Z
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Create a lead account (admin)
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
rankrush leads create \
|
|
235
|
+
--business-name "Acme Co" \
|
|
236
|
+
--website-url https://acme.example \
|
|
237
|
+
--industry b2b_saas \
|
|
238
|
+
--location Berlin # optional; used for local_service relevance
|
|
239
|
+
# (you are prompted for the lead's email so it never lands in shell history)
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Requires an **admin** `rr_live_*` api key — the backend verifies the caller's
|
|
243
|
+
role. The command returns an invite (set-password) link to share with the lead
|
|
244
|
+
plus a summary of the first-impression ChatGPT visibility scan. A 401/403
|
|
245
|
+
means the key is not an admin key.
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## Troubleshooting
|
|
250
|
+
|
|
251
|
+
### `Authentication failed` / HTTP 401
|
|
252
|
+
|
|
253
|
+
Your `RANKRUSH_API_KEY` is missing or invalid. Re-run:
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
rankrush init
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
The wizard validates the key against the backend before saving.
|
|
260
|
+
|
|
261
|
+
### Network errors / timeouts
|
|
262
|
+
|
|
263
|
+
Check your internet connection. The CLI talks to RankRush's Supabase backend over HTTPS — corporate proxies, VPNs with HTTPS inspection, and offline machines will all break it.
|
|
264
|
+
|
|
265
|
+
### `Command failed with cryptic error`
|
|
266
|
+
|
|
267
|
+
Add `--debug` before the command to see the full traceback:
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
rankrush --debug visibility check --profile-id <id>
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
Open an issue with that output at <https://github.com/nikolapevic/rankrush/issues>.
|
|
274
|
+
|
|
275
|
+
### Want to verify your install end-to-end
|
|
276
|
+
|
|
277
|
+
```bash
|
|
278
|
+
rankrush --version # → rankrush, version 0.1.15
|
|
279
|
+
rankrush smoke # → all edge functions green
|
|
280
|
+
rankrush profiles list # → at least one profile
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
If all three pass, you're set up correctly.
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## Use it from an AI client (MCP)
|
|
288
|
+
|
|
289
|
+
`pip install "rankrush-cli[mcp]"` also installs **`rankrush-mcp`**, a Model Context Protocol server that exposes these commands as tools so Claude Desktop / Claude Code / Cursor can drive RankRush directly. Setup + tool list: [docs/mcp.md](docs/mcp.md).
|
|
290
|
+
|
|
291
|
+
## Versioning & changelog
|
|
292
|
+
|
|
293
|
+
`rankrush-cli` follows [Semantic Versioning](https://semver.org/). Every release is recorded in [CHANGELOG.md](CHANGELOG.md); the versioning policy and release-cut checklist live in [docs/versioning.md](docs/versioning.md).
|
|
294
|
+
|
|
295
|
+
## Contributing
|
|
296
|
+
|
|
297
|
+
PRs and issues welcome — see [CONTRIBUTING.md](CONTRIBUTING.md) for local setup, test commands, and the PR checklist.
|
|
298
|
+
|
|
299
|
+
## License
|
|
300
|
+
|
|
301
|
+
MIT. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
# rankrush-cli
|
|
2
|
+
|
|
3
|
+
[](https://github.com/nikolapevic/rankrush/actions/workflows/cli-test-matrix.yml)
|
|
4
|
+

|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
7
|
+
Agent-native command-line interface for [RankRush](https://rankrush.ai) — the AI visibility and on-site SEO platform. The CLI wraps RankRush's edge functions and REST API into structured, scriptable commands with `--json` output, so humans on a terminal and agents like Claude Code can interact with the platform without a browser.
|
|
8
|
+
|
|
9
|
+
Inspired by [CLI-Anything](https://github.com/HKUDS/CLI-Anything): *"Today's Software Serves Humans. Tomorrow's Users will be Agents."*
|
|
10
|
+
|
|
11
|
+
- **Homepage:** <https://rankrush.ai>
|
|
12
|
+
- **Source:** <https://github.com/nikolapevic/rankrush>
|
|
13
|
+
- **Issues:** <https://github.com/nikolapevic/rankrush/issues>
|
|
14
|
+
- **License:** MIT (see [LICENSE](LICENSE))
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Install
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
pip install rankrush-cli
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Requires Python 3.10, 3.11, or 3.12.
|
|
25
|
+
|
|
26
|
+
**Developing locally** (clone the repo first):
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
git clone https://github.com/nikolapevic/rankrush.git
|
|
30
|
+
cd rankrush/cli
|
|
31
|
+
python3 -m venv .venv
|
|
32
|
+
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
33
|
+
pip install -e .
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Verify the install:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
rankrush --version
|
|
40
|
+
rankrush --help
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`rankrush init` writes `~/.config/rankrush/.env` (or `./.env` with
|
|
44
|
+
`--target cwd`) with `0600` permissions. Re-run any time to update the key.
|
|
45
|
+
|
|
46
|
+
> **Working in the repo?** Developers can also place values in
|
|
47
|
+
> `cli/.env` for repo-local overrides. Shell exports → `cli/.env` →
|
|
48
|
+
> `~/.config/rankrush/.env` is the resolution order, first wins.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Authenticate
|
|
53
|
+
|
|
54
|
+
1. Sign in at <https://rankrush.ai> and open **Settings → API Keys**.
|
|
55
|
+
2. Click **Generate key**. Your key looks like `rr_live_<random>`. Copy it.
|
|
56
|
+
3. Run the setup wizard:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
rankrush init
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
The wizard prompts for `RANKRUSH_API_KEY`, writes it to `~/.config/rankrush/.env` (mode `0600`), and validates the key against the live backend. Re-run any time to update the key.
|
|
63
|
+
|
|
64
|
+
Resolution order for the API key (first match wins):
|
|
65
|
+
|
|
66
|
+
1. Shell environment (`export RANKRUSH_API_KEY=...`).
|
|
67
|
+
2. `./.env` in the current working directory (use `rankrush init --target cwd` to scaffold it).
|
|
68
|
+
3. `~/.config/rankrush/.env` (default `rankrush init` target).
|
|
69
|
+
|
|
70
|
+
To override without an interactive prompt:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
rankrush init --api-key rr_live_xxx --skip-validate # offline machines
|
|
74
|
+
rankrush init --force # overwrite without confirmation
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Testing against stage
|
|
78
|
+
|
|
79
|
+
`--stage` points any command at the stage environment (`app.stage.rankrush.ai`)
|
|
80
|
+
instead of production — the stage URL and publishable key are bundled, so you
|
|
81
|
+
only need a stage API key. Configure it once, then prefix commands with
|
|
82
|
+
`--stage`:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
rankrush init --stage # paste a stage key (from app.stage.rankrush.ai → Settings → API Keys)
|
|
86
|
+
rankrush --stage smoke
|
|
87
|
+
rankrush --stage audit run --profile-id <stage-profile-id>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
The stage key is stored as `RANKRUSH_STAGE_API_KEY` (separate from your prod
|
|
91
|
+
`RANKRUSH_API_KEY`, same env file), so prod and stage never collide. Power users
|
|
92
|
+
can also point at any backend with `RANKRUSH_SUPABASE_URL` +
|
|
93
|
+
`SUPABASE_PUBLISHABLE_KEY`.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Your first 5 minutes
|
|
98
|
+
|
|
99
|
+
After `rankrush init` succeeds, run these three commands in order:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
# 1. Confirm the live backend accepts your key and the four edge functions are healthy.
|
|
103
|
+
rankrush smoke
|
|
104
|
+
|
|
105
|
+
# 2. List the business profiles in your account. Copy a profile UUID for the next step.
|
|
106
|
+
rankrush profiles list
|
|
107
|
+
|
|
108
|
+
# 3. Run a full AI visibility check — keywords, ChatGPT/Claude/Perplexity/Gemini scores, citations.
|
|
109
|
+
rankrush visibility check --profile-id <profile-id>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
If `rankrush smoke` reports a 401, your key is wrong or missing — re-run `rankrush init`. If it reports a network error, you're offline or behind a proxy.
|
|
113
|
+
|
|
114
|
+
Every command supports `--json` for machine-readable output.
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Command reference
|
|
119
|
+
|
|
120
|
+
| Command | Description |
|
|
121
|
+
|---|---|
|
|
122
|
+
| `rankrush init` | Interactive setup wizard. Writes API key to `~/.config/rankrush/.env`, validates against the backend. Flags: `--target user\|cwd`, `--api-key`, `--publishable-key`, `--skip-validate`, `--force`, `--stage` (configure the stage key). |
|
|
123
|
+
| _global_ `--stage` | Prefix any command to target stage (`app.stage.rankrush.ai`): `rankrush --stage smoke`. Uses `RANKRUSH_STAGE_API_KEY`. |
|
|
124
|
+
| `rankrush smoke` | Health-check the critical edge functions. Exits 0 if all pass, 1 otherwise. |
|
|
125
|
+
| `rankrush profiles list` | List all business profiles belonging to your API key. |
|
|
126
|
+
| `rankrush keywords generate` | Generate AEO keywords via the LLM and replace the profile's tracked set in `aeo_keywords`. Flags: `--profile-id`, `--json`. |
|
|
127
|
+
| `rankrush keywords list` | Show the currently tracked AEO keywords for a profile. Flags: `--profile-id`, `--json`. |
|
|
128
|
+
| `rankrush visibility check` | Run a full AI visibility analysis for a profile (ChatGPT, Claude, Perplexity, Gemini). |
|
|
129
|
+
| `rankrush visibility delta` | Compare the two most recent cached visibility snapshots for a profile. |
|
|
130
|
+
| `rankrush audit run` | Trigger a full bulk on-site website audit (legacy v1, synchronous). Flags: `--url` (required), `--profile-id`, `--industry b2b_saas\|local_service\|ecommerce`, `--language`, `--force-refresh`, `--json`. |
|
|
131
|
+
| `rankrush audit start` | Enqueue a v2 audit (writes to `audit_runs`/`node_progress`, visible in the web app). Flags: `--profile-id`, `--node-id` (single-node mode), `--wait`, `--poll-interval`, `--timeout`, `--json`. |
|
|
132
|
+
| `rankrush audit status` | Show the current status of a v2 audit run. Arg: `<run-id>`. Flags: `--json`. |
|
|
133
|
+
| `rankrush audit get` | Fetch the full `audit_runs` row plus an aggregated per-node summary. Arg: `<run-id>`. Flags: `--json`. |
|
|
134
|
+
| `rankrush audit delete` | Permanently delete an audit run and its node rows (admin-only). Arg: `<run-id>`. Flags: `--json`. |
|
|
135
|
+
| `rankrush nodes list` | List `node_progress` rows for a profile. Flags: `--profile-id`, `--status`, `--json`. |
|
|
136
|
+
| `rankrush nodes suggestions` | Surface `recommended_fixes` for nodes that still need work, each stamped with a stable `suggestion_id`. Flags: `--profile-id`, `--include-resolved`, `--json`. |
|
|
137
|
+
| `rankrush nodes complete` | Mark a node `status='complete'` (notify back from the vault). Arg: `<node-id>`. Flags: `--profile-id`, `--json`. |
|
|
138
|
+
| `rankrush leadgen harvest` | Mine Common Crawl WAT shards into the `cc_citation_leads` lead store. Flags: `--crawl`, `--shards`, `--seed`, `--workers`, `--dry-run`, `--out`, `--json`. |
|
|
139
|
+
| `rankrush buzz research refresh` | Pull new Reddit/Quora mentions for a profile. |
|
|
140
|
+
| `rankrush buzz research highlights` | List high-relevance unseen research mentions, best-first. |
|
|
141
|
+
| `rankrush buzz strategy suggest` | Generate a Reddit posting strategy from the profile's research. |
|
|
142
|
+
| `rankrush buzz drafts list` | List Buzz posts filtered by status (`draft`/`approved`/`scheduled`/`posted`/`failed`). |
|
|
143
|
+
| `rankrush buzz drafts approve` | Approve a draft post, optionally scheduling it. |
|
|
144
|
+
| `rankrush buzz posts performance` | Show published posts within a time window. |
|
|
145
|
+
| `rankrush report daily` | Composite daily digest: visibility delta + research highlights + draft count. |
|
|
146
|
+
| `rankrush report weekly` | 7-day visibility trend + post performance + AEO gap analysis. |
|
|
147
|
+
| `rankrush report aeo-gaps` | List AI platforms where visibility score is below a threshold. |
|
|
148
|
+
| `rankrush blog topics generate` | Generate blog topics for a profile over an N-day window (`--days`, default 30, clamped 1–180). |
|
|
149
|
+
| `rankrush blog topics list` | List tracked blog topics (title / generation stage / scheduled-for) for a profile. |
|
|
150
|
+
| `rankrush blog post generate` | Draft a full blog post from a topic (`--topic-id`). Requires a CMS connection; subject to a tier daily cap. |
|
|
151
|
+
| `rankrush blog strategy` | Generate an overall content strategy for a profile. |
|
|
152
|
+
| `rankrush cms connect` | Verify and store CMS (WordPress app-password) credentials for a profile. Username + app password are collected via **hidden prompts**, never flags. |
|
|
153
|
+
| `rankrush scans enqueue` | Enqueue a background scan (`ai_visibility`/`web_audit`/`node_check`) for a profile. Optional `--url` override and `--priority`. |
|
|
154
|
+
| `rankrush leads create` | **Admin-only.** Create a RankRush account for a sales lead, run a first-impression scan, and return a set-password invite link. |
|
|
155
|
+
| `rankrush repl` | Start an interactive REPL — run commands without the `rankrush` prefix. |
|
|
156
|
+
|
|
157
|
+
Every command accepts `--help` and (where applicable) `--json`. The top-level `--debug` flag re-raises the underlying exception with a full traceback instead of the friendly one-line message.
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Common workflows
|
|
162
|
+
|
|
163
|
+
### Daily check
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
rankrush visibility check --profile-id <id> # caches snapshot in ~/.rankrush/cache/
|
|
167
|
+
rankrush buzz research refresh --profile-id <id>
|
|
168
|
+
rankrush report daily --profile-id <id> --json
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
`report daily` reads from the local cache; run `visibility check` and `research refresh` first.
|
|
172
|
+
|
|
173
|
+
### Compare two visibility snapshots
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
# Day 1
|
|
177
|
+
rankrush visibility check --profile-id <id>
|
|
178
|
+
|
|
179
|
+
# Day 2
|
|
180
|
+
rankrush visibility check --profile-id <id>
|
|
181
|
+
rankrush visibility delta --profile-id <id> --threshold 5
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
`delta` flags drops greater than the threshold (default 5 points).
|
|
185
|
+
|
|
186
|
+
### Approve a Buzz draft and schedule it
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
rankrush buzz drafts list --profile-id <id>
|
|
190
|
+
rankrush buzz drafts approve --id <draft-uuid> --schedule-at 2026-05-15T09:00:00Z
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Create a lead account (admin)
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
rankrush leads create \
|
|
197
|
+
--business-name "Acme Co" \
|
|
198
|
+
--website-url https://acme.example \
|
|
199
|
+
--industry b2b_saas \
|
|
200
|
+
--location Berlin # optional; used for local_service relevance
|
|
201
|
+
# (you are prompted for the lead's email so it never lands in shell history)
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Requires an **admin** `rr_live_*` api key — the backend verifies the caller's
|
|
205
|
+
role. The command returns an invite (set-password) link to share with the lead
|
|
206
|
+
plus a summary of the first-impression ChatGPT visibility scan. A 401/403
|
|
207
|
+
means the key is not an admin key.
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## Troubleshooting
|
|
212
|
+
|
|
213
|
+
### `Authentication failed` / HTTP 401
|
|
214
|
+
|
|
215
|
+
Your `RANKRUSH_API_KEY` is missing or invalid. Re-run:
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
rankrush init
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
The wizard validates the key against the backend before saving.
|
|
222
|
+
|
|
223
|
+
### Network errors / timeouts
|
|
224
|
+
|
|
225
|
+
Check your internet connection. The CLI talks to RankRush's Supabase backend over HTTPS — corporate proxies, VPNs with HTTPS inspection, and offline machines will all break it.
|
|
226
|
+
|
|
227
|
+
### `Command failed with cryptic error`
|
|
228
|
+
|
|
229
|
+
Add `--debug` before the command to see the full traceback:
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
rankrush --debug visibility check --profile-id <id>
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
Open an issue with that output at <https://github.com/nikolapevic/rankrush/issues>.
|
|
236
|
+
|
|
237
|
+
### Want to verify your install end-to-end
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
rankrush --version # → rankrush, version 0.1.15
|
|
241
|
+
rankrush smoke # → all edge functions green
|
|
242
|
+
rankrush profiles list # → at least one profile
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
If all three pass, you're set up correctly.
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## Use it from an AI client (MCP)
|
|
250
|
+
|
|
251
|
+
`pip install "rankrush-cli[mcp]"` also installs **`rankrush-mcp`**, a Model Context Protocol server that exposes these commands as tools so Claude Desktop / Claude Code / Cursor can drive RankRush directly. Setup + tool list: [docs/mcp.md](docs/mcp.md).
|
|
252
|
+
|
|
253
|
+
## Versioning & changelog
|
|
254
|
+
|
|
255
|
+
`rankrush-cli` follows [Semantic Versioning](https://semver.org/). Every release is recorded in [CHANGELOG.md](CHANGELOG.md); the versioning policy and release-cut checklist live in [docs/versioning.md](docs/versioning.md).
|
|
256
|
+
|
|
257
|
+
## Contributing
|
|
258
|
+
|
|
259
|
+
PRs and issues welcome — see [CONTRIBUTING.md](CONTRIBUTING.md) for local setup, test commands, and the PR checklist.
|
|
260
|
+
|
|
261
|
+
## License
|
|
262
|
+
|
|
263
|
+
MIT. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "rankrush-cli"
|
|
7
|
+
version = "0.1.37"
|
|
8
|
+
description = "Agent-native CLI wrapper for the RankRush platform — wraps Supabase Edge Functions and REST API into structured, scriptable commands with --json output."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
license = "MIT"
|
|
12
|
+
authors = [
|
|
13
|
+
{ name = "Gabriel Gircenko", email = "gabriel.gircenko@gmail.com" },
|
|
14
|
+
]
|
|
15
|
+
keywords = ["rankrush", "seo", "aeo", "ai-visibility", "cli", "agent"]
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Development Status :: 3 - Alpha",
|
|
18
|
+
"Environment :: Console",
|
|
19
|
+
"Intended Audience :: Developers",
|
|
20
|
+
"Operating System :: OS Independent",
|
|
21
|
+
"Programming Language :: Python :: 3",
|
|
22
|
+
"Programming Language :: Python :: 3.10",
|
|
23
|
+
"Programming Language :: Python :: 3.11",
|
|
24
|
+
"Programming Language :: Python :: 3.12",
|
|
25
|
+
]
|
|
26
|
+
dependencies = [
|
|
27
|
+
"click>=8.1",
|
|
28
|
+
"requests>=2.31",
|
|
29
|
+
"python-dotenv>=1.0",
|
|
30
|
+
# Runtime deps of the vendored generated SDK (cli/rankrush_client, urllib3-based).
|
|
31
|
+
"urllib3>=2.1,<3",
|
|
32
|
+
"python-dateutil>=2.8.2",
|
|
33
|
+
"pydantic>=2.11",
|
|
34
|
+
"typing-extensions>=4.7.1",
|
|
35
|
+
# The generated urllib3 transport verifies SSL but ships no CA bundle; edge.py
|
|
36
|
+
# points it at certifi's, so certifi must be an explicit runtime dep.
|
|
37
|
+
"certifi>=2024.2.2",
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
[project.optional-dependencies]
|
|
41
|
+
# `pip install rankrush-cli[mcp]` to also install the MCP server (rankrush-mcp).
|
|
42
|
+
mcp = [
|
|
43
|
+
"mcp>=1.2",
|
|
44
|
+
]
|
|
45
|
+
dev = [
|
|
46
|
+
"pytest>=8.0",
|
|
47
|
+
"pytest-mock>=3.12",
|
|
48
|
+
"build>=1.0",
|
|
49
|
+
"coverage>=7.4",
|
|
50
|
+
"mcp>=1.2",
|
|
51
|
+
]
|
|
52
|
+
|
|
53
|
+
[project.scripts]
|
|
54
|
+
rankrush = "rankrush.cli:cli"
|
|
55
|
+
rankrush-mcp = "rankrush.mcp_server:main"
|
|
56
|
+
|
|
57
|
+
[project.urls]
|
|
58
|
+
Homepage = "https://rankrush.ai"
|
|
59
|
+
Repository = "https://github.com/nikolapevic/rankrush"
|
|
60
|
+
|
|
61
|
+
[tool.setuptools.packages.find]
|
|
62
|
+
include = ["rankrush*"]
|
|
63
|
+
exclude = ["tests*"]
|
|
64
|
+
|
|
65
|
+
[tool.coverage.run]
|
|
66
|
+
branch = true
|
|
67
|
+
source = ["rankrush"]
|
|
68
|
+
omit = [
|
|
69
|
+
"tests/*",
|
|
70
|
+
"*/tests/*",
|
|
71
|
+
]
|
|
72
|
+
|
|
73
|
+
[tool.coverage.report]
|
|
74
|
+
exclude_lines = [
|
|
75
|
+
"pragma: no cover",
|
|
76
|
+
"raise NotImplementedError",
|
|
77
|
+
"if __name__ == .__main__.:",
|
|
78
|
+
]
|
|
79
|
+
|