querynest-cli 1.0.4__tar.gz → 2.0.0__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 (50) hide show
  1. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/PKG-INFO +217 -46
  2. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/README.md +215 -46
  3. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/pyproject.toml +3 -8
  4. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/cli/commands/chat.py +37 -7
  5. querynest_cli-2.0.0/src/querynest/cli/commands/config.py +55 -0
  6. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/config/bootstrap.py +10 -16
  7. querynest_cli-2.0.0/src/querynest/config/config_loader.py +33 -0
  8. querynest_cli-2.0.0/src/querynest/config/config_model.py +8 -0
  9. querynest_cli-2.0.0/src/querynest/config/llm.py +15 -0
  10. querynest_cli-2.0.0/src/querynest/config/setup.py +100 -0
  11. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/loaders/pdf_loader.py +11 -1
  12. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/prompts/prompt_template.py +11 -4
  13. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/vector_store/faiss_store.py +38 -11
  14. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest_cli.egg-info/PKG-INFO +217 -46
  15. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest_cli.egg-info/SOURCES.txt +1 -0
  16. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest_cli.egg-info/requires.txt +2 -0
  17. querynest_cli-1.0.4/src/querynest/cli/commands/config.py +0 -15
  18. querynest_cli-1.0.4/src/querynest/config/config_loader.py +0 -27
  19. querynest_cli-1.0.4/src/querynest/config/config_model.py +0 -6
  20. querynest_cli-1.0.4/src/querynest/config/setup.py +0 -48
  21. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/LICENSE +0 -0
  22. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/setup.cfg +0 -0
  23. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/__init__.py +0 -0
  24. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/cli/__init__.py +0 -0
  25. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/cli/commands/__init__.py +0 -0
  26. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/cli/commands/history.py +0 -0
  27. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/cli/commands/sessions.py +0 -0
  28. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/cli/main.py +0 -0
  29. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/config/__init__.py +0 -0
  30. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/config/gemini.py +0 -0
  31. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/embeddings/__init__.py +0 -0
  32. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/embeddings/embedder.py +0 -0
  33. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/loaders/__init__.py +0 -0
  34. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/loaders/web_loader.py +0 -0
  35. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/loaders/youtube_loader.py +0 -0
  36. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/memory/__init__.py +0 -0
  37. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/memory/chat_memory.py +0 -0
  38. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/processor/__init__.py +0 -0
  39. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/processor/text_splitter.py +0 -0
  40. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/prompts/__init__.py +0 -0
  41. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/rag/rag_chain.py +0 -0
  42. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/retriever/__init__.py +0 -0
  43. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/sessions/session_meta.py +0 -0
  44. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/utils/__init__.py +0 -0
  45. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/utils/hashing.py +0 -0
  46. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/utils/paths.py +0 -0
  47. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest/vector_store/__init__.py +0 -0
  48. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest_cli.egg-info/dependency_links.txt +0 -0
  49. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest_cli.egg-info/entry_points.txt +0 -0
  50. {querynest_cli-1.0.4 → querynest_cli-2.0.0}/src/querynest_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: querynest-cli
3
- Version: 1.0.4
3
+ Version: 2.0.0
4
4
  Summary: FAISS-first RAG CLI for documents and web pages
5
5
  Author: Divyansh Sharma
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -710,6 +710,8 @@ Requires-Dist: lxml-html-clean>=0.1
710
710
  Requires-Dist: tqdm>=4.66
711
711
  Requires-Dist: typer>=0.12
712
712
  Requires-Dist: rich>=13.7
713
+ Requires-Dist: litellm<2.0,>=1.30
714
+ Requires-Dist: langchain-litellm>=0.1
713
715
  Dynamic: license-file
714
716
 
715
717
  # QueryNest
