ragx-cli 0.5.0__tar.gz → 0.5.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/PKG-INFO +2 -1
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/README.md +1 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/pyproject.toml +1 -1
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/cli/app.py +54 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/tests/test_cli.py +36 -1
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/SKILL.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/api-cheatsheet.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/collection-management/python.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/collection-management/typescript.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/configuration.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/data-model.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/data-operations/python.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/data-operations/typescript.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/embedding.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/hybrid-search/python.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/hybrid-search/typescript.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/multimodal-search/python.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/multimodal-search/typescript.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/quick-start/python.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/quick-start/typescript.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/rag-system/python.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/rag-system/typescript.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/reranker.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/troubleshooting.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/vector-search/python.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.agents/skills/zvec/vector-search/typescript.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.github/workflows/publish.yml +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/.gitignore +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/AGENTS.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/CHANGELOG.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/CLAUDE.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/CONTRACTS-PHASE23.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/CONTRACTS.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/LICENSE +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/docs/feature-temporal-weighting.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/ragx-cli-plan.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/research/bge-m3-colbert-multi-vector-late-interaction-for-ragx-rerank-alternative-and-token-level-graph-edges.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/research/bge-m3-dense-embeddings-as-ragx-provider-multilingual-quality-and-threshold-calibration.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/research/bge-m3-dense-q8-vs-nomic-q4-benchmark-2026-07-12-worktree-eval-results.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/research/bge-m3-sparse-lexical-weights-hybrid-retrieval-leg-for-ragx-vs-sqlite-fts5-bm25.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/research/bge-m3-subchunk-edge-ablation-2026-07-13-ties-again-and-beta-zero-shortlist-mechanism.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/research/fine-grained-sub-chunk-edges-with-coarse-chunk-nodes-multi-granularity-graph-rag-literature-validation.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/research/lm-studio-model-download-api-and-curated-embedding-reranker-catalog-for-ragx-models-command.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/research/subchunk-edge-ablation-2026-07-12-two-round-experiment-protocol-results-and-verdict.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/skills/ragx-cli/SKILL.md +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/skills-lock.json +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/__init__.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/cli/__init__.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/cli/detect.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/cli/eval_cmd.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/cli/init_prompt.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/cli/inspect_cmd.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/cli/models_cmd.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/cli/output.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/cli/pipeline.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/core/__init__.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/core/catalog.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/core/chunking.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/core/communities.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/core/config.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/core/discovery.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/core/errors.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/core/eval.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/core/expansion.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/core/fusion.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/core/graph.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/core/indexer.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/core/lmstudio.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/core/models.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/core/query.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/core/scoring.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/core/store.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/core/traversal.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/core/vectors.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/providers/__init__.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/providers/base.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/providers/llama_embedder.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/providers/llama_process.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/providers/llama_server.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/providers/openai_compat.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/providers/registry.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/src/ragx/providers/st_reranker.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/tests/__init__.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/tests/conftest.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/tests/test_chunking.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/tests/test_communities.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/tests/test_config_rc.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/tests/test_discovery.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/tests/test_eval.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/tests/test_expansion.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/tests/test_fusion.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/tests/test_graph.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/tests/test_inspect.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/tests/test_integration.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/tests/test_llama_server.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/tests/test_models.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/tests/test_providers.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/tests/test_store.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/tests/test_traversal.py +0 -0
- {ragx_cli-0.5.0 → ragx_cli-0.5.1}/tests/test_vectors.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ragx-cli
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.1
|
|
4
4
|
Summary: Similarity-graph RAG CLI: index a corpus into a chunk-level embedding graph and query it
|
|
5
5
|
Project-URL: Repository, https://github.com/alber70g/ragx-cli
|
|
6
6
|
Project-URL: Issues, https://github.com/alber70g/ragx-cli/issues
|
|
@@ -53,6 +53,7 @@ ragx-cli index # chunk -> embed -> HNSW + kNN similarity graph (
|
|
|
53
53
|
ragx-cli query "why did we switch build tools?" --json --files-only
|
|
54
54
|
ragx-cli index --full # full rebuild: re-chunk + re-embed everything
|
|
55
55
|
ragx-cli models # recommend + download an embedding/reranker combo via LM Studio
|
|
56
|
+
ragx-cli --version # version, repo, and the effective models (corpus config + ~/.ragxrc overrides)
|
|
56
57
|
```
|
|
57
58
|
|
|
58
59
|
Runs against any OpenAI-compatible embedding endpoint (LM Studio, Ollama, OpenAI). Reranking
|
|
@@ -25,6 +25,7 @@ ragx-cli index # chunk -> embed -> HNSW + kNN similarity graph (
|
|
|
25
25
|
ragx-cli query "why did we switch build tools?" --json --files-only
|
|
26
26
|
ragx-cli index --full # full rebuild: re-chunk + re-embed everything
|
|
27
27
|
ragx-cli models # recommend + download an embedding/reranker combo via LM Studio
|
|
28
|
+
ragx-cli --version # version, repo, and the effective models (corpus config + ~/.ragxrc overrides)
|
|
28
29
|
```
|
|
29
30
|
|
|
30
31
|
Runs against any OpenAI-compatible embedding endpoint (LM Studio, Ollama, OpenAI). Reranking
|
|
@@ -4,6 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import logging
|
|
6
6
|
import sys
|
|
7
|
+
from importlib import metadata
|
|
7
8
|
from pathlib import Path
|
|
8
9
|
|
|
9
10
|
import typer
|
|
@@ -16,6 +17,8 @@ from ragx.core.config import (
|
|
|
16
17
|
CONFIG_FILE,
|
|
17
18
|
config_path,
|
|
18
19
|
db_path,
|
|
20
|
+
find_root,
|
|
21
|
+
load_rc,
|
|
19
22
|
rc_path,
|
|
20
23
|
require_root,
|
|
21
24
|
write_default_config,
|
|
@@ -23,6 +26,8 @@ from ragx.core.config import (
|
|
|
23
26
|
)
|
|
24
27
|
from ragx.core.errors import RagxError
|
|
25
28
|
|
|
29
|
+
REPO_URL = "https://github.com/alber70g/ragx-cli"
|
|
30
|
+
|
|
26
31
|
app = typer.Typer(add_completion=False, no_args_is_help=True)
|
|
27
32
|
config_app = typer.Typer(add_completion=False, no_args_is_help=True)
|
|
28
33
|
app.add_typer(config_app, name="config")
|
|
@@ -35,6 +40,55 @@ eval_cmd.register(app)
|
|
|
35
40
|
models_cmd.register(app)
|
|
36
41
|
|
|
37
42
|
|
|
43
|
+
def _print_version() -> None:
|
|
44
|
+
try:
|
|
45
|
+
version = metadata.version("ragx-cli")
|
|
46
|
+
except metadata.PackageNotFoundError:
|
|
47
|
+
version = "unknown"
|
|
48
|
+
typer.echo(f"ragx-cli {version}")
|
|
49
|
+
typer.echo(REPO_URL)
|
|
50
|
+
root = find_root()
|
|
51
|
+
if root is not None:
|
|
52
|
+
try:
|
|
53
|
+
cfg = Config.load(root, confirm=migrate_confirm())
|
|
54
|
+
typer.echo(f"config: {config_path(root)}")
|
|
55
|
+
for section in ("embeddings", "expansion", "rerank"):
|
|
56
|
+
line = f" {section}: {cfg.get(f'{section}.provider')}/{cfg.get(f'{section}.model')}"
|
|
57
|
+
if cfg.data[section].get("enabled") is False:
|
|
58
|
+
line += " (disabled)"
|
|
59
|
+
typer.echo(line)
|
|
60
|
+
except RagxError as exc:
|
|
61
|
+
typer.echo(f"config: unreadable ({exc})")
|
|
62
|
+
rc = rc_path()
|
|
63
|
+
if rc.exists():
|
|
64
|
+
typer.echo(f"global: {rc}")
|
|
65
|
+
try:
|
|
66
|
+
for section, values in load_rc().items():
|
|
67
|
+
for key, value in values.items():
|
|
68
|
+
typer.echo(f" {section}.{key} = {value}")
|
|
69
|
+
except RagxError as exc:
|
|
70
|
+
typer.echo(f" unreadable ({exc})")
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _version_option(value: bool) -> None:
|
|
74
|
+
if value:
|
|
75
|
+
_print_version()
|
|
76
|
+
raise typer.Exit()
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@app.callback()
|
|
80
|
+
def _main(
|
|
81
|
+
version: bool = typer.Option(
|
|
82
|
+
False,
|
|
83
|
+
"--version",
|
|
84
|
+
callback=_version_option,
|
|
85
|
+
is_eager=True,
|
|
86
|
+
help="show version, repo, and configured models (local + ~/.ragxrc)",
|
|
87
|
+
),
|
|
88
|
+
) -> None:
|
|
89
|
+
"""Similarity-graph RAG for your files."""
|
|
90
|
+
|
|
91
|
+
|
|
38
92
|
def _require_root() -> Path:
|
|
39
93
|
try:
|
|
40
94
|
return require_root()
|
|
@@ -2,12 +2,14 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
4
|
import tomllib
|
|
5
|
+
from importlib import metadata
|
|
6
|
+
from pathlib import Path
|
|
5
7
|
|
|
6
8
|
import httpx
|
|
7
9
|
import respx
|
|
8
10
|
from typer.testing import CliRunner
|
|
9
11
|
|
|
10
|
-
from ragx.cli.app import app
|
|
12
|
+
from ragx.cli.app import REPO_URL, app
|
|
11
13
|
from ragx.cli.output import migrate_confirm
|
|
12
14
|
from ragx.core.config import CONFIG_FILE, Config
|
|
13
15
|
|
|
@@ -103,6 +105,39 @@ def test_init_yes_skips_prompts(tmp_path):
|
|
|
103
105
|
assert data["embeddings"]["provider"] == "openai"
|
|
104
106
|
|
|
105
107
|
|
|
108
|
+
def test_version_outside_corpus(tmp_path, monkeypatch):
|
|
109
|
+
monkeypatch.chdir(tmp_path)
|
|
110
|
+
result = runner.invoke(app, ["--version"])
|
|
111
|
+
assert result.exit_code == 0
|
|
112
|
+
assert f"ragx-cli {metadata.version('ragx-cli')}" in result.stdout
|
|
113
|
+
assert REPO_URL in result.stdout
|
|
114
|
+
assert "config:" not in result.stdout
|
|
115
|
+
assert "global:" not in result.stdout
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def test_version_shows_local_models_and_rc(tmp_path, monkeypatch):
|
|
119
|
+
runner.invoke(app, ["init", str(tmp_path)])
|
|
120
|
+
monkeypatch.chdir(tmp_path)
|
|
121
|
+
(Path.home() / ".ragxrc").write_text('[embeddings]\nmodel = "rc-model"\n')
|
|
122
|
+
|
|
123
|
+
result = runner.invoke(app, ["--version"])
|
|
124
|
+
assert result.exit_code == 0
|
|
125
|
+
assert str(tmp_path / CONFIG_FILE) in result.stdout
|
|
126
|
+
# effective view: the rc override wins over the corpus value
|
|
127
|
+
assert "embeddings: openai/rc-model" in result.stdout
|
|
128
|
+
assert "rerank: sentence-transformers/BAAI/bge-reranker-v2-m3" in result.stdout
|
|
129
|
+
assert "embeddings.model = rc-model" in result.stdout
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def test_version_marks_disabled_stages(tmp_path, monkeypatch):
|
|
133
|
+
runner.invoke(app, ["init", str(tmp_path)])
|
|
134
|
+
monkeypatch.chdir(tmp_path)
|
|
135
|
+
runner.invoke(app, ["config", "set", "expansion.enabled", "false"])
|
|
136
|
+
|
|
137
|
+
result = runner.invoke(app, ["--version"])
|
|
138
|
+
assert "expansion: openai/qwen3.5-9b (disabled)" in result.stdout
|
|
139
|
+
|
|
140
|
+
|
|
106
141
|
def test_config_get_set_roundtrip(tmp_path, monkeypatch):
|
|
107
142
|
runner.invoke(app, ["init", str(tmp_path)])
|
|
108
143
|
monkeypatch.chdir(tmp_path)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|