methodproof 0.7.2__tar.gz → 0.7.4__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.2 → methodproof-0.7.4}/PKG-INFO +1 -1
  2. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/__init__.py +1 -1
  3. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/cli.py +15 -7
  4. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/config.py +13 -3
  5. {methodproof-0.7.2 → methodproof-0.7.4}/pyproject.toml +1 -1
  6. {methodproof-0.7.2 → methodproof-0.7.4}/.github/workflows/ci.yml +0 -0
  7. {methodproof-0.7.2 → methodproof-0.7.4}/.gitignore +0 -0
  8. {methodproof-0.7.2 → methodproof-0.7.4}/CHANGELOG.md +0 -0
  9. {methodproof-0.7.2 → methodproof-0.7.4}/LICENSE +0 -0
  10. {methodproof-0.7.2 → methodproof-0.7.4}/README.md +0 -0
  11. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/__main__.py +0 -0
  12. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/_daemon.py +0 -0
  13. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/agents/__init__.py +0 -0
  14. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/agents/base.py +0 -0
  15. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/agents/music.py +0 -0
  16. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/agents/terminal.py +0 -0
  17. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/agents/watcher.py +0 -0
  18. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/analysis.py +0 -0
  19. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/binding.py +0 -0
  20. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/bip39.py +0 -0
  21. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/bridge.py +0 -0
  22. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/crypto.py +0 -0
  23. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/e2e.py +0 -0
  24. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/graph.py +0 -0
  25. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hook.py +0 -0
  26. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/__init__.py +0 -0
  27. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/claude_code.py +0 -0
  28. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/claude_code.sh +0 -0
  29. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/cline_hook.sh +0 -0
  30. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/codex_hook.sh +0 -0
  31. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/gemini_hook.sh +0 -0
  32. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/install.py +0 -0
  33. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/kiro_hook.sh +0 -0
  34. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/mcp_register.py +0 -0
  35. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/openclaw/HOOK.md +0 -0
  36. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/openclaw/handler.ts +0 -0
  37. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/openclaw_install.py +0 -0
  38. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/opencode_plugin.js +0 -0
  39. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/wrappers.py +0 -0
  40. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/integrity.py +0 -0
  41. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/kdf.py +0 -0
  42. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/keychain.py +0 -0
  43. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/live.py +0 -0
  44. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/lock.py +0 -0
  45. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/mcp.py +0 -0
  46. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/migrate_db.py +0 -0
  47. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/proxy.py +0 -0
  48. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/proxy_daemon.py +0 -0
  49. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/repos.py +0 -0
  50. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/skills/methodproof/SKILL.md +0 -0
  51. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/store.py +0 -0
  52. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/sync.py +0 -0
  53. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/viewer.py +0 -0
  54. {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/wordlist.py +0 -0
  55. {methodproof-0.7.2 → methodproof-0.7.4}/test_windows_compat.py +0 -0
  56. {methodproof-0.7.2 → methodproof-0.7.4}/tests/__init__.py +0 -0
  57. {methodproof-0.7.2 → methodproof-0.7.4}/tests/test_analysis.py +0 -0
  58. {methodproof-0.7.2 → methodproof-0.7.4}/tests/test_graph.py +0 -0
  59. {methodproof-0.7.2 → methodproof-0.7.4}/tests/test_hooks.py +0 -0
  60. {methodproof-0.7.2 → methodproof-0.7.4}/tests/test_live.py +0 -0
  61. {methodproof-0.7.2 → methodproof-0.7.4}/tests/test_openclaw_hooks.py +0 -0
  62. {methodproof-0.7.2 → methodproof-0.7.4}/tests/test_security.py +0 -0
  63. {methodproof-0.7.2 → methodproof-0.7.4}/tests/test_store.py +0 -0
  64. {methodproof-0.7.2 → methodproof-0.7.4}/tests/test_wrappers.py +0 -0
  65. {methodproof-0.7.2 → methodproof-0.7.4}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: methodproof
3
- Version: 0.7.2
3
+ Version: 0.7.4
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
@@ -1,3 +1,3 @@
1
1
  """MethodProof — see how you code."""
2
2
 
3
- __version__ = "0.7.2"
3
+ __version__ = "0.7.4"
@@ -662,13 +662,15 @@ def cmd_reset(args: argparse.Namespace) -> None:
662
662
  if answer not in ("y", "yes"):
663
663
  print(" Cancelled.")
664
664
  return
665
- for key in ("token", "refresh_token", "email", "e2e_key"):
665
+ for key in ("token", "refresh_token", "email", "e2e_key",
666
+ "account_id", "last_auth_at", "master_key_fingerprint"):
666
667
  cfg[key] = config._DEFAULTS[key]
667
668
  for key in ("capture", "research_consent", "publish_redact", "consent_acknowledged",
668
669
  "journal_mode", "journal_credits", "auto_update", "auto_update_offered"):
669
670
  cfg[key] = config._DEFAULTS.get(key)
670
671
  config.save(cfg)
671
672
  cleared = ["login token", "refresh token", "email", "e2e key",
673
+ "account id", "master key fingerprint",
672
674
  "capture consent", "research consent", "redaction defaults",
673
675
  "journal mode", "auto-update"]
674
676
  print(" Cleared:")
@@ -1259,7 +1261,7 @@ def cmd_logout(args: argparse.Namespace) -> None:
1259
1261
  return
1260
1262
  old_email = cfg.get("email", "")
1261
1263
  old_account = cfg.get("account_id", "")[:8]
1262
- for key in ("token", "refresh_token", "email", "account_id", "last_auth_at"):
1264
+ for key in ("token", "refresh_token", "email", "account_id", "last_auth_at", "master_key_fingerprint"):
1263
1265
  cfg[key] = config._DEFAULTS.get(key, "")
1264
1266
  config.save(cfg)
1265
1267
  label = old_email or old_account or "account"
@@ -1310,9 +1312,11 @@ def cmd_login(args: argparse.Namespace) -> None:
1310
1312
  claims = _decode_jwt_claims(poll["token"])
1311
1313
  cfg["account_id"] = claims.get("user_id", "")
1312
1314
  cfg["last_auth_at"] = time.time()
1315
+ cfg["master_key_fingerprint"] = "" # clear stale fingerprint from previous account
1313
1316
  config.save(cfg)
1314
1317
  print(" done.\n")
1315
- _setup_master_key(cfg)
1318
+ if not getattr(args, "no_key", False):
1319
+ _setup_master_key(cfg)
1316
1320
  from methodproof.sync import sync_research_consent
1317
1321
  sync_research_consent(cfg["token"], cfg["api_url"])
1318
1322
  print("Logged in. Run `methodproof push` to upload sessions.")
@@ -1325,13 +1329,15 @@ def cmd_login(args: argparse.Namespace) -> None:
1325
1329
 
1326
1330
 
1327
1331
  def cmd_push(args: argparse.Namespace) -> None:
1328
- cfg = config.load()
1332
+ local = getattr(args, "local", False)
1333
+ cfg = config.load(local=local)
1329
1334
  if not cfg.get("token"):
1330
- print("Run `methodproof login` first.")
1335
+ target = "local API" if local else "platform"
1336
+ print(f"Run `methodproof login{' --api-url http://localhost:8000' if local else ''}` first.")
1331
1337
  sys.exit(1)
1332
1338
  from methodproof.sync import sync_research_consent
1333
1339
  sync_research_consent(cfg["token"], cfg["api_url"])
1334
- cfg = config.load()
1340
+ cfg = config.load(local=local)
1335
1341
  sid = args.session_id or _latest()
1336
1342
  if not sid:
1337
1343
  print("No sessions to push.")
@@ -1339,7 +1345,7 @@ def cmd_push(args: argparse.Namespace) -> None:
1339
1345
  from methodproof.sync import push
1340
1346
  remote_id = push(sid, cfg["token"], cfg["api_url"])
1341
1347
  app = _app_url(cfg["api_url"])
1342
- print(f"Pushed {sid[:8]} (private).")
1348
+ print(f"Pushed {sid[:8]} → {cfg['api_url']} (private).")
1343
1349
  print(f" View: {app}/personal/sessions/{remote_id}")
1344
1350
  print(f" Publish: mp publish {sid[:8]}")
1345
1351
 
@@ -1736,9 +1742,11 @@ def main() -> None:
1736
1742
  l = sub.add_parser("login", help="Connect to platform")
1737
1743
  l.add_argument("--api-url")
1738
1744
  l.add_argument("--force", "-f", action="store_true", help="Skip switch-account prompt")
1745
+ l.add_argument("--no-key", action="store_true", help="Skip master key generation (test accounts)")
1739
1746
  sub.add_parser("logout", help="Clear login credentials (keeps consent and sessions)")
1740
1747
  pu = sub.add_parser("push", help="Upload privately to your account")
1741
1748
  pu.add_argument("session_id", nargs="?")
1749
+ pu.add_argument("--local", action="store_true", help="Push to local dev API (localhost:8000)")
1742
1750
  tg = sub.add_parser("tag", help="Tag a session")
1743
1751
  tg.add_argument("session_id", help="Session ID (prefix ok)")
1744
1752
  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.2"
3
+ version = "0.7.4"
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
File without changes