runledger-cli 0.1.4__tar.gz → 0.1.6__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.
- runledger_cli-0.1.6/LICENSE +23 -0
- runledger_cli-0.1.6/PKG-INFO +126 -0
- runledger_cli-0.1.6/README.md +114 -0
- {runledger_cli-0.1.4 → runledger_cli-0.1.6}/cli/ledger.py +3 -3
- {runledger_cli-0.1.4 → runledger_cli-0.1.6}/pyproject.toml +5 -1
- runledger_cli-0.1.6/runledger_cli.egg-info/PKG-INFO +126 -0
- {runledger_cli-0.1.4 → runledger_cli-0.1.6}/runledger_cli.egg-info/SOURCES.txt +1 -0
- runledger_cli-0.1.4/PKG-INFO +0 -90
- runledger_cli-0.1.4/README.md +0 -81
- runledger_cli-0.1.4/runledger_cli.egg-info/PKG-INFO +0 -90
- {runledger_cli-0.1.4 → runledger_cli-0.1.6}/cli/__init__.py +0 -0
- {runledger_cli-0.1.4 → runledger_cli-0.1.6}/cli/docker-compose.yml +0 -0
- {runledger_cli-0.1.4 → runledger_cli-0.1.6}/cli/guided.py +0 -0
- {runledger_cli-0.1.4 → runledger_cli-0.1.6}/cli/tests/__init__.py +0 -0
- {runledger_cli-0.1.4 → runledger_cli-0.1.6}/cli/tests/test_data_features.py +0 -0
- {runledger_cli-0.1.4 → runledger_cli-0.1.6}/cli/tests/test_integration.py +0 -0
- {runledger_cli-0.1.4 → runledger_cli-0.1.6}/cli/tests/test_ledger.py +0 -0
- {runledger_cli-0.1.4 → runledger_cli-0.1.6}/cli/tests/test_real_results.py +0 -0
- {runledger_cli-0.1.4 → runledger_cli-0.1.6}/runledger_cli.egg-info/dependency_links.txt +0 -0
- {runledger_cli-0.1.4 → runledger_cli-0.1.6}/runledger_cli.egg-info/entry_points.txt +0 -0
- {runledger_cli-0.1.4 → runledger_cli-0.1.6}/runledger_cli.egg-info/requires.txt +0 -0
- {runledger_cli-0.1.4 → runledger_cli-0.1.6}/runledger_cli.egg-info/top_level.txt +0 -0
- {runledger_cli-0.1.4 → runledger_cli-0.1.6}/setup.cfg +0 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
@"
|
|
2
|
+
MIT License
|
|
3
|
+
|
|
4
|
+
Copyright (c) $(Get-Date -Format "yyyy") [Ahmed Rafat]
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
SOFTWARE.
|
|
23
|
+
"@ | Out-File -FilePath LICENSE -Encoding utf8
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: runledger-cli
|
|
3
|
+
Version: 0.1.6
|
|
4
|
+
Summary: Zero‑instrumentation experiment registry CLI
|
|
5
|
+
Project-URL: Repository, https://github.com/ahmedrafatcse/run-ledger
|
|
6
|
+
Requires-Python: >=3.10
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Requires-Dist: requests
|
|
10
|
+
Requires-Dist: rich
|
|
11
|
+
Dynamic: license-file
|
|
12
|
+
|
|
13
|
+
# RunLedger
|
|
14
|
+
|
|
15
|
+
[](https://pypi.org/project/runledger-cli/)
|
|
16
|
+
[](https://hub.docker.com/r/ahmedrafatdev/runledger)
|
|
17
|
+
[](LICENSE)
|
|
18
|
+
|
|
19
|
+
**A zero‑instrumentation experiment registry.**
|
|
20
|
+
Point RunLedger at a folder of JSON experiment files and search, filter, aggregate, diff, and export the results — no SDK, no code changes, no cloud.
|
|
21
|
+
|
|
22
|
+
Most experiment trackers make you instrument your training code before they can help you. RunLedger reads the JSON you're already writing (no `wandb.init()`, no `mlflow.log_metric()`) and indexes it in real PostgreSQL, giving you full relational search: structured comparisons, full‑text, fuzzy matching, and exact array‑element lookups, from one CLI command.
|
|
23
|
+
|
|
24
|
+
Backed by Postgres, served by a Spring Boot API, fronted by a Python CLI.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Install
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
pip install runledger-cli
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**You need Docker** — the only required dependency beyond Python. The backend (Postgres + the Java API) runs entirely inside Docker containers. `runledger` starts and stops them automatically; you never touch a database, a server, or a config file. If Docker isn't installed, the CLI detects that on first run and links you straight to the installer.
|
|
35
|
+
|
|
36
|
+
### Troubleshooting: command not found
|
|
37
|
+
|
|
38
|
+
<details>
|
|
39
|
+
<summary>Windows – `runledger` not recognized</summary>
|
|
40
|
+
|
|
41
|
+
On some Windows systems the Python Scripts folder is not automatically added to PATH. Two options:
|
|
42
|
+
|
|
43
|
+
1. **Add the Scripts folder to PATH permanently** (recommended):
|
|
44
|
+
- Find the install location: `pip show runledger-cli | findstr Location`
|
|
45
|
+
- Navigate to that folder, then up one level to the `Scripts` directory.
|
|
46
|
+
- Add that `Scripts` path to your system PATH via **System Properties > Environment Variables**.
|
|
47
|
+
- Restart your terminal.
|
|
48
|
+
|
|
49
|
+
2. **Use the Python module fallback** (works immediately, no PATH changes):
|
|
50
|
+
```bash
|
|
51
|
+
python -m cli.ledger
|
|
52
|
+
```
|
|
53
|
+
All subcommands and the guided wizard work exactly the same way.
|
|
54
|
+
|
|
55
|
+
Once PATH is configured, `runledger` works as shown in the examples below.
|
|
56
|
+
</details>
|
|
57
|
+
|
|
58
|
+
<details>
|
|
59
|
+
<summary>Fedora / RHEL – Backend can't reach PostgreSQL (UnknownHostException)</summary>
|
|
60
|
+
|
|
61
|
+
Fedora's `firewalld` can block Docker's internal bridge networking, causing the app container to fail DNS resolution for `postgres`. Fix:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
sudo firewall-cmd --zone=trusted --add-interface=docker0 --permanent
|
|
65
|
+
sudo firewall-cmd --reload
|
|
66
|
+
sudo systemctl restart docker
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Then try `runledger guided` again. If you still see a port conflict (`port is already allocated`), check if another process is using port 5432 (`sudo ss -tulpn | grep 5432`) and either stop it or change the host port mapping in the CLI's compose file.
|
|
70
|
+
</details>
|
|
71
|
+
|
|
72
|
+
<details>
|
|
73
|
+
<summary>Installing from source</summary>
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
git clone https://github.com/ahmedrafatcse/run-ledger.git
|
|
77
|
+
cd run-ledger
|
|
78
|
+
docker compose up -d
|
|
79
|
+
pip install -e .
|
|
80
|
+
```
|
|
81
|
+
</details>
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Quick start
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
runledger scan ~/experiments --batch my-sweep
|
|
89
|
+
runledger search --metric accuracy --op gt --value 0.9 --batch my-sweep
|
|
90
|
+
runledger aggregate --metric accuracy --agg AVG --group-by experiment --batch my-sweep
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
New here? Run `runledger` with no arguments, the guided wizard walks you through your first scan and search.
|
|
94
|
+
|
|
95
|
+
> **Tip:** you can also use `python -m cli.ledger` interchangeably with `runledger` on any platform.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Features
|
|
100
|
+
|
|
101
|
+
- **Search any field, no schema required** — structured comparisons (`gt`, `lt`, `eq`…), full‑text with stemming, and fuzzy matching for typos, all on arbitrary dot‑paths, including fields nested inside arrays (`results[].sst2_cacc`).
|
|
102
|
+
- **Compound AND/OR** across multiple conditions in one query.
|
|
103
|
+
- **Exact match pointers** — array searches tell you exactly which element(s) matched (`results[3].sst2_cacc = 0.933`), not just that the run did.
|
|
104
|
+
- **Aggregates & group‑by** — `AVG` / `MAX` / `MIN` / `SUM` / `COUNT`, straight from the CLI.
|
|
105
|
+
- **Safe re‑scanning** — ingestion is idempotent; a changed file gets a new version, and `diff --history` shows you what changed and when.
|
|
106
|
+
- **Run diff, saved searches, JSONL ingestion, block‑depth control** — see [docs/examples.md](docs/examples.md) for each in action.
|
|
107
|
+
- **Self‑hosted, local‑first** — your data never leaves your machine.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Metric paths
|
|
112
|
+
|
|
113
|
+
Address any value with a dot‑path — `accuracy`, `metrics.loss`, `results[].sst2_cacc`. Shorthand (`cacc`) resolves automatically when unambiguous. Run `runledger metrics --batch <batch>` to see everything discovered in a scan, or add `--verbose` for full paths.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Docs
|
|
118
|
+
|
|
119
|
+
- [API reference](docs/api.md)
|
|
120
|
+
- [Usage examples](docs/examples.md)
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## License
|
|
125
|
+
|
|
126
|
+
MIT
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# RunLedger
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/runledger-cli/)
|
|
4
|
+
[](https://hub.docker.com/r/ahmedrafatdev/runledger)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
7
|
+
**A zero‑instrumentation experiment registry.**
|
|
8
|
+
Point RunLedger at a folder of JSON experiment files and search, filter, aggregate, diff, and export the results — no SDK, no code changes, no cloud.
|
|
9
|
+
|
|
10
|
+
Most experiment trackers make you instrument your training code before they can help you. RunLedger reads the JSON you're already writing (no `wandb.init()`, no `mlflow.log_metric()`) and indexes it in real PostgreSQL, giving you full relational search: structured comparisons, full‑text, fuzzy matching, and exact array‑element lookups, from one CLI command.
|
|
11
|
+
|
|
12
|
+
Backed by Postgres, served by a Spring Boot API, fronted by a Python CLI.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
pip install runledger-cli
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**You need Docker** — the only required dependency beyond Python. The backend (Postgres + the Java API) runs entirely inside Docker containers. `runledger` starts and stops them automatically; you never touch a database, a server, or a config file. If Docker isn't installed, the CLI detects that on first run and links you straight to the installer.
|
|
23
|
+
|
|
24
|
+
### Troubleshooting: command not found
|
|
25
|
+
|
|
26
|
+
<details>
|
|
27
|
+
<summary>Windows – `runledger` not recognized</summary>
|
|
28
|
+
|
|
29
|
+
On some Windows systems the Python Scripts folder is not automatically added to PATH. Two options:
|
|
30
|
+
|
|
31
|
+
1. **Add the Scripts folder to PATH permanently** (recommended):
|
|
32
|
+
- Find the install location: `pip show runledger-cli | findstr Location`
|
|
33
|
+
- Navigate to that folder, then up one level to the `Scripts` directory.
|
|
34
|
+
- Add that `Scripts` path to your system PATH via **System Properties > Environment Variables**.
|
|
35
|
+
- Restart your terminal.
|
|
36
|
+
|
|
37
|
+
2. **Use the Python module fallback** (works immediately, no PATH changes):
|
|
38
|
+
```bash
|
|
39
|
+
python -m cli.ledger
|
|
40
|
+
```
|
|
41
|
+
All subcommands and the guided wizard work exactly the same way.
|
|
42
|
+
|
|
43
|
+
Once PATH is configured, `runledger` works as shown in the examples below.
|
|
44
|
+
</details>
|
|
45
|
+
|
|
46
|
+
<details>
|
|
47
|
+
<summary>Fedora / RHEL – Backend can't reach PostgreSQL (UnknownHostException)</summary>
|
|
48
|
+
|
|
49
|
+
Fedora's `firewalld` can block Docker's internal bridge networking, causing the app container to fail DNS resolution for `postgres`. Fix:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
sudo firewall-cmd --zone=trusted --add-interface=docker0 --permanent
|
|
53
|
+
sudo firewall-cmd --reload
|
|
54
|
+
sudo systemctl restart docker
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Then try `runledger guided` again. If you still see a port conflict (`port is already allocated`), check if another process is using port 5432 (`sudo ss -tulpn | grep 5432`) and either stop it or change the host port mapping in the CLI's compose file.
|
|
58
|
+
</details>
|
|
59
|
+
|
|
60
|
+
<details>
|
|
61
|
+
<summary>Installing from source</summary>
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
git clone https://github.com/ahmedrafatcse/run-ledger.git
|
|
65
|
+
cd run-ledger
|
|
66
|
+
docker compose up -d
|
|
67
|
+
pip install -e .
|
|
68
|
+
```
|
|
69
|
+
</details>
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Quick start
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
runledger scan ~/experiments --batch my-sweep
|
|
77
|
+
runledger search --metric accuracy --op gt --value 0.9 --batch my-sweep
|
|
78
|
+
runledger aggregate --metric accuracy --agg AVG --group-by experiment --batch my-sweep
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
New here? Run `runledger` with no arguments, the guided wizard walks you through your first scan and search.
|
|
82
|
+
|
|
83
|
+
> **Tip:** you can also use `python -m cli.ledger` interchangeably with `runledger` on any platform.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Features
|
|
88
|
+
|
|
89
|
+
- **Search any field, no schema required** — structured comparisons (`gt`, `lt`, `eq`…), full‑text with stemming, and fuzzy matching for typos, all on arbitrary dot‑paths, including fields nested inside arrays (`results[].sst2_cacc`).
|
|
90
|
+
- **Compound AND/OR** across multiple conditions in one query.
|
|
91
|
+
- **Exact match pointers** — array searches tell you exactly which element(s) matched (`results[3].sst2_cacc = 0.933`), not just that the run did.
|
|
92
|
+
- **Aggregates & group‑by** — `AVG` / `MAX` / `MIN` / `SUM` / `COUNT`, straight from the CLI.
|
|
93
|
+
- **Safe re‑scanning** — ingestion is idempotent; a changed file gets a new version, and `diff --history` shows you what changed and when.
|
|
94
|
+
- **Run diff, saved searches, JSONL ingestion, block‑depth control** — see [docs/examples.md](docs/examples.md) for each in action.
|
|
95
|
+
- **Self‑hosted, local‑first** — your data never leaves your machine.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Metric paths
|
|
100
|
+
|
|
101
|
+
Address any value with a dot‑path — `accuracy`, `metrics.loss`, `results[].sst2_cacc`. Shorthand (`cacc`) resolves automatically when unambiguous. Run `runledger metrics --batch <batch>` to see everything discovered in a scan, or add `--verbose` for full paths.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Docs
|
|
106
|
+
|
|
107
|
+
- [API reference](docs/api.md)
|
|
108
|
+
- [Usage examples](docs/examples.md)
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## License
|
|
113
|
+
|
|
114
|
+
MIT
|
|
@@ -59,7 +59,7 @@ console = Console()
|
|
|
59
59
|
# Helpers
|
|
60
60
|
# ------------------------------------------------------------
|
|
61
61
|
def check_docker():
|
|
62
|
-
result = subprocess.run("docker version",
|
|
62
|
+
result = subprocess.run(["docker", "version"],
|
|
63
63
|
capture_output=True, text=True)
|
|
64
64
|
if result.returncode != 0:
|
|
65
65
|
console.print("[bold red]Docker is not installed or not reachable.[/bold red]")
|
|
@@ -94,7 +94,7 @@ def start_backend():
|
|
|
94
94
|
console.print("Starting RunLedger backend...")
|
|
95
95
|
subprocess.run(
|
|
96
96
|
["docker", "compose", "-f", compose_file, "-p", "runledger", "up", "-d"],
|
|
97
|
-
|
|
97
|
+
check=True
|
|
98
98
|
)
|
|
99
99
|
if wait_for_backend():
|
|
100
100
|
console.print("[green]RunLedger backend is running.[/green]")
|
|
@@ -107,7 +107,7 @@ def stop_backend():
|
|
|
107
107
|
if os.path.exists(compose_file):
|
|
108
108
|
subprocess.run(
|
|
109
109
|
["docker", "compose", "-f", compose_file, "-p", "runledger", "down"],
|
|
110
|
-
|
|
110
|
+
check=True
|
|
111
111
|
)
|
|
112
112
|
console.print("RunLedger backend stopped.")
|
|
113
113
|
else:
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "runledger-cli"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.6"
|
|
8
8
|
description = "Zero‑instrumentation experiment registry CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -12,6 +12,10 @@ dependencies = [
|
|
|
12
12
|
"requests",
|
|
13
13
|
"rich",
|
|
14
14
|
]
|
|
15
|
+
|
|
16
|
+
[project.urls]
|
|
17
|
+
Repository = "https://github.com/ahmedrafatcse/run-ledger"
|
|
18
|
+
|
|
15
19
|
[project.scripts]
|
|
16
20
|
runledger = "cli.ledger:main"
|
|
17
21
|
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: runledger-cli
|
|
3
|
+
Version: 0.1.6
|
|
4
|
+
Summary: Zero‑instrumentation experiment registry CLI
|
|
5
|
+
Project-URL: Repository, https://github.com/ahmedrafatcse/run-ledger
|
|
6
|
+
Requires-Python: >=3.10
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Requires-Dist: requests
|
|
10
|
+
Requires-Dist: rich
|
|
11
|
+
Dynamic: license-file
|
|
12
|
+
|
|
13
|
+
# RunLedger
|
|
14
|
+
|
|
15
|
+
[](https://pypi.org/project/runledger-cli/)
|
|
16
|
+
[](https://hub.docker.com/r/ahmedrafatdev/runledger)
|
|
17
|
+
[](LICENSE)
|
|
18
|
+
|
|
19
|
+
**A zero‑instrumentation experiment registry.**
|
|
20
|
+
Point RunLedger at a folder of JSON experiment files and search, filter, aggregate, diff, and export the results — no SDK, no code changes, no cloud.
|
|
21
|
+
|
|
22
|
+
Most experiment trackers make you instrument your training code before they can help you. RunLedger reads the JSON you're already writing (no `wandb.init()`, no `mlflow.log_metric()`) and indexes it in real PostgreSQL, giving you full relational search: structured comparisons, full‑text, fuzzy matching, and exact array‑element lookups, from one CLI command.
|
|
23
|
+
|
|
24
|
+
Backed by Postgres, served by a Spring Boot API, fronted by a Python CLI.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Install
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
pip install runledger-cli
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**You need Docker** — the only required dependency beyond Python. The backend (Postgres + the Java API) runs entirely inside Docker containers. `runledger` starts and stops them automatically; you never touch a database, a server, or a config file. If Docker isn't installed, the CLI detects that on first run and links you straight to the installer.
|
|
35
|
+
|
|
36
|
+
### Troubleshooting: command not found
|
|
37
|
+
|
|
38
|
+
<details>
|
|
39
|
+
<summary>Windows – `runledger` not recognized</summary>
|
|
40
|
+
|
|
41
|
+
On some Windows systems the Python Scripts folder is not automatically added to PATH. Two options:
|
|
42
|
+
|
|
43
|
+
1. **Add the Scripts folder to PATH permanently** (recommended):
|
|
44
|
+
- Find the install location: `pip show runledger-cli | findstr Location`
|
|
45
|
+
- Navigate to that folder, then up one level to the `Scripts` directory.
|
|
46
|
+
- Add that `Scripts` path to your system PATH via **System Properties > Environment Variables**.
|
|
47
|
+
- Restart your terminal.
|
|
48
|
+
|
|
49
|
+
2. **Use the Python module fallback** (works immediately, no PATH changes):
|
|
50
|
+
```bash
|
|
51
|
+
python -m cli.ledger
|
|
52
|
+
```
|
|
53
|
+
All subcommands and the guided wizard work exactly the same way.
|
|
54
|
+
|
|
55
|
+
Once PATH is configured, `runledger` works as shown in the examples below.
|
|
56
|
+
</details>
|
|
57
|
+
|
|
58
|
+
<details>
|
|
59
|
+
<summary>Fedora / RHEL – Backend can't reach PostgreSQL (UnknownHostException)</summary>
|
|
60
|
+
|
|
61
|
+
Fedora's `firewalld` can block Docker's internal bridge networking, causing the app container to fail DNS resolution for `postgres`. Fix:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
sudo firewall-cmd --zone=trusted --add-interface=docker0 --permanent
|
|
65
|
+
sudo firewall-cmd --reload
|
|
66
|
+
sudo systemctl restart docker
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Then try `runledger guided` again. If you still see a port conflict (`port is already allocated`), check if another process is using port 5432 (`sudo ss -tulpn | grep 5432`) and either stop it or change the host port mapping in the CLI's compose file.
|
|
70
|
+
</details>
|
|
71
|
+
|
|
72
|
+
<details>
|
|
73
|
+
<summary>Installing from source</summary>
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
git clone https://github.com/ahmedrafatcse/run-ledger.git
|
|
77
|
+
cd run-ledger
|
|
78
|
+
docker compose up -d
|
|
79
|
+
pip install -e .
|
|
80
|
+
```
|
|
81
|
+
</details>
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Quick start
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
runledger scan ~/experiments --batch my-sweep
|
|
89
|
+
runledger search --metric accuracy --op gt --value 0.9 --batch my-sweep
|
|
90
|
+
runledger aggregate --metric accuracy --agg AVG --group-by experiment --batch my-sweep
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
New here? Run `runledger` with no arguments, the guided wizard walks you through your first scan and search.
|
|
94
|
+
|
|
95
|
+
> **Tip:** you can also use `python -m cli.ledger` interchangeably with `runledger` on any platform.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Features
|
|
100
|
+
|
|
101
|
+
- **Search any field, no schema required** — structured comparisons (`gt`, `lt`, `eq`…), full‑text with stemming, and fuzzy matching for typos, all on arbitrary dot‑paths, including fields nested inside arrays (`results[].sst2_cacc`).
|
|
102
|
+
- **Compound AND/OR** across multiple conditions in one query.
|
|
103
|
+
- **Exact match pointers** — array searches tell you exactly which element(s) matched (`results[3].sst2_cacc = 0.933`), not just that the run did.
|
|
104
|
+
- **Aggregates & group‑by** — `AVG` / `MAX` / `MIN` / `SUM` / `COUNT`, straight from the CLI.
|
|
105
|
+
- **Safe re‑scanning** — ingestion is idempotent; a changed file gets a new version, and `diff --history` shows you what changed and when.
|
|
106
|
+
- **Run diff, saved searches, JSONL ingestion, block‑depth control** — see [docs/examples.md](docs/examples.md) for each in action.
|
|
107
|
+
- **Self‑hosted, local‑first** — your data never leaves your machine.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Metric paths
|
|
112
|
+
|
|
113
|
+
Address any value with a dot‑path — `accuracy`, `metrics.loss`, `results[].sst2_cacc`. Shorthand (`cacc`) resolves automatically when unambiguous. Run `runledger metrics --batch <batch>` to see everything discovered in a scan, or add `--verbose` for full paths.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Docs
|
|
118
|
+
|
|
119
|
+
- [API reference](docs/api.md)
|
|
120
|
+
- [Usage examples](docs/examples.md)
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## License
|
|
125
|
+
|
|
126
|
+
MIT
|
runledger_cli-0.1.4/PKG-INFO
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: runledger-cli
|
|
3
|
-
Version: 0.1.4
|
|
4
|
-
Summary: Zero‑instrumentation experiment registry CLI
|
|
5
|
-
Requires-Python: >=3.10
|
|
6
|
-
Description-Content-Type: text/markdown
|
|
7
|
-
Requires-Dist: requests
|
|
8
|
-
Requires-Dist: rich
|
|
9
|
-
|
|
10
|
-
Here’s the updated README with the troubleshooting note added right after the installation instructions. The primary command remains `runledger`, but users who hit the Windows PATH issue now have a clear fallback.
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# RunLedger
|
|
15
|
-
|
|
16
|
-
**A zero-instrumentation experiment registry.** Point RunLedger at a folder of JSON experiment files and search, filter, aggregate, diff, and export the results; no SDK, no code changes, no cloud.
|
|
17
|
-
|
|
18
|
-
Most experiment trackers make you instrument your training code before they can help you. RunLedger reads the JSON you're already writing, no `wandb.init()`, no `mlflow.log_metric()`, and indexes it in real Postgres, giving you full relational search: structured comparisons, full-text, fuzzy matching, and exact array-element lookups, from one CLI command.
|
|
19
|
-
|
|
20
|
-
Backed by Postgres, served by a Spring Boot API, and fronted by a Python CLI.
|
|
21
|
-
|
|
22
|
-
## Install
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
pip install runledger-cli
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
Requires Docker. If it's not installed, `runledger` detects that on first run and links you straight to the installer; everything else (Postgres, the backend) is managed for you.
|
|
29
|
-
|
|
30
|
-
### Troubleshooting: `runledger` command not found (Windows)
|
|
31
|
-
|
|
32
|
-
On some Windows systems, the Python Scripts folder is not automatically added to your PATH. If `runledger` is not recognized after installation, you have two options:
|
|
33
|
-
|
|
34
|
-
1. **Add the Scripts folder to your PATH permanently** (recommended):
|
|
35
|
-
- Find where `runledger` was installed: `pip show runledger-cli | findstr Location`
|
|
36
|
-
- Navigate to that folder, then up one level to the `Scripts` directory.
|
|
37
|
-
- Add that `Scripts` path to your system PATH via **System Properties > Environment Variables**.
|
|
38
|
-
- Restart your terminal.
|
|
39
|
-
|
|
40
|
-
2. **Use the Python module fallback** (works immediately, no PATH changes):
|
|
41
|
-
```bash
|
|
42
|
-
python -m cli.ledger
|
|
43
|
-
```
|
|
44
|
-
All subcommands and the guided wizard work exactly the same way; just prefix every command with `python -m cli.ledger`.
|
|
45
|
-
|
|
46
|
-
Once the PATH is configured, `runledger` will work as shown in the examples below.
|
|
47
|
-
|
|
48
|
-
<details>
|
|
49
|
-
<summary>Installing from source</summary>
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
git clone https://github.com/yourusername/run-ledger.git
|
|
53
|
-
cd run-ledger
|
|
54
|
-
docker compose up -d
|
|
55
|
-
pip install -e .
|
|
56
|
-
```
|
|
57
|
-
</details>
|
|
58
|
-
|
|
59
|
-
## Quick start
|
|
60
|
-
|
|
61
|
-
```bash
|
|
62
|
-
runledger scan ~/experiments --batch my-sweep
|
|
63
|
-
runledger search --metric accuracy --op gt --value 0.9 --batch my-sweep
|
|
64
|
-
runledger aggregate --metric accuracy --agg AVG --group-by experiment --batch my-sweep
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
New here? Run `runledger` with no arguments — the guided wizard walks you through your first scan and search.
|
|
68
|
-
|
|
69
|
-
## What you get
|
|
70
|
-
|
|
71
|
-
- **Search any field, no schema required** — structured comparisons (`gt`, `lt`, `eq`...), full-text with stemming, and fuzzy matching for typos, all on arbitrary dot-paths, including fields nested inside arrays (`results[].sst2_cacc`).
|
|
72
|
-
- **Compound AND/OR** across multiple conditions in one query.
|
|
73
|
-
- **Exact match pointers** — array searches tell you exactly which element(s) matched (`results[3].sst2_cacc = 0.933`), not just that the run did.
|
|
74
|
-
- **Aggregates & group-by** — `AVG` / `MAX` / `MIN` / `SUM` / `COUNT`, straight from the CLI.
|
|
75
|
-
- **Safe re-scanning** — ingestion is idempotent; a changed file gets a new version, and `diff --history` shows you what changed and when.
|
|
76
|
-
- **Run diff, saved searches, JSONL ingestion, block-depth control** — see [docs/examples.md](docs/examples.md) for each in action.
|
|
77
|
-
- **Self-hosted, local-first** — your data never leaves your machine.
|
|
78
|
-
|
|
79
|
-
## Metric paths
|
|
80
|
-
|
|
81
|
-
Address any value with a dot-path — `accuracy`, `metrics.loss`, `results[].sst2_cacc`. Shorthand (`cacc`) resolves automatically when it's unambiguous. Run `runledger metrics --batch <batch>` to see everything discovered in a scan, or add `--verbose` for full paths.
|
|
82
|
-
|
|
83
|
-
## Docs
|
|
84
|
-
|
|
85
|
-
- [API reference](docs/api.md)
|
|
86
|
-
- [Usage examples](docs/examples.md)
|
|
87
|
-
|
|
88
|
-
## License
|
|
89
|
-
|
|
90
|
-
MIT
|
runledger_cli-0.1.4/README.md
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
Here’s the updated README with the troubleshooting note added right after the installation instructions. The primary command remains `runledger`, but users who hit the Windows PATH issue now have a clear fallback.
|
|
2
|
-
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# RunLedger
|
|
6
|
-
|
|
7
|
-
**A zero-instrumentation experiment registry.** Point RunLedger at a folder of JSON experiment files and search, filter, aggregate, diff, and export the results; no SDK, no code changes, no cloud.
|
|
8
|
-
|
|
9
|
-
Most experiment trackers make you instrument your training code before they can help you. RunLedger reads the JSON you're already writing, no `wandb.init()`, no `mlflow.log_metric()`, and indexes it in real Postgres, giving you full relational search: structured comparisons, full-text, fuzzy matching, and exact array-element lookups, from one CLI command.
|
|
10
|
-
|
|
11
|
-
Backed by Postgres, served by a Spring Boot API, and fronted by a Python CLI.
|
|
12
|
-
|
|
13
|
-
## Install
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
pip install runledger-cli
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
Requires Docker. If it's not installed, `runledger` detects that on first run and links you straight to the installer; everything else (Postgres, the backend) is managed for you.
|
|
20
|
-
|
|
21
|
-
### Troubleshooting: `runledger` command not found (Windows)
|
|
22
|
-
|
|
23
|
-
On some Windows systems, the Python Scripts folder is not automatically added to your PATH. If `runledger` is not recognized after installation, you have two options:
|
|
24
|
-
|
|
25
|
-
1. **Add the Scripts folder to your PATH permanently** (recommended):
|
|
26
|
-
- Find where `runledger` was installed: `pip show runledger-cli | findstr Location`
|
|
27
|
-
- Navigate to that folder, then up one level to the `Scripts` directory.
|
|
28
|
-
- Add that `Scripts` path to your system PATH via **System Properties > Environment Variables**.
|
|
29
|
-
- Restart your terminal.
|
|
30
|
-
|
|
31
|
-
2. **Use the Python module fallback** (works immediately, no PATH changes):
|
|
32
|
-
```bash
|
|
33
|
-
python -m cli.ledger
|
|
34
|
-
```
|
|
35
|
-
All subcommands and the guided wizard work exactly the same way; just prefix every command with `python -m cli.ledger`.
|
|
36
|
-
|
|
37
|
-
Once the PATH is configured, `runledger` will work as shown in the examples below.
|
|
38
|
-
|
|
39
|
-
<details>
|
|
40
|
-
<summary>Installing from source</summary>
|
|
41
|
-
|
|
42
|
-
```bash
|
|
43
|
-
git clone https://github.com/yourusername/run-ledger.git
|
|
44
|
-
cd run-ledger
|
|
45
|
-
docker compose up -d
|
|
46
|
-
pip install -e .
|
|
47
|
-
```
|
|
48
|
-
</details>
|
|
49
|
-
|
|
50
|
-
## Quick start
|
|
51
|
-
|
|
52
|
-
```bash
|
|
53
|
-
runledger scan ~/experiments --batch my-sweep
|
|
54
|
-
runledger search --metric accuracy --op gt --value 0.9 --batch my-sweep
|
|
55
|
-
runledger aggregate --metric accuracy --agg AVG --group-by experiment --batch my-sweep
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
New here? Run `runledger` with no arguments — the guided wizard walks you through your first scan and search.
|
|
59
|
-
|
|
60
|
-
## What you get
|
|
61
|
-
|
|
62
|
-
- **Search any field, no schema required** — structured comparisons (`gt`, `lt`, `eq`...), full-text with stemming, and fuzzy matching for typos, all on arbitrary dot-paths, including fields nested inside arrays (`results[].sst2_cacc`).
|
|
63
|
-
- **Compound AND/OR** across multiple conditions in one query.
|
|
64
|
-
- **Exact match pointers** — array searches tell you exactly which element(s) matched (`results[3].sst2_cacc = 0.933`), not just that the run did.
|
|
65
|
-
- **Aggregates & group-by** — `AVG` / `MAX` / `MIN` / `SUM` / `COUNT`, straight from the CLI.
|
|
66
|
-
- **Safe re-scanning** — ingestion is idempotent; a changed file gets a new version, and `diff --history` shows you what changed and when.
|
|
67
|
-
- **Run diff, saved searches, JSONL ingestion, block-depth control** — see [docs/examples.md](docs/examples.md) for each in action.
|
|
68
|
-
- **Self-hosted, local-first** — your data never leaves your machine.
|
|
69
|
-
|
|
70
|
-
## Metric paths
|
|
71
|
-
|
|
72
|
-
Address any value with a dot-path — `accuracy`, `metrics.loss`, `results[].sst2_cacc`. Shorthand (`cacc`) resolves automatically when it's unambiguous. Run `runledger metrics --batch <batch>` to see everything discovered in a scan, or add `--verbose` for full paths.
|
|
73
|
-
|
|
74
|
-
## Docs
|
|
75
|
-
|
|
76
|
-
- [API reference](docs/api.md)
|
|
77
|
-
- [Usage examples](docs/examples.md)
|
|
78
|
-
|
|
79
|
-
## License
|
|
80
|
-
|
|
81
|
-
MIT
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: runledger-cli
|
|
3
|
-
Version: 0.1.4
|
|
4
|
-
Summary: Zero‑instrumentation experiment registry CLI
|
|
5
|
-
Requires-Python: >=3.10
|
|
6
|
-
Description-Content-Type: text/markdown
|
|
7
|
-
Requires-Dist: requests
|
|
8
|
-
Requires-Dist: rich
|
|
9
|
-
|
|
10
|
-
Here’s the updated README with the troubleshooting note added right after the installation instructions. The primary command remains `runledger`, but users who hit the Windows PATH issue now have a clear fallback.
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# RunLedger
|
|
15
|
-
|
|
16
|
-
**A zero-instrumentation experiment registry.** Point RunLedger at a folder of JSON experiment files and search, filter, aggregate, diff, and export the results; no SDK, no code changes, no cloud.
|
|
17
|
-
|
|
18
|
-
Most experiment trackers make you instrument your training code before they can help you. RunLedger reads the JSON you're already writing, no `wandb.init()`, no `mlflow.log_metric()`, and indexes it in real Postgres, giving you full relational search: structured comparisons, full-text, fuzzy matching, and exact array-element lookups, from one CLI command.
|
|
19
|
-
|
|
20
|
-
Backed by Postgres, served by a Spring Boot API, and fronted by a Python CLI.
|
|
21
|
-
|
|
22
|
-
## Install
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
pip install runledger-cli
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
Requires Docker. If it's not installed, `runledger` detects that on first run and links you straight to the installer; everything else (Postgres, the backend) is managed for you.
|
|
29
|
-
|
|
30
|
-
### Troubleshooting: `runledger` command not found (Windows)
|
|
31
|
-
|
|
32
|
-
On some Windows systems, the Python Scripts folder is not automatically added to your PATH. If `runledger` is not recognized after installation, you have two options:
|
|
33
|
-
|
|
34
|
-
1. **Add the Scripts folder to your PATH permanently** (recommended):
|
|
35
|
-
- Find where `runledger` was installed: `pip show runledger-cli | findstr Location`
|
|
36
|
-
- Navigate to that folder, then up one level to the `Scripts` directory.
|
|
37
|
-
- Add that `Scripts` path to your system PATH via **System Properties > Environment Variables**.
|
|
38
|
-
- Restart your terminal.
|
|
39
|
-
|
|
40
|
-
2. **Use the Python module fallback** (works immediately, no PATH changes):
|
|
41
|
-
```bash
|
|
42
|
-
python -m cli.ledger
|
|
43
|
-
```
|
|
44
|
-
All subcommands and the guided wizard work exactly the same way; just prefix every command with `python -m cli.ledger`.
|
|
45
|
-
|
|
46
|
-
Once the PATH is configured, `runledger` will work as shown in the examples below.
|
|
47
|
-
|
|
48
|
-
<details>
|
|
49
|
-
<summary>Installing from source</summary>
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
git clone https://github.com/yourusername/run-ledger.git
|
|
53
|
-
cd run-ledger
|
|
54
|
-
docker compose up -d
|
|
55
|
-
pip install -e .
|
|
56
|
-
```
|
|
57
|
-
</details>
|
|
58
|
-
|
|
59
|
-
## Quick start
|
|
60
|
-
|
|
61
|
-
```bash
|
|
62
|
-
runledger scan ~/experiments --batch my-sweep
|
|
63
|
-
runledger search --metric accuracy --op gt --value 0.9 --batch my-sweep
|
|
64
|
-
runledger aggregate --metric accuracy --agg AVG --group-by experiment --batch my-sweep
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
New here? Run `runledger` with no arguments — the guided wizard walks you through your first scan and search.
|
|
68
|
-
|
|
69
|
-
## What you get
|
|
70
|
-
|
|
71
|
-
- **Search any field, no schema required** — structured comparisons (`gt`, `lt`, `eq`...), full-text with stemming, and fuzzy matching for typos, all on arbitrary dot-paths, including fields nested inside arrays (`results[].sst2_cacc`).
|
|
72
|
-
- **Compound AND/OR** across multiple conditions in one query.
|
|
73
|
-
- **Exact match pointers** — array searches tell you exactly which element(s) matched (`results[3].sst2_cacc = 0.933`), not just that the run did.
|
|
74
|
-
- **Aggregates & group-by** — `AVG` / `MAX` / `MIN` / `SUM` / `COUNT`, straight from the CLI.
|
|
75
|
-
- **Safe re-scanning** — ingestion is idempotent; a changed file gets a new version, and `diff --history` shows you what changed and when.
|
|
76
|
-
- **Run diff, saved searches, JSONL ingestion, block-depth control** — see [docs/examples.md](docs/examples.md) for each in action.
|
|
77
|
-
- **Self-hosted, local-first** — your data never leaves your machine.
|
|
78
|
-
|
|
79
|
-
## Metric paths
|
|
80
|
-
|
|
81
|
-
Address any value with a dot-path — `accuracy`, `metrics.loss`, `results[].sst2_cacc`. Shorthand (`cacc`) resolves automatically when it's unambiguous. Run `runledger metrics --batch <batch>` to see everything discovered in a scan, or add `--verbose` for full paths.
|
|
82
|
-
|
|
83
|
-
## Docs
|
|
84
|
-
|
|
85
|
-
- [API reference](docs/api.md)
|
|
86
|
-
- [Usage examples](docs/examples.md)
|
|
87
|
-
|
|
88
|
-
## License
|
|
89
|
-
|
|
90
|
-
MIT
|
|
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
|