methodproof 0.7.3__tar.gz → 0.7.5__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 (65) hide show
  1. {methodproof-0.7.3 → methodproof-0.7.5}/PKG-INFO +32 -7
  2. {methodproof-0.7.3 → methodproof-0.7.5}/README.md +31 -6
  3. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/__init__.py +1 -1
  4. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/cli.py +48 -5
  5. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/config.py +13 -3
  6. {methodproof-0.7.3 → methodproof-0.7.5}/pyproject.toml +1 -1
  7. {methodproof-0.7.3 → methodproof-0.7.5}/.github/workflows/ci.yml +0 -0
  8. {methodproof-0.7.3 → methodproof-0.7.5}/.gitignore +0 -0
  9. {methodproof-0.7.3 → methodproof-0.7.5}/CHANGELOG.md +0 -0
  10. {methodproof-0.7.3 → methodproof-0.7.5}/LICENSE +0 -0
  11. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/__main__.py +0 -0
  12. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/_daemon.py +0 -0
  13. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/agents/__init__.py +0 -0
  14. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/agents/base.py +0 -0
  15. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/agents/music.py +0 -0
  16. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/agents/terminal.py +0 -0
  17. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/agents/watcher.py +0 -0
  18. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/analysis.py +0 -0
  19. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/binding.py +0 -0
  20. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/bip39.py +0 -0
  21. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/bridge.py +0 -0
  22. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/crypto.py +0 -0
  23. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/e2e.py +0 -0
  24. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/graph.py +0 -0
  25. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/hook.py +0 -0
  26. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/hooks/__init__.py +0 -0
  27. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/hooks/claude_code.py +0 -0
  28. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/hooks/claude_code.sh +0 -0
  29. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/hooks/cline_hook.sh +0 -0
  30. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/hooks/codex_hook.sh +0 -0
  31. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/hooks/gemini_hook.sh +0 -0
  32. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/hooks/install.py +0 -0
  33. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/hooks/kiro_hook.sh +0 -0
  34. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/hooks/mcp_register.py +0 -0
  35. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/hooks/openclaw/HOOK.md +0 -0
  36. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/hooks/openclaw/handler.ts +0 -0
  37. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/hooks/openclaw_install.py +0 -0
  38. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/hooks/opencode_plugin.js +0 -0
  39. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/hooks/wrappers.py +0 -0
  40. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/integrity.py +0 -0
  41. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/kdf.py +0 -0
  42. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/keychain.py +0 -0
  43. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/live.py +0 -0
  44. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/lock.py +0 -0
  45. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/mcp.py +0 -0
  46. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/migrate_db.py +0 -0
  47. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/proxy.py +0 -0
  48. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/proxy_daemon.py +0 -0
  49. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/repos.py +0 -0
  50. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/skills/methodproof/SKILL.md +0 -0
  51. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/store.py +0 -0
  52. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/sync.py +0 -0
  53. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/viewer.py +0 -0
  54. {methodproof-0.7.3 → methodproof-0.7.5}/methodproof/wordlist.py +0 -0
  55. {methodproof-0.7.3 → methodproof-0.7.5}/test_windows_compat.py +0 -0
  56. {methodproof-0.7.3 → methodproof-0.7.5}/tests/__init__.py +0 -0
  57. {methodproof-0.7.3 → methodproof-0.7.5}/tests/test_analysis.py +0 -0
  58. {methodproof-0.7.3 → methodproof-0.7.5}/tests/test_graph.py +0 -0
  59. {methodproof-0.7.3 → methodproof-0.7.5}/tests/test_hooks.py +0 -0
  60. {methodproof-0.7.3 → methodproof-0.7.5}/tests/test_live.py +0 -0
  61. {methodproof-0.7.3 → methodproof-0.7.5}/tests/test_openclaw_hooks.py +0 -0
  62. {methodproof-0.7.3 → methodproof-0.7.5}/tests/test_security.py +0 -0
  63. {methodproof-0.7.3 → methodproof-0.7.5}/tests/test_store.py +0 -0
  64. {methodproof-0.7.3 → methodproof-0.7.5}/tests/test_wrappers.py +0 -0
  65. {methodproof-0.7.3 → methodproof-0.7.5}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: methodproof
