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.
Files changed (151) hide show
  1. rankrush_cli-0.1.37/LICENSE +21 -0
  2. rankrush_cli-0.1.37/PKG-INFO +301 -0
  3. rankrush_cli-0.1.37/README.md +263 -0
  4. rankrush_cli-0.1.37/pyproject.toml +79 -0
  5. rankrush_cli-0.1.37/rankrush/__init__.py +3 -0
  6. rankrush_cli-0.1.37/rankrush/cache.py +83 -0
  7. rankrush_cli-0.1.37/rankrush/cli.py +241 -0
  8. rankrush_cli-0.1.37/rankrush/client.py +227 -0
  9. rankrush_cli-0.1.37/rankrush/commands/__init__.py +0 -0
  10. rankrush_cli-0.1.37/rankrush/commands/audit.py +307 -0
  11. rankrush_cli-0.1.37/rankrush/commands/blog.py +175 -0
  12. rankrush_cli-0.1.37/rankrush/commands/buzz/__init__.py +0 -0
  13. rankrush_cli-0.1.37/rankrush/commands/buzz/drafts.py +84 -0
  14. rankrush_cli-0.1.37/rankrush/commands/buzz/posts.py +97 -0
  15. rankrush_cli-0.1.37/rankrush/commands/buzz/research.py +108 -0
  16. rankrush_cli-0.1.37/rankrush/commands/buzz/strategy.py +47 -0
  17. rankrush_cli-0.1.37/rankrush/commands/cms.py +80 -0
  18. rankrush_cli-0.1.37/rankrush/commands/init.py +223 -0
  19. rankrush_cli-0.1.37/rankrush/commands/keywords.py +91 -0
  20. rankrush_cli-0.1.37/rankrush/commands/leadgen.py +125 -0
  21. rankrush_cli-0.1.37/rankrush/commands/leads.py +253 -0
  22. rankrush_cli-0.1.37/rankrush/commands/nodes.py +227 -0
  23. rankrush_cli-0.1.37/rankrush/commands/profiles.py +64 -0
  24. rankrush_cli-0.1.37/rankrush/commands/report.py +279 -0
  25. rankrush_cli-0.1.37/rankrush/commands/scans.py +88 -0
  26. rankrush_cli-0.1.37/rankrush/commands/smoke.py +147 -0
  27. rankrush_cli-0.1.37/rankrush/commands/visibility.py +354 -0
  28. rankrush_cli-0.1.37/rankrush/config.py +44 -0
  29. rankrush_cli-0.1.37/rankrush/edge.py +299 -0
  30. rankrush_cli-0.1.37/rankrush/env_file.py +140 -0
  31. rankrush_cli-0.1.37/rankrush/errors.py +119 -0
  32. rankrush_cli-0.1.37/rankrush/first_run.py +117 -0
  33. rankrush_cli-0.1.37/rankrush/leadgen/__init__.py +39 -0
  34. rankrush_cli-0.1.37/rankrush/leadgen/dedupe.py +135 -0
  35. rankrush_cli-0.1.37/rankrush/leadgen/footprints.py +156 -0
  36. rankrush_cli-0.1.37/rankrush/leadgen/pipeline.py +191 -0
  37. rankrush_cli-0.1.37/rankrush/leadgen/sampler.py +161 -0
  38. rankrush_cli-0.1.37/rankrush/leadgen/store.py +101 -0
  39. rankrush_cli-0.1.37/rankrush/leadgen/wat_parser.py +180 -0
  40. rankrush_cli-0.1.37/rankrush/mcp_server.py +363 -0
  41. rankrush_cli-0.1.37/rankrush/options.py +40 -0
  42. rankrush_cli-0.1.37/rankrush/output.py +56 -0
  43. rankrush_cli-0.1.37/rankrush_cli.egg-info/PKG-INFO +301 -0
  44. rankrush_cli-0.1.37/rankrush_cli.egg-info/SOURCES.txt +149 -0
  45. rankrush_cli-0.1.37/rankrush_cli.egg-info/dependency_links.txt +1 -0
  46. rankrush_cli-0.1.37/rankrush_cli.egg-info/entry_points.txt +3 -0
  47. rankrush_cli-0.1.37/rankrush_cli.egg-info/requires.txt +18 -0
  48. rankrush_cli-0.1.37/rankrush_cli.egg-info/top_level.txt +2 -0
  49. rankrush_cli-0.1.37/rankrush_client/__init__.py +232 -0
  50. rankrush_cli-0.1.37/rankrush_client/api/__init__.py +11 -0
  51. rankrush_cli-0.1.37/rankrush_client/api/admin_api.py +1181 -0
  52. rankrush_cli-0.1.37/rankrush_client/api/audit_api.py +1178 -0
  53. rankrush_cli-0.1.37/rankrush_client/api/blog_api.py +1467 -0
  54. rankrush_cli-0.1.37/rankrush_client/api/buzz_api.py +2322 -0
  55. rankrush_cli-0.1.37/rankrush_client/api/jwt_only_api.py +2021 -0
  56. rankrush_cli-0.1.37/rankrush_client/api/profiles_api.py +600 -0
  57. rankrush_cli-0.1.37/rankrush_client/api/visibility_api.py +898 -0
  58. rankrush_cli-0.1.37/rankrush_client/api_client.py +804 -0
  59. rankrush_cli-0.1.37/rankrush_client/api_response.py +21 -0
  60. rankrush_cli-0.1.37/rankrush_client/configuration.py +640 -0
  61. rankrush_cli-0.1.37/rankrush_client/exceptions.py +218 -0
  62. rankrush_cli-0.1.37/rankrush_client/models/__init__.py +102 -0
  63. rankrush_cli-0.1.37/rankrush_client/models/audit_enqueue_request.py +104 -0
  64. rankrush_cli-0.1.37/rankrush_client/models/audit_enqueue_response.py +112 -0
  65. rankrush_cli-0.1.37/rankrush_client/models/audit_run.py +142 -0
  66. rankrush_cli-0.1.37/rankrush_client/models/audit_run_get_request.py +91 -0
  67. rankrush_cli-0.1.37/rankrush_client/models/audit_run_get_response.py +104 -0
  68. rankrush_cli-0.1.37/rankrush_client/models/blog_topic.py +108 -0
  69. rankrush_cli-0.1.37/rankrush_client/models/blog_topics_list_request.py +92 -0
  70. rankrush_cli-0.1.37/rankrush_client/models/blog_topics_list_response.py +101 -0
  71. rankrush_cli-0.1.37/rankrush_client/models/buzz_brand_research_response.py +100 -0
  72. rankrush_cli-0.1.37/rankrush_client/models/buzz_brand_research_response_research_summary.py +106 -0
  73. rankrush_cli-0.1.37/rankrush_client/models/buzz_brand_research_response_research_summary_sentiment_breakdown.py +92 -0
  74. rankrush_cli-0.1.37/rankrush_client/models/buzz_brand_research_response_research_summary_top_subreddits_inner.py +90 -0
  75. rankrush_cli-0.1.37/rankrush_client/models/buzz_draft_approve_request.py +92 -0
  76. rankrush_cli-0.1.37/rankrush_client/models/buzz_engagement.py +135 -0
  77. rankrush_cli-0.1.37/rankrush_client/models/buzz_engagements_list_request.py +98 -0
  78. rankrush_cli-0.1.37/rankrush_client/models/buzz_engagements_list_response.py +100 -0
  79. rankrush_cli-0.1.37/rankrush_client/models/buzz_extract_profile_response.py +94 -0
  80. rankrush_cli-0.1.37/rankrush_client/models/buzz_extract_profile_response_extracted.py +98 -0
  81. rankrush_cli-0.1.37/rankrush_client/models/buzz_generate_drafts_request.py +102 -0
  82. rankrush_cli-0.1.37/rankrush_client/models/buzz_generate_drafts_response.py +114 -0
  83. rankrush_cli-0.1.37/rankrush_client/models/buzz_mention.py +134 -0
  84. rankrush_cli-0.1.37/rankrush_client/models/buzz_opportunity_search_response.py +96 -0
  85. rankrush_cli-0.1.37/rankrush_client/models/buzz_profile_get_response.py +104 -0
  86. rankrush_cli-0.1.37/rankrush_client/models/buzz_research_list_request.py +94 -0
  87. rankrush_cli-0.1.37/rankrush_client/models/buzz_research_list_response.py +101 -0
  88. rankrush_cli-0.1.37/rankrush_client/models/buzz_visibility_score_response.py +125 -0
  89. rankrush_cli-0.1.37/rankrush_client/models/buzz_visibility_score_response_engagement_metrics.py +96 -0
  90. rankrush_cli-0.1.37/rankrush_client/models/buzz_visibility_score_response_top_subreddits_inner.py +94 -0
  91. rankrush_cli-0.1.37/rankrush_client/models/buzz_wait_request.py +90 -0
  92. rankrush_cli-0.1.37/rankrush_client/models/cap_error.py +108 -0
  93. rankrush_cli-0.1.37/rankrush_client/models/check_ai_visibility_request.py +112 -0
  94. rankrush_cli-0.1.37/rankrush_client/models/check_ai_visibility_response.py +114 -0
  95. rankrush_cli-0.1.37/rankrush_client/models/check_ai_visibility_response_dropped_inner.py +92 -0
  96. rankrush_cli-0.1.37/rankrush_client/models/create_lead_account_request.py +105 -0
  97. rankrush_cli-0.1.37/rankrush_client/models/create_lead_account_response.py +109 -0
  98. rankrush_cli-0.1.37/rankrush_client/models/create_lead_account_response_scan.py +99 -0
  99. rankrush_cli-0.1.37/rankrush_client/models/delete_audit_run_request.py +88 -0
  100. rankrush_cli-0.1.37/rankrush_client/models/delete_audit_run_response.py +101 -0
  101. rankrush_cli-0.1.37/rankrush_client/models/delete_audit_run_response_deleted.py +92 -0
  102. rankrush_cli-0.1.37/rankrush_client/models/error.py +102 -0
  103. rankrush_cli-0.1.37/rankrush_client/models/extract_offerings_request.py +90 -0
  104. rankrush_cli-0.1.37/rankrush_client/models/extract_offerings_response.py +108 -0
  105. rankrush_cli-0.1.37/rankrush_client/models/generate_blog_post_request.py +93 -0
  106. rankrush_cli-0.1.37/rankrush_client/models/generate_blog_post_response.py +98 -0
  107. rankrush_cli-0.1.37/rankrush_client/models/generate_blog_topics_request.py +93 -0
  108. rankrush_cli-0.1.37/rankrush_client/models/generate_content_strategy_response.py +97 -0
  109. rankrush_cli-0.1.37/rankrush_client/models/generate_node_content_request.py +133 -0
  110. rankrush_cli-0.1.37/rankrush_client/models/generate_node_content_response.py +101 -0
  111. rankrush_cli-0.1.37/rankrush_client/models/generate_node_content_response_content.py +143 -0
  112. rankrush_cli-0.1.37/rankrush_client/models/generate_visibility_keywords_response.py +115 -0
  113. rankrush_cli-0.1.37/rankrush_client/models/generate_visibility_keywords_response_keywords_inner.py +100 -0
  114. rankrush_cli-0.1.37/rankrush_client/models/generate_visibility_keywords_response_sources.py +90 -0
  115. rankrush_cli-0.1.37/rankrush_client/models/gsc_fetch_queries_response.py +105 -0
  116. rankrush_cli-0.1.37/rankrush_client/models/gsc_fetch_queries_response_queries_inner.py +96 -0
  117. rankrush_cli-0.1.37/rankrush_client/models/gsc_select_property_request.py +90 -0
  118. rankrush_cli-0.1.37/rankrush_client/models/job_queued_response.py +109 -0
  119. rankrush_cli-0.1.37/rankrush_client/models/keywords_list_request.py +92 -0
  120. rankrush_cli-0.1.37/rankrush_client/models/keywords_list_response.py +93 -0
  121. rankrush_cli-0.1.37/rankrush_client/models/lead_enqueue_request.py +98 -0
  122. rankrush_cli-0.1.37/rankrush_client/models/lead_enqueue_response.py +114 -0
  123. rankrush_cli-0.1.37/rankrush_client/models/lead_enqueue_result.py +103 -0
  124. rankrush_cli-0.1.37/rankrush_client/models/lead_item.py +110 -0
  125. rankrush_cli-0.1.37/rankrush_client/models/node_complete_request.py +92 -0
  126. rankrush_cli-0.1.37/rankrush_client/models/node_complete_response.py +108 -0
  127. rankrush_cli-0.1.37/rankrush_client/models/node_progress.py +115 -0
  128. rankrush_cli-0.1.37/rankrush_client/models/node_progress_summary.py +97 -0
  129. rankrush_cli-0.1.37/rankrush_client/models/nodes_list_request.py +104 -0
  130. rankrush_cli-0.1.37/rankrush_client/models/nodes_list_response.py +101 -0
  131. rankrush_cli-0.1.37/rankrush_client/models/ok_response.py +95 -0
  132. rankrush_cli-0.1.37/rankrush_client/models/profile.py +122 -0
  133. rankrush_cli-0.1.37/rankrush_client/models/profile_id_camel_request.py +88 -0
  134. rankrush_cli-0.1.37/rankrush_client/models/profile_id_snake_request.py +88 -0
  135. rankrush_cli-0.1.37/rankrush_client/models/profile_update_request.py +104 -0
  136. rankrush_cli-0.1.37/rankrush_client/models/profiles_list_request.py +89 -0
  137. rankrush_cli-0.1.37/rankrush_client/models/rate_limit_error.py +112 -0
  138. rankrush_cli-0.1.37/rankrush_client/models/report_job_get_request.py +89 -0
  139. rankrush_cli-0.1.37/rankrush_client/models/report_job_get_response.py +142 -0
  140. rankrush_cli-0.1.37/rankrush_client/models/save_cms_connection_request.py +96 -0
  141. rankrush_cli-0.1.37/rankrush_client/models/save_cms_connection_response.py +99 -0
  142. rankrush_cli-0.1.37/rankrush_client/models/suggest_competitors_request.py +118 -0
  143. rankrush_cli-0.1.37/rankrush_client/models/suggest_competitors_response.py +107 -0
  144. rankrush_cli-0.1.37/rankrush_client/models/suggest_competitors_response_category.py +96 -0
  145. rankrush_cli-0.1.37/rankrush_client/models/suggest_competitors_response_competitors_inner.py +102 -0
  146. rankrush_cli-0.1.37/rankrush_client/models/validation_error_body.py +102 -0
  147. rankrush_cli-0.1.37/rankrush_client/models/verify_blog_posts_request.py +90 -0
  148. rankrush_cli-0.1.37/rankrush_client/models/verify_blog_posts_response.py +98 -0
  149. rankrush_cli-0.1.37/rankrush_client/py.typed +0 -0
  150. rankrush_cli-0.1.37/rankrush_client/rest.py +263 -0
  151. 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
+ [![CLI Test Matrix](https://github.com/nikolapevic/rankrush/actions/workflows/cli-test-matrix.yml/badge.svg?branch=main)](https://github.com/nikolapevic/rankrush/actions/workflows/cli-test-matrix.yml)
42
+ ![Python](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12-blue)
43
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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
+ [![CLI Test Matrix](https://github.com/nikolapevic/rankrush/actions/workflows/cli-test-matrix.yml/badge.svg?branch=main)](https://github.com/nikolapevic/rankrush/actions/workflows/cli-test-matrix.yml)
4
+ ![Python](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12-blue)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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
+
@@ -0,0 +1,3 @@
1
+ """RankRush CLI — agent-native wrapper for the RankRush Supabase backend."""
2
+
3
+ __version__ = "0.1.37"