runledger-cli 0.2.0__tar.gz → 0.2.2__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 (21) hide show
  1. {runledger_cli-0.2.0/runledger_cli.egg-info → runledger_cli-0.2.2}/PKG-INFO +2 -14
  2. {runledger_cli-0.2.0 → runledger_cli-0.2.2}/README.md +1 -13
  3. {runledger_cli-0.2.0 → runledger_cli-0.2.2}/cli/ledger.py +11 -0
  4. {runledger_cli-0.2.0 → runledger_cli-0.2.2}/pyproject.toml +1 -1
  5. {runledger_cli-0.2.0 → runledger_cli-0.2.2/runledger_cli.egg-info}/PKG-INFO +2 -14
  6. {runledger_cli-0.2.0 → runledger_cli-0.2.2}/LICENSE +0 -0
  7. {runledger_cli-0.2.0 → runledger_cli-0.2.2}/cli/__init__.py +0 -0
  8. {runledger_cli-0.2.0 → runledger_cli-0.2.2}/cli/docker-compose.yml +0 -0
  9. {runledger_cli-0.2.0 → runledger_cli-0.2.2}/cli/guided.py +0 -0
  10. {runledger_cli-0.2.0 → runledger_cli-0.2.2}/cli/tests/__init__.py +0 -0
  11. {runledger_cli-0.2.0 → runledger_cli-0.2.2}/cli/tests/conftest.py +0 -0
  12. {runledger_cli-0.2.0 → runledger_cli-0.2.2}/cli/tests/test_data_features.py +0 -0
  13. {runledger_cli-0.2.0 → runledger_cli-0.2.2}/cli/tests/test_integration.py +0 -0
  14. {runledger_cli-0.2.0 → runledger_cli-0.2.2}/cli/tests/test_ledger.py +0 -0
  15. {runledger_cli-0.2.0 → runledger_cli-0.2.2}/cli/tests/test_real_results.py +0 -0
  16. {runledger_cli-0.2.0 → runledger_cli-0.2.2}/runledger_cli.egg-info/SOURCES.txt +0 -0
  17. {runledger_cli-0.2.0 → runledger_cli-0.2.2}/runledger_cli.egg-info/dependency_links.txt +0 -0
  18. {runledger_cli-0.2.0 → runledger_cli-0.2.2}/runledger_cli.egg-info/entry_points.txt +0 -0
  19. {runledger_cli-0.2.0 → runledger_cli-0.2.2}/runledger_cli.egg-info/requires.txt +0 -0
  20. {runledger_cli-0.2.0 → runledger_cli-0.2.2}/runledger_cli.egg-info/top_level.txt +0 -0
  21. {runledger_cli-0.2.0 → runledger_cli-0.2.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: runledger-cli
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary: Self-hosted SQL-style query engine over your team's experiment JSON
5
5
  Author: Ahmed Rafat
6
6
  License: MIT
@@ -208,19 +208,7 @@ Demo users from `demo/seed.sql`:
208
208
  | `bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb` | researcher | Team B |
209
209
  | `cccccccc-cccc-cccc-cccc-cccccccccccc` | supervisor | assigned to both teams |
210
210
 
211
- Visit `http://localhost:8080/login` and paste an ID. For API access, pass the same ID in an `X-User-Id` header. Role and team are looked up server-side — the client cannot declare which team it belongs to, but it *can* declare which user it is, which is exactly why this stub isn't authentication.
212
-
213
- ---
214
-
215
- ## What this doesn't claim yet
216
-
217
- - **Not tamper-evident.** The change-detection check catches a payload modified while its stored fingerprint was left unchanged. It does **not** detect a privileged database actor who rewrites both consistently. Closing that gap requires a hash chain, an independent verifier, and an external anchor. Not built.
218
- - **Not authenticated.** The browser login is a development stub; the API trusts an `X-User-Id` header. Neither substitutes for real authentication in a deployed system. See [Development identity](#development-identity).
219
- - **Not RLS on everything.** Row-Level Security is enabled for `run`, `batch_schema`, and `saved_search`. The identity and team tables (`teams`, `app_users`, `supervisor_team_assignments`) are not RLS-protected — they hold shared configuration and identity data, and access to them is controlled at the application layer.
220
- - **Not a SQL console.** The query interface accepts RunLedger commands (`--metric`, `--op`, `--value`, `--combine`), not arbitrary SQL statements. PostgreSQL is the engine; the query surface is purpose-built.
221
- - **Not multi-tenant.** One deployment serves one organization. There is no cross-organization tenancy, no per-org isolation above the team level, and no managed cloud offering.
222
-
223
- Naming these limits is more useful than rounding up. Each constraint is documented in code and covered by tests, so the scope is visible and changeable.
211
+ Visit `http://localhost:8080/login` and paste an ID. For API access, pass the same ID in an `X-User-Id` header. Role and team are looked up server-side — the client cannot declare which team it belongs to, but it *can* declare which user it is, which is exactly why this stub isn't authentication
224
212
 
225
213
  ---
226
214
 
@@ -180,19 +180,7 @@ Demo users from `demo/seed.sql`:
180
180
  | `bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb` | researcher | Team B |
181
181
  | `cccccccc-cccc-cccc-cccc-cccccccccccc` | supervisor | assigned to both teams |
182
182
 
183
- Visit `http://localhost:8080/login` and paste an ID. For API access, pass the same ID in an `X-User-Id` header. Role and team are looked up server-side — the client cannot declare which team it belongs to, but it *can* declare which user it is, which is exactly why this stub isn't authentication.
184
-
185
- ---
186
-
187
- ## What this doesn't claim yet
188
-
189
- - **Not tamper-evident.** The change-detection check catches a payload modified while its stored fingerprint was left unchanged. It does **not** detect a privileged database actor who rewrites both consistently. Closing that gap requires a hash chain, an independent verifier, and an external anchor. Not built.
190
- - **Not authenticated.** The browser login is a development stub; the API trusts an `X-User-Id` header. Neither substitutes for real authentication in a deployed system. See [Development identity](#development-identity).
191
- - **Not RLS on everything.** Row-Level Security is enabled for `run`, `batch_schema`, and `saved_search`. The identity and team tables (`teams`, `app_users`, `supervisor_team_assignments`) are not RLS-protected — they hold shared configuration and identity data, and access to them is controlled at the application layer.
192
- - **Not a SQL console.** The query interface accepts RunLedger commands (`--metric`, `--op`, `--value`, `--combine`), not arbitrary SQL statements. PostgreSQL is the engine; the query surface is purpose-built.
193
- - **Not multi-tenant.** One deployment serves one organization. There is no cross-organization tenancy, no per-org isolation above the team level, and no managed cloud offering.
194
-
195
- Naming these limits is more useful than rounding up. Each constraint is documented in code and covered by tests, so the scope is visible and changeable.
183
+ Visit `http://localhost:8080/login` and paste an ID. For API access, pass the same ID in an `X-User-Id` header. Role and team are looked up server-side — the client cannot declare which team it belongs to, but it *can* declare which user it is, which is exactly why this stub isn't authentication
196
184
 
197
185
  ---
198
186
 
@@ -1148,6 +1148,17 @@ def cli_aggregate(args):
1148
1148
  # ------------------------------------------------------------
1149
1149
  def main():
1150
1150
  parser = argparse.ArgumentParser(description="RunLedger CLI")
1151
+ try:
1152
+ from importlib.metadata import version as _pkg_version
1153
+ _ver = _pkg_version("runledger-cli")
1154
+ except Exception:
1155
+ _ver = "unknown"
1156
+
1157
+ parser.add_argument(
1158
+ "--version",
1159
+ action="version",
1160
+ version=f"runledger {_ver}",
1161
+ )
1151
1162
  subparsers = parser.add_subparsers(dest="command", help="Command")
1152
1163
 
1153
1164
  # scan
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "runledger-cli"
7
- version = "0.2.0"
7
+ version = "0.2.2"
8
8
  description = "Self-hosted SQL-style query engine over your team's experiment JSON"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: runledger-cli
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary: Self-hosted SQL-style query engine over your team's experiment JSON
5
5
  Author: Ahmed Rafat
6
6
  License: MIT
@@ -208,19 +208,7 @@ Demo users from `demo/seed.sql`:
208
208
  | `bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb` | researcher | Team B |
209
209
  | `cccccccc-cccc-cccc-cccc-cccccccccccc` | supervisor | assigned to both teams |
210
210
 
211
- Visit `http://localhost:8080/login` and paste an ID. For API access, pass the same ID in an `X-User-Id` header. Role and team are looked up server-side — the client cannot declare which team it belongs to, but it *can* declare which user it is, which is exactly why this stub isn't authentication.
212
-
213
- ---
214
-
215
- ## What this doesn't claim yet
216
-
217
- - **Not tamper-evident.** The change-detection check catches a payload modified while its stored fingerprint was left unchanged. It does **not** detect a privileged database actor who rewrites both consistently. Closing that gap requires a hash chain, an independent verifier, and an external anchor. Not built.
218
- - **Not authenticated.** The browser login is a development stub; the API trusts an `X-User-Id` header. Neither substitutes for real authentication in a deployed system. See [Development identity](#development-identity).
219
- - **Not RLS on everything.** Row-Level Security is enabled for `run`, `batch_schema`, and `saved_search`. The identity and team tables (`teams`, `app_users`, `supervisor_team_assignments`) are not RLS-protected — they hold shared configuration and identity data, and access to them is controlled at the application layer.
220
- - **Not a SQL console.** The query interface accepts RunLedger commands (`--metric`, `--op`, `--value`, `--combine`), not arbitrary SQL statements. PostgreSQL is the engine; the query surface is purpose-built.
221
- - **Not multi-tenant.** One deployment serves one organization. There is no cross-organization tenancy, no per-org isolation above the team level, and no managed cloud offering.
222
-
223
- Naming these limits is more useful than rounding up. Each constraint is documented in code and covered by tests, so the scope is visible and changeable.
211
+ Visit `http://localhost:8080/login` and paste an ID. For API access, pass the same ID in an `X-User-Id` header. Role and team are looked up server-side — the client cannot declare which team it belongs to, but it *can* declare which user it is, which is exactly why this stub isn't authentication
224
212
 
225
213
  ---
226
214
 
File without changes
File without changes