3
- Version: 0.7.3
3
+ Version: 0.7.5
4
4
  Summary: See how you code. Capture and visualize your engineering process.
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE
@@ -153,18 +153,24 @@ flowchart TB
153
153
  | Command | What it does |
154
154
  |---------|-------------|
155
155
  | `init` | Interactive consent selector, install hooks, create data directory |
156
- | `start [--dir .] [--tags t1,t2] [--public] [--live]` | Start recording |
156
+ | `start [--dir .] [--tags t1,t2] [--public] [--live] [--journal] [--e2e]` | Start recording |
157
157
  | `stop` | Stop recording, build process graph |
158
158
  | `view [session_id]` | Open session graph in browser |
159
159
  | `log` | List sessions with sync status, visibility, tags |
160
- | `login` | Authenticate with the platform |
161
- | `push [session_id]` | Upload session |
162
- | `publish [session_id]` | Set public + push |
160
+ | `login [--api-url URL]` | Authenticate with the platform |
161
+ | `push [session_id] [--local]` | Upload session (`--local` targets localhost:8000) |
162
+ | `publish [session_id] [--anonymous]` | Set public + push (redaction applied) |
163
163
  | `tag <session_id> <tags>` | Add tags |
164
164
  | `delete <session_id> [-f]` | Delete session and all its data |
165
- | `consent` | Change capture categories |
165
+ | `consent` | Change capture, research, and redaction settings |
166
166
  | `review` | Inspect session data before pushing |
167
- | `update` | Check for and install CLI updates |
167
+ | `journal on/off/status` | Toggle journal mode (full content capture) |
168
+ | `e2e on/off/status/recover/release` | Manage personal E2E encryption keys |
169
+ | `extension pair/status/install` | Browser extension pairing |
170
+ | `proxy start/stop/status/cert` | Local AI API proxy (deep capture) |
171
+ | `update [--auto/--no-auto]` | Check for and install CLI updates |
172
+ | `lock [--purge]` | Destroy local encryption key (recoverable) |
173
+ | `uninstall [--keep-sessions]` | Remove all hooks, data, and config |
168
174
 
169
175
  ## Privacy & Consent
170
176
 
@@ -307,6 +313,25 @@ methodproof start
307
313
 
308
314
  **Git commits** are detected automatically — only commits in a git repo rooted at (or above) the watch directory are captured.
309
315
 
316
+ ## Local Development
317
+
318
+ Push sessions to a local API for testing:
319
+
320
+ ```bash
321
+ # One-time: login to your local API
322
+ mp login --api-url http://localhost:8000
323
+
324
+ # Push with --local flag (overrides stored URL for this command)
325
+ mp push --local
326
+
327
+ # Or set the env var (works with any command)
328
+ METHODPROOF_API_URL=http://localhost:8000 mp push
329
+ ```
330
+
331
+ `--local` is a shorthand for `http://localhost:8000`. It does not clobber your production token — it only overrides the API URL for that invocation.
332
+
333
+ You still need a valid JWT from the local API. Run `mp login --api-url http://localhost:8000` once to authenticate against your local platform.
334
+
310
335
  ## Data Directory
311
336
 
312
337
  `~/.methodproof/`
@@ -138,18 +138,24 @@ flowchart TB
138
138
  | Command | What it does |
139
139
  |---------|-------------|
140
140
  | `init` | Interactive consent selector, install hooks, create data directory |
141
- | `start [--dir .] [--tags t1,t2] [--public] [--live]` | Start recording |
141
+ | `start [--dir .] [--tags t1,t2] [--public] [--live] [--journal] [--e2e]` | Start recording |
142
142
  | `stop` | Stop recording, build process graph |
143
143
  | `view [session_id]` | Open session graph in browser |
144
144
  | `log` | List sessions with sync status, visibility, tags |
145
- | `login` | Authenticate with the platform |
146
- | `push [session_id]` | Upload session |
147
- | `publish [session_id]` | Set public + push |
145
+ | `login [--api-url URL]` | Authenticate with the platform |
146
+ | `push [session_id] [--local]` | Upload session (`--local` targets localhost:8000) |
147
+ | `publish [session_id] [--anonymous]` | Set public + push (redaction applied) |
148
148
  | `tag <session_id> <tags>` | Add tags |
