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.
- {methodproof-0.7.2 → methodproof-0.7.4}/PKG-INFO +1 -1
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/__init__.py +1 -1
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/cli.py +15 -7
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/config.py +13 -3
- {methodproof-0.7.2 → methodproof-0.7.4}/pyproject.toml +1 -1
- {methodproof-0.7.2 → methodproof-0.7.4}/.github/workflows/ci.yml +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/.gitignore +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/CHANGELOG.md +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/LICENSE +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/README.md +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/__main__.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/_daemon.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/agents/__init__.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/agents/base.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/agents/music.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/agents/terminal.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/agents/watcher.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/analysis.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/binding.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/bip39.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/bridge.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/crypto.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/e2e.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/graph.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hook.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/__init__.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/claude_code.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/claude_code.sh +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/cline_hook.sh +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/codex_hook.sh +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/gemini_hook.sh +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/install.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/kiro_hook.sh +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/mcp_register.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/openclaw/HOOK.md +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/openclaw/handler.ts +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/openclaw_install.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/opencode_plugin.js +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/hooks/wrappers.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/integrity.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/kdf.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/keychain.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/live.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/lock.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/mcp.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/migrate_db.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/proxy.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/proxy_daemon.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/repos.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/skills/methodproof/SKILL.md +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/store.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/sync.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/viewer.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/methodproof/wordlist.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/test_windows_compat.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/tests/__init__.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/tests/test_analysis.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/tests/test_graph.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/tests/test_hooks.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/tests/test_live.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/tests/test_openclaw_hooks.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/tests/test_security.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/tests/test_store.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/tests/test_wrappers.py +0 -0
- {methodproof-0.7.2 → methodproof-0.7.4}/uv.lock +0 -0
|
@@ -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
|
-
|
|
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
|
-
|
|
1332
|
+
local = getattr(args, "local", False)
|
|
1333
|
+
cfg = config.load(local=local)
|
|
1329
1334
|
if not cfg.get("token"):
|
|
1330
|
-
|
|
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
|
-
|
|
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
|
-
|
|
140
|
-
|
|
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
|
+
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
|
|
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
|