@@ -731,6 +733,10 @@ It is designed to be developer-friendly, fully self-hostable, and incrementally
731
733
  - [Supported Data Sources](#supported-data-sources)
732
734
  - [Websites](#websites)
733
735
  - [PDF Documents](#pdf-documents)
736
+ - [Key Features In-Depth](#key-features-in-depth)
737
+ - [Multi-Model LLM Support](#multi-model-llm-support)
738
+ - [Rich Progress Bars](#rich-progress-bars)
739
+ - [Streaming Responses](#streaming-responses)
734
740
  - [High-Level Architecture](#high-level-architecture)
735
741
  - [Technical Stack](#technical-stack)
736
742
  - [Memory Design](#memory-design)
@@ -769,7 +775,7 @@ QueryNest is distributed as a Python package and can be installed directly from
769
775
  #### Install using pip
770
776
 
771
777
  ```bash
772
- pip install querynest-cli==1.0.1
778
+ pip install querynest-cli==2.0.0
773
779
  ```
774
780
 
775
781
  This installs the `querynest` CLI in your environment.
@@ -785,7 +791,7 @@ If installed correctly, you should see the available CLI commands.
785
791
  #### PyPI Package
786
792
 
787
793
  Official PyPI release:
788
- [https://pypi.org/project/querynest-cli/1.0.1/](https://pypi.org/project/querynest-cli/1.0.1/)
794
+ [https://pypi.org/project/querynest-cli/2.0.0/](https://pypi.org/project/querynest-cli/2.0.0/)
789
795
 
790
796
  ---
791
797
 
@@ -838,7 +844,7 @@ The CLI supports:
838
844
  * Automatic session creation and resume
839
845
  * Session inspection, search, rename, and deletion
840
846
  * Viewing chat history
841
- * Configuration management (API key)
847
+ * Configuration management (API keys and LLM model selection)
842
848
 
843
849
  ---
844
850
 
@@ -895,26 +901,51 @@ Only **one source** is allowed per session.
895
901
  ### Usage
896
902
 
897
903
  ```bash
904
+ # Start chat with a web page
898
905
  querynest chat --web "https://example.com"
906
+
907
+ # Start chat with a single PDF
899
908
  querynest chat --pdf "/path/to/file.pdf"
909
+
910
+ # Start chat with multiple PDFs in a folder
900
911
  querynest chat --pdf "/path/to/folder/"
912
+
913
+ # Force rebuild the vector index (useful if the source has been updated)
914
+ querynest chat --web "https://example.com" --force
915
+ querynest chat --pdf "/path/to/file.pdf" --force
901
916
  ```
902
917
 
903
918
  ### Behavior
904
919
 
905
920
  * A deterministic session ID is generated from the source
906
921
  * If a session already exists for the source, it is resumed automatically
907
- * If not, a new session is created
922
+ * If not, a new session is created with rich progress feedback
908
923
  * On first creation, the user is prompted for a session name
909
- * Documents are loaded, split, embedded, and indexed using FAISS
910
- * A conversational chat loop is started
924
+ * Documents are loaded (with progress bars), split into chunks, embedded, and indexed using FAISS
925
+ * A conversational chat loop is started with **real-time streaming responses**
926
+ * Model used is shown on startup and determined by your current config (defaults to Gemini)
927
+
928
+ ### The `--force` Flag
929
+
930
+ ```bash
931
+ querynest chat --web "https://example.com" --force
932
+ ```
933
+
934
+ Forces a complete rebuild of the vector index even if a session already exists for the source. Use this when:
935
+ - The web page content has been updated
936
+ - The PDF has been modified
937
+ - You want a fresh index without resuming the old session
938
+
939
+ This clears the existing chat history and vector index for that source and starts fresh.
911
940
 
912
941
  ### Key Characteristics
913
942
 
914
- * Interactive REPL-style chat
915
- * Markdown-rendered assistant responses
916
- * Sliding window memory
917
- * Automatic persistence of chat and vectors
943
+ * **Interactive REPL-style chat** with streaming token-by-token responses
944
+ * **Plain text responses** with structured formatting (headings, lists) — no markdown symbols
945
+ * **Sliding window memory** for efficient conversation context
946
+ * **Automatic persistence** of chat and vectors
947
+ * **Rich progress feedback** during document processing
948
+ * **Multi-model support** — Use any LLM through LiteLLM
918
949
  * Graceful handling of Ctrl+C and EOF
919
950
 
920
951
  ### Exit
@@ -932,20 +963,67 @@ quit
932
963
 
933
964
  ### Purpose
934
965
 
935
- Manage QueryNest configuration, primarily the Gemini API key.
966
+ Manage QueryNest configuration API keys and LLM model selection.
936
967
 
937
968
  ### Commands
938
969
 
939
- #### Set API Key
970
+ #### Set Gemini API Key
940
971
 
941
972
  ```bash
942
- querynest config set-api-key
973
+ querynest config set-gemini-key
943
974
  ```
944
975
 
945
- * Prompts securely for a new API key
976
+ * Prompts securely for a new Gemini API key
977
+ * Used exclusively for embeddings (`text-embedding-004`)
946
978
  * Updates the local configuration file
947
979
  * Takes effect immediately
948
980
 
981
+ #### Set LLM Model
982
+
983
+ ```bash
984
+ querynest config set-llm
985
+ ```
986
+
987
+ * Shows a curated menu of supported LLM providers and models
988
+ * Also supports entering a custom model string (e.g. `groq/llama-3.1-8b-instant`)
989
+ * Prompts for the provider API key (skipped if Gemini is selected as LLM)
990
+ * Available options:
991
+
992
+ ```
993
+ 1. Gemini 2.5 Flash (default)
994
+ 2. OpenAI - GPT-4o
995
+ 3. OpenAI - GPT-4o Mini
996
+ 4. Anthropic - Claude Sonnet
997
+ 5. Groq - Llama 3.3 70B
998
+ 6. Mistral - Large
999
+ 7. Enter custom model string
1000
+ ```
1001
+
1002
+ #### Set LLM API Key (without changing model)
1003
+
1004
+ ```bash
1005
+ querynest config set-llm-key
1006
+ ```
1007
+
1008
+ * Updates only the API key for the currently configured LLM provider
1009
+ * Useful when rotating API keys without switching models
1010
+ * If current LLM is Gemini, redirects to `set-gemini-key`
1011
+
1012
+ #### Show Current Models
1013
+
1014
+ ```bash
1015
+ querynest config show-models
1016
+ ```
1017
+
1018
+ * Displays the currently configured embedding model and LLM
1019
+ * Example output:
1020
+
1021
+ ```
1022
+ Current Configuration:
1023
+ Embeddings : Google Gemini (text-embedding-004)
1024
+ LLM : groq/llama-3.3-70b-versatile
1025
+ ```
1026
+
949
1027
  ---
950
1028
 
951
1029
  ## 3. History Command
@@ -1093,9 +1171,6 @@ Search is:
1093
1171
 
1094
1172
  ---
1095
1173
 
1096
-
1097
-
1098
-
1099
1174
  ## Design Constraints and Guarantees
1100
1175
 
1101
1176
  * One session corresponds to exactly one source
@@ -1103,18 +1178,21 @@ Search is:
1103
1178
  * Multiple PDFs are supported only via a single folder
1104
1179
  * JavaScript-rendered web pages are not supported
1105
1180
  * Image-only documents are not supported
1181
+ * Embedding model is fixed (Google Gemini) — changing it would invalidate existing indexes
1106
1182
 
1107
1183
  ---
1108
1184
 
1109
-
1110
-
1111
1185
  ## Features
1112
1186
 
1113
- * Terminal-based conversational interface
1187
+ * **Terminal-based conversational interface** with streaming responses for real-time feedback
1188
+ * **Multi-model LLM support** — Seamlessly switch between Gemini, OpenAI, Claude, Groq, Mistral and 100+ providers via LiteLLM
1189
+ * **Rich progress bars** for PDF loading, chunking, and embedding operations
1190
+ * **Streaming responses** — Responses stream token-by-token in real-time
1191
+ * **Force re-indexing** — Rebuild vector index on demand with `--force`
1114
1192
  * Query external knowledge sources using natural language
1115
1193
  * Support for multiple data sources:
1116
- * Website URLs (cleaned page content)
1117
- * PDF documents (local files)
1194
+ * Website URLs (cleaned page content)
1195
+ * PDF documents (local files or folders)
1118
1196
  * Retrieval Augmented Generation (RAG) pipeline
1119
1197
  * Conversational context awareness (sliding window memory)
1120
1198
  * Deterministic session creation and automatic session resume
@@ -1139,12 +1217,66 @@ Search is:
1139
1217
 
1140
1218
  ### PDF Documents
1141
1219
 
1142
- * Accepts a local PDF file path
1143
- * Extracts document text
1220
+ * Accepts a local PDF file path or folder of PDFs
1221
+ * Extracts document text with **rich progress feedback**
1144
1222
  * Enables question answering over document content
1145
1223
 
1146
1224
  ---
1147
1225
 
1226
+ ## Key Features In-Depth
1227
+
1228
+ ### Multi-Model LLM Support
1229
+
1230
+ QueryNest supports **100+ LLM models** through LiteLLM integration. Embeddings always use Google Gemini (`text-embedding-004`) for consistency across sessions. The LLM is fully configurable:
1231
+
1232
+ ```bash
1233
+ # Default: Gemini
1234
+ querynest chat --pdf "document.pdf"
1235
+
1236
+ # Switch to Groq (fast + free tier)
1237
+ querynest config set-llm # select option 5
1238
+
1239
+ # Switch to OpenAI
1240
+ querynest config set-llm # select option 2
1241
+
1242
+ # Check what's currently configured
1243
+ querynest config show-models
1244
+ ```
1245
+
1246
+ Configuration is stored in `~/.querynest/config.json` and persists across sessions.
1247
+
1248
+ ### Rich Progress Bars
1249
+
1250
+ Visual feedback during document processing:
1251
+
1252
+ - **PDF Loading**: Shows file processing status with filename and progress
1253
+ - **Embedding**: Live progress bar for vector embedding operations (batched, 50 chunks at a time)
1254
+
1255
+ Example output:
1256
+ ```
1257
+ Using Embeddings: Google Gemini (text-embedding-004)
1258
+ Using LLM: groq/llama-3.3-70b-versatile
1259
+ Loading documents...
1260
+ ⠸ Embedding chunks... ━━━━━━━━━━━━━━━ 45% 45/100 chunks
1261
+ ```
1262
+
1263
+ ### Streaming Responses
1264
+
1265
+ LLM responses stream token-by-token in real-time with clean formatted output:
1266
+
1267
+ ```
1268
+ You: What is machine learning?
1269
+
1270
+ Thinking...
1271
+
1272
+ Assistant
1273
+ Machine learning is a subset of artificial intelligence that enables
1274
+ systems to learn and improve from experience without being explicitly
1275
+ programmed...
1276
+ ```
1277
+
1278
+ ---
1279
+
1148
1280
  ## High-Level Architecture
1149
1281
 
1150
1282
  ```
@@ -1158,15 +1290,15 @@ Text Cleaning & Normalization
1158
1290
 
1159
1291
  Text Chunking
1160
1292
 
1161
- Embeddings (Gemini)
1293
+ Embeddings (Google Gemini — fixed)
1162
1294
 
1163
- Vector Store (FAISS / Chroma)
1295
+ Vector Store (FAISS)
1164
1296
 
1165
1297
  Similarity Search
1166
1298
 
1167
- LLM (Gemini)
1299
+ LLM (Configurable via LiteLLM)
1168
1300
 
1169
- Terminal Response
1301
+ Terminal Response (Streamed)
1170
1302
  ```
1171
1303
 
1172
1304
  ---
@@ -1179,21 +1311,25 @@ Terminal Response
1179
1311
 
1180
1312
  ### LLM and Embeddings
1181
1313
 
1182
- * For embedding (models/text-embedding-004)
1183
- * For LLM, gemini-2.5-flash
1184
-
1185
- > Planned: Support for OpenAI, Claude, and Hugging Face models via user-provided API keys.
1314
+ * **LLM (via LiteLLM):** Google Gemini (default), OpenAI, Anthropic, Groq, Mistral, and 100+ more
1315
+ * **Embeddings:** Google Gemini `text-embedding-004` (fixed — ensures index consistency)
1186
1316
 
1187
1317
  ### Vector Storage
1188
1318
 
1189
1319
  * FAISS (CPU-based, default)
1190
- * Chroma (planned for persistent storage)
1320
+ * Chroma (planned)
1191
1321
 
1192
1322
  ### Content Extraction
1193
1323
 
1194
1324
  * Websites: `requests`, `beautifulsoup4`, `readability-lxml`
1195
1325
  * PDFs: `pypdf`
1196
1326
 
1327
+ ### UI & Progress Feedback
1328
+
1329
+ * **Rich**: Terminal formatting, live progress bars
1330
+ * **LiteLLM**: Multi-model LLM abstraction layer
1331
+ * **tqdm**: Progress bars for directory PDF loading
1332
+
1197
1333
  ---
1198
1334
 
1199
1335
  ## Memory Design
@@ -1204,20 +1340,20 @@ QueryNest separates memory into two independent systems:
1204
1340
 
1205
1341
  * Stores embeddings of source content
1206
1342
  * Used only for semantic retrieval
1207
- * Implemented using FAISS or Chroma
1343
+ * Implemented using FAISS
1208
1344
 
1209
1345
  ### 2. Conversational Memory (Chat History)
1210
1346
 
1211
1347
  * Stores user–assistant messages
1212
1348
  * Maintains conversational continuity
1213
- * Sliding window of recent messages (typically last 4–5)
1349
+ * Sliding window of recent messages (last 4 exchanges)
1214
1350
  * Stored as local JSON files
1215
1351
 
1216
1352
  ---
1217
1353
 
1218
1354
  ## Local Storage Structure
1219
1355
 
1220
- All persistent data is stored locally on the users machine.
1356
+ All persistent data is stored locally on the user's machine.
1221
1357
 
1222
1358
  ### Base Directory
1223
1359
 
@@ -1232,22 +1368,31 @@ All persistent data is stored locally on the user’s machine.
1232
1368
  ├── config.json
1233
1369
  └── sessions/
1234
1370
  └── <session_id>/
1371
+ ├── meta.json
1235
1372
  ├── chat.json
1236
1373
  └── vectors.faiss
1237
1374
  ```
1238
1375
 
1239
1376
  ### Configuration (`config.json`)
1240
1377
 
1241
- * Stores user-specific configuration
1242
- * API keys are never bundled in binaries
1378
+ ```json
1379
+ {
1380
+ "gemini_api_key": "...",
1381
+ "llm_model": "groq/llama-3.3-70b-versatile",
1382
+ "llm_api_key": "..."
1383
+ }
1384
+ ```
1385
+
1386
+ API keys are never bundled in distributed artifacts.
1243
1387
 
1244
1388
  ---
1245
1389
 
1246
1390
  ## Session Management
1247
1391
 
1248
- * Sessions are deterministically generated using a hash of the input source
1392
+ * Sessions are deterministically generated using a SHA-256 hash of the input source
1249
1393
  * Same source results in the same session and memory
1250
1394
  * Enables automatic session resume without manual configuration
1395
+ * Use `--force` to bypass resume and rebuild from scratch
1251
1396
 
1252
1397
  ---
1253
1398
 
@@ -1262,6 +1407,7 @@ Each LLM request includes:
1262
1407
  The LLM is explicitly instructed to:
1263
1408
 
1264
1409
  * Answer only from the provided context
1410
+ * Use plain text formatting (no markdown symbols)
1265
1411
  * Respond with "I don't know" if the answer cannot be inferred
1266
1412
 
1267
1413
  ---
@@ -1279,7 +1425,6 @@ The LLM is explicitly instructed to:
1279
1425
  ### v2 – Full CLI Tool
1280
1426
 
1281
1427
  * Professional command-based CLI interface
1282
- * `init` command for API key setup
1283
1428
  * Local persistence (sessions, chat history, vectors)
1284
1429
  * Improved prompt handling and error management
1285
1430
 
@@ -1288,7 +1433,33 @@ The LLM is explicitly instructed to:
1288
1433
  * Dockerfile and Docker Compose support
1289
1434
  * Volume-mounted persistent storage
1290
1435
  * Same CLI experience inside containers
1291
- * Simplified self-hosted deployment
1436
+
1437
+ ### v4 – Multi-Model Support (Current)
1438
+
1439
+ * LiteLLM integration for 100+ LLM providers
1440
+ * Curated model selection menu with custom model support
1441
+ * Per-provider API key management
1442
+ * Rich progress bars for embedding pipeline
1443
+ * Streaming responses
1444
+ * Force re-indexing with `--force`
1445
+
1446
+ ### v5 – Distribution & Introduction Website (Planned)
1447
+
1448
+ Distribution formats:
1449
+
1450
+ * Docker Image — primary self-host method
1451
+ * pip package
1452
+ * Windows executable — `.exe` via PyInstaller
1453
+ * Linux packages — `.rpm` and `.deb`
1454
+ * AppImage — packaging format research and build pipeline
1455
+ * Tarball
1456
+
1457
+ Introduction website (TypeScript):
1458
+
1459
+ * Home — project intro, tagline, quick feature highlights
1460
+ * About — what QueryNest is, how it works, the tech behind it
1461
+ * Download — all distribution options listed clearly (pip, Docker, `.exe`, `.rpm`, `.deb`, AppImage, Tarball)
1462
+ * Documentation — full usage guide, CLI reference, configuration options, and examples
1292
1463
 
1293
1464
  ---
1294
1465
 
@@ -1296,10 +1467,10 @@ The LLM is explicitly instructed to:
1296
1467
 
1297
1468
  QueryNest is distributed through multiple formats:
1298
1469
 
1299
- * Docker image (primary self-hosting method)
1300
- * pip package
1301
- * Windows executable (`.exe` via PyInstaller)
1302
- * Linux packages (`.rpm`, `.deb`)
1470
+ * Docker image (`divyansh1552005/querynest:latest`)
1471
+ * pip package (`querynest-cli` on PyPI)
1472
+ * Windows executable (`.exe` via PyInstaller) — planned
1473
+ * Linux packages (`.rpm`, `.deb`) — planned
1303
1474
 
1304
1475
  Secrets and API keys are never bundled in distributed artifacts.
1305
1476