149
149
  | `delete <session_id> [-f]` | Delete session and all its data |
150
- | `consent` | Change capture categories |
150
+ | `consent` | Change capture, research, and redaction settings |
151
151
  | `review` | Inspect session data before pushing |
152
- | `update` | Check for and install CLI updates |
152
+ | `journal on/off/status` | Toggle journal mode (full content capture) |
153
+ | `e2e on/off/status/recover/release` | Manage personal E2E encryption keys |
154
+ | `extension pair/status/install` | Browser extension pairing |
155
+ | `proxy start/stop/status/cert` | Local AI API proxy (deep capture) |
156
+ | `update [--auto/--no-auto]` | Check for and install CLI updates |
157
+ | `lock [--purge]` | Destroy local encryption key (recoverable) |
158
+ | `uninstall [--keep-sessions]` | Remove all hooks, data, and config |
153
159
 
154
160
  ## Privacy & Consent
155
161
 
@@ -292,6 +298,25 @@ methodproof start
292
298
 
293
299
  **Git commits** are detected automatically — only commits in a git repo rooted at (or above) the watch directory are captured.
294
300
 
301
+ ## Local Development
302
+
303
+ Push sessions to a local API for testing:
304
+
305
+ ```bash
306
+ # One-time: login to your local API
307
+ mp login --api-url http://localhost:8000
308
+
309
+ # Push with --local flag (overrides stored URL for this command)
310
+ mp push --local
311
+
312
+ # Or set the env var (works with any command)
313
+ METHODPROOF_API_URL=http://localhost:8000 mp push
314
+ ```
315
+
316
+ `--local` is a shorthand for `http://localhost:8000`. It does not clobber your production token — it only overrides the API URL for that invocation.
317
+
318
+ You still need a valid JWT from the local API. Run `mp login --api-url http://localhost:8000` once to authenticate against your local platform.
319
+
295
320
  ## Data Directory
296
321
 
297
322
  `~/.methodproof/`
@@ -1,3 +1,3 @@
1
1
  """MethodProof — see how you code."""
2
2
 
3
- __version__ = "0.7.3"
3
+ __version__ = "0.7.5"
@@ -466,6 +466,7 @@ def _print_commands() -> None:
466
466
  print(f" {_G}mp start --live{R} Stream your graph privately (only you can view)")
467
467
  print(f" {_G}mp start --live-public{R} Stream your graph publicly (shareable link)")
468
468
  print(f" {_G}mp start --journal{R} Full content capture (2 free credits, then Pro)")
469
+ print(f" {_G}mp start --e2e{R} Encrypt session with your personal key {_D}(Pro){R}")
469
470
  print(f" {_G}mp journal on{R} Enable persistent journal mode")
470
471
  print(f" {_G}mp journal status{R} Check journal mode and remaining credits")
471
472
  print()
@@ -476,15 +477,29 @@ def _print_commands() -> None:
476
477
  print()
477
478
  print(f" {_W}SHARE{R}")
478
479
  print(f" {_Y}mp push{R} {_D}[id]{R} Upload privately to your account")
480
+ print(f" {_Y}mp push --local{R} Push to local dev API {_D}(localhost:8000){R}")
479
481
  print(f" {_Y}mp publish{R} {_D}[id]{R} Make session public (redaction applied)")
480
482
  print(f" {_Y}mp publish --anonymous{R} Public but identity hidden {_D}(Pro){R}")
481
483
  print(f" {_Y}mp tag{R} {_D}<id> <tags>{R} Tag a session")
482
484
  print()
485
+ print(f" {_W}ENCRYPTION{R}")
486
+ print(f" {_C}mp e2e on{R} Enable E2E encryption (generates key on first use)")
487
+ print(f" {_C}mp e2e off{R} Disable E2E mode (key stays in keychain)")
488
+ print(f" {_C}mp e2e status{R} Show E2E mode and key status")
489
+ print(f" {_C}mp e2e recover{R} Recover key from recovery passphrase")
490
+ print(f" {_C}mp e2e release{R} {_D}<id>{R} Release a session from E2E encryption")
491
+ print()
483
492
  print(f" {_W}EXTENSION{R}")
484
493
  print(f" {_C}mp extension pair{R} Pair browser extension to active session")
485
494
  print(f" {_C}mp extension status{R} Check extension connection")
486
495
  print(f" {_C}mp extension install{R} Open Chrome Web Store")
487
496
  print()
497
+ print(f" {_W}PROXY{R}")
498
+ print(f" {_C}mp proxy start{R} Start local AI API proxy {_D}(deep capture){R}")
499
+ print(f" {_C}mp proxy stop{R} Stop proxy")
500
+ print(f" {_C}mp proxy status{R} Show proxy status")
501
+ print(f" {_C}mp proxy cert{R} CA certificate install instructions")
502
+ print()
488
503
  print(f" {_W}ACCOUNT{R}")
489
504
  print(f" {_M}mp login{R} Connect to platform (opens browser)")
490
505
  print(f" {_M}mp consent{R} Change capture, research, and redaction settings")
@@ -497,6 +512,9 @@ def _print_commands() -> None:
497
512
  print(f" {_M}mp update --no-auto{R} Toggle auto-update off")
498
513
  print(f" {_M}mp uninstall{R} Remove all hooks, data, and config")
499
514
  print()
515
+ print(f" {_W}ENVIRONMENT{R}")
516
+ print(f" {_D}METHODPROOF_API_URL{R} Override API endpoint {_D}(e.g. http://localhost:8000){R}")
517
+ print()
500
518
  print(f" {_D}To view this at any time run: mp help{R}\n")
501
519
 
502
520
 
@@ -504,7 +522,12 @@ def _print_commands_plain() -> None:
504
522
  print(" RECORD")
505
523
  print(" mp start Start recording a session")
506
524
  print(" mp stop Stop recording, build process graph")
507
- print(" mp start --live Stream your graph in real time")
525
+ print(" mp start --live Stream your graph privately")
526
+ print(" mp start --live-public Stream your graph publicly (shareable link)")
527
+ print(" mp start --journal Full content capture (2 free credits, then Pro)")
528
+ print(" mp start --e2e Encrypt session with your personal key (Pro)")
529
+ print(" mp journal on Enable persistent journal mode")
530
+ print(" mp journal status Check journal mode and remaining credits")
508
531
  print()
509
532
  print(" REVIEW")
510
533
  print(" mp view [id] View session graph in browser")
@@ -513,15 +536,29 @@ def _print_commands_plain() -> None:
513
536
  print()
514
537
  print(" SHARE")
515
538
  print(" mp push [id] Upload privately to your account")
539
+ print(" mp push --local Push to local dev API (localhost:8000)")
516
540
  print(" mp publish [id] Make session public (redaction applied)")
517
541
  print(" mp publish --anonymous Public but identity hidden (Pro)")
518
542
  print(" mp tag <id> <tags> Tag a session")
519
543
  print()
544
+ print(" ENCRYPTION")
545
+ print(" mp e2e on Enable E2E encryption (generates key on first use)")
546
+ print(" mp e2e off Disable E2E mode (key stays in keychain)")
547
+ print(" mp e2e status Show E2E mode and key status")
548
+ print(" mp e2e recover Recover key from recovery passphrase")
549
+ print(" mp e2e release <id> Release a session from E2E encryption")
550
+ print()
520
551
  print(" EXTENSION")
521
552
  print(" mp extension pair Pair browser extension to active session")
522
553
  print(" mp extension status Check extension connection")
523
554
  print(" mp extension install Open Chrome Web Store")
524
555
  print()
556
+ print(" PROXY")
557
+ print(" mp proxy start Start local AI API proxy (deep capture)")
558
+ print(" mp proxy stop Stop proxy")
559
+ print(" mp proxy status Show proxy status")
560
+ print(" mp proxy cert CA certificate install instructions")
561
+ print()
525
562
  print(" ACCOUNT")
526
563
  print(" mp login Connect to platform (opens browser)")
527
564
  print(" mp consent Change capture, research, and redaction settings")
@@ -534,6 +571,9 @@ def _print_commands_plain() -> None:
534
571
  print(" mp update --no-auto Toggle auto-update off")
535
572
  print(" mp uninstall Remove all hooks, data, and config")
536
573
  print()
574
+ print(" ENVIRONMENT")
575
+ print(" METHODPROOF_API_URL Override API endpoint (e.g. http://localhost:8000)")
576
+ print()
537
577
  print(" To view this at any time run: mp help\n")
538
578
 
539
579
 
@@ -1329,13 +1369,15 @@ def cmd_login(args: argparse.Namespace) -> None:
1329
1369
 
1330
1370
 
1331
1371
  def cmd_push(args: argparse.Namespace) -> None:
1332
- cfg = config.load()
1372
+ local = getattr(args, "local", False)
1373
+ cfg = config.load(local=local)
1333
1374
  if not cfg.get("token"):
1334
- print("Run `methodproof login` first.")
1375
+ target = "local API" if local else "platform"
1376
+ print(f"Run `methodproof login{' --api-url http://localhost:8000' if local else ''}` first.")
1335
1377
  sys.exit(1)
1336
1378
  from methodproof.sync import sync_research_consent
1337
1379
  sync_research_consent(cfg["token"], cfg["api_url"])
1338
- cfg = config.load()
1380
+ cfg = config.load(local=local)
1339
1381
  sid = args.session_id or _latest()
1340
1382
  if not sid:
1341
1383
  print("No sessions to push.")
@@ -1343,7 +1385,7 @@ def cmd_push(args: argparse.Namespace) -> None:
1343
1385
  from methodproof.sync import push
1344
1386
  remote_id = push(sid, cfg["token"], cfg["api_url"])
1345
1387
  app = _app_url(cfg["api_url"])
1346
- print(f"Pushed {sid[:8]} (private).")
1388
+ print(f"Pushed {sid[:8]} → {cfg['api_url']} (private).")
1347
1389
  print(f" View: {app}/personal/sessions/{remote_id}")
1348
1390
  print(f" Publish: mp publish {sid[:8]}")
1349
1391
 
@@ -1744,6 +1786,7 @@ def main() -> None:
1744
1786
  sub.add_parser("logout", help="Clear login credentials (keeps consent and sessions)")
1745
1787
  pu = sub.add_parser("push", help="Upload privately to your account")
1746
1788
  pu.add_argument("session_id", nargs="?")
1789
+ pu.add_argument("--local", action="store_true", help="Push to local dev API (localhost:8000)")
1747
1790
  tg = sub.add_parser("tag", help="Tag a session")
1748
1791
  tg.add_argument("session_id", help="Session ID (prefix ok)")
1749
1792
  tg.add_argument("tags", help="Comma-separated tags")
@@ -134,10 +134,20 @@ def secure_file(path: Path) -> None:
134
134
  path.chmod(0o600)
135
135
 
136
136
 
137
- def load() -> dict[str, Any]:
137
+ LOCAL_API_URL = "http://localhost:8000"
138
+
139
+
140
+ def load(local: bool = False) -> dict[str, Any]:
138
141
  if not CONFIG.exists():
139
- return dict(_DEFAULTS)
140
- return {**_DEFAULTS, **json.loads(CONFIG.read_text())}
142
+ cfg = dict(_DEFAULTS)
143
+ else:
144
+ cfg = {**_DEFAULTS, **json.loads(CONFIG.read_text())}
145
+ env_url = os.environ.get("METHODPROOF_API_URL")
146
+ if local:
147
+ cfg["api_url"] = LOCAL_API_URL
148
+ elif env_url:
149
+ cfg["api_url"] = env_url
150
+ return cfg
141
151
 
142
152
 
143
153
  def save(cfg: dict[str, Any]) -> None:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "methodproof"
3
- version = "0.7.3"
3
+ version = "0.7.5"
4
4
  description = "See how you code. Capture and visualize your engineering process."
5
5
  requires-python = ">=3.11"
6
6
  dependencies = ["watchdog>=4.0", "websocket-client>=1.7", "cryptography>=43.0", "keyring>=25.0"]
File without changes
File without changes
File without changes
File without changes