methodproof 0.7.6__tar.gz → 0.7.7__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.6 → methodproof-0.7.7}/PKG-INFO +1 -1
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/__init__.py +1 -1
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/cli.py +86 -1
- {methodproof-0.7.6 → methodproof-0.7.7}/pyproject.toml +1 -1
- {methodproof-0.7.6 → methodproof-0.7.7}/.github/workflows/ci.yml +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/.gitignore +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/CHANGELOG.md +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/LICENSE +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/README.md +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/__main__.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/_daemon.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/agents/__init__.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/agents/base.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/agents/music.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/agents/terminal.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/agents/watcher.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/analysis.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/binding.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/bip39.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/bridge.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/config.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/crypto.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/e2e.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/graph.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/hook.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/hooks/__init__.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/hooks/claude_code.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/hooks/claude_code.sh +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/hooks/cline_hook.sh +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/hooks/codex_hook.sh +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/hooks/gemini_hook.sh +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/hooks/install.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/hooks/kiro_hook.sh +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/hooks/mcp_register.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/hooks/openclaw/HOOK.md +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/hooks/openclaw/handler.ts +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/hooks/openclaw_install.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/hooks/opencode_plugin.js +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/hooks/wrappers.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/integrity.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/kdf.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/keychain.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/live.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/lock.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/mcp.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/migrate_db.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/proxy.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/proxy_daemon.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/repos.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/skills/methodproof/SKILL.md +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/store.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/sync.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/viewer.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/methodproof/wordlist.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/test_windows_compat.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/tests/__init__.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/tests/test_analysis.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/tests/test_graph.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/tests/test_hooks.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/tests/test_live.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/tests/test_openclaw_hooks.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/tests/test_security.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/tests/test_store.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/tests/test_wrappers.py +0 -0
- {methodproof-0.7.6 → methodproof-0.7.7}/uv.lock +0 -0
|
@@ -1293,6 +1293,89 @@ def cmd_log(args: argparse.Namespace) -> None:
|
|
|
1293
1293
|
print(f" {s['id'][:8]} {dt} {dur} {s['total_events']} events{suffix}")
|
|
1294
1294
|
|
|
1295
1295
|
|
|
1296
|
+
def cmd_status(args: argparse.Namespace) -> None:
|
|
1297
|
+
"""Show auth, session, and config status at a glance."""
|
|
1298
|
+
from methodproof import __version__
|
|
1299
|
+
cfg = config.load()
|
|
1300
|
+
token = cfg.get("token", "")
|
|
1301
|
+
claims = _decode_jwt_claims(token) if token else {}
|
|
1302
|
+
sessions = store.list_sessions()
|
|
1303
|
+
active = cfg.get("active_session")
|
|
1304
|
+
capture = cfg.get("capture", {})
|
|
1305
|
+
enabled = [k for k, v in capture.items() if v]
|
|
1306
|
+
|
|
1307
|
+
print(f"\n methodproof v{__version__}")
|
|
1308
|
+
print(f" api: {cfg.get('api_url', '—')}\n")
|
|
1309
|
+
|
|
1310
|
+
# Auth
|
|
1311
|
+
if not token:
|
|
1312
|
+
print(" auth: not signed in")
|
|
1313
|
+
else:
|
|
1314
|
+
account_id = claims.get("user_id", "—")
|
|
1315
|
+
role = claims.get("role", "—")
|
|
1316
|
+
acct_type = claims.get("account_type", "—")
|
|
1317
|
+
exp = claims.get("exp", 0)
|
|
1318
|
+
if exp and time.time() > exp:
|
|
1319
|
+
expiry = "expired"
|
|
1320
|
+
elif exp:
|
|
1321
|
+
remaining = int(exp - time.time())
|
|
1322
|
+
hours = remaining // 3600
|
|
1323
|
+
mins = (remaining % 3600) // 60
|
|
1324
|
+
expiry = f"{hours}h {mins}m remaining"
|
|
1325
|
+
else:
|
|
1326
|
+
expiry = "unknown"
|
|
1327
|
+
print(f" auth: signed in")
|
|
1328
|
+
print(f" account: {account_id[:8]}...{account_id[-4:]}")
|
|
1329
|
+
print(f" role: {role} | type: {acct_type} | token: {expiry}")
|
|
1330
|
+
if claims.get("is_superadmin"):
|
|
1331
|
+
print(" superadmin: yes")
|
|
1332
|
+
|
|
1333
|
+
# Session
|
|
1334
|
+
print()
|
|
1335
|
+
if active:
|
|
1336
|
+
sess = store.get_session(active)
|
|
1337
|
+
if sess:
|
|
1338
|
+
dt = datetime.fromtimestamp(sess["created_at"], tz=UTC).strftime("%H:%M")
|
|
1339
|
+
print(f" session: RECORDING {active[:8]} started {dt} ({sess['total_events']} events)")
|
|
1340
|
+
else:
|
|
1341
|
+
print(f" session: RECORDING {active[:8]}")
|
|
1342
|
+
else:
|
|
1343
|
+
print(" session: idle")
|
|
1344
|
+
|
|
1345
|
+
# Local sessions
|
|
1346
|
+
total = len(sessions)
|
|
1347
|
+
unsynced = len([s for s in sessions if not s["synced"] and s.get("completed_at") and s["total_events"] > 0])
|
|
1348
|
+
print(f" local: {total} session{'s' if total != 1 else ''}", end="")
|
|
1349
|
+
if unsynced:
|
|
1350
|
+
print(f" ({unsynced} unsynced)")
|
|
1351
|
+
else:
|
|
1352
|
+
print()
|
|
1353
|
+
|
|
1354
|
+
# Capture config
|
|
1355
|
+
print(f"\n consent: {len(enabled)}/11 categories")
|
|
1356
|
+
full_spectrum = len(enabled) >= 10
|
|
1357
|
+
if full_spectrum:
|
|
1358
|
+
print(" spectrum: FULL")
|
|
1359
|
+
|
|
1360
|
+
# Modes
|
|
1361
|
+
modes = []
|
|
1362
|
+
if cfg.get("journal_mode"):
|
|
1363
|
+
credits = cfg.get("journal_credits", 0)
|
|
1364
|
+
modes.append(f"journal ({credits} credits)")
|
|
1365
|
+
if cfg.get("e2e_mode"):
|
|
1366
|
+
fp = cfg.get("e2e_fingerprint", "")
|
|
1367
|
+
modes.append(f"e2e ({fp[:8]})" if fp else "e2e")
|
|
1368
|
+
if modes:
|
|
1369
|
+
print(f" modes: {' | '.join(modes)}")
|
|
1370
|
+
|
|
1371
|
+
# Research
|
|
1372
|
+
if cfg.get("research_consent"):
|
|
1373
|
+
level = cfg.get("contribution_level", "structural")
|
|
1374
|
+
print(f" research: opted in ({level})")
|
|
1375
|
+
|
|
1376
|
+
print()
|
|
1377
|
+
|
|
1378
|
+
|
|
1296
1379
|
def cmd_logout(args: argparse.Namespace) -> None:
|
|
1297
1380
|
"""Clear login credentials only. Keeps consent, sessions, and hooks."""
|
|
1298
1381
|
cfg = config.load()
|
|
@@ -1779,6 +1862,7 @@ def main() -> None:
|
|
|
1779
1862
|
v = sub.add_parser("view", help="Inspect captured session data")
|
|
1780
1863
|
v.add_argument("session_id", nargs="?")
|
|
1781
1864
|
sub.add_parser("log", help="List sessions")
|
|
1865
|
+
sub.add_parser("status", help="Auth, session, and config status")
|
|
1782
1866
|
l = sub.add_parser("login", help="Connect to platform")
|
|
1783
1867
|
l.add_argument("--api-url")
|
|
1784
1868
|
l.add_argument("--force", "-f", action="store_true", help="Skip switch-account prompt")
|
|
@@ -1843,7 +1927,8 @@ def main() -> None:
|
|
|
1843
1927
|
args = p.parse_args()
|
|
1844
1928
|
cmds = {
|
|
1845
1929
|
"init": cmd_init, "start": cmd_start, "stop": cmd_stop,
|
|
1846
|
-
"view": cmd_view, "log": cmd_log, "
|
|
1930
|
+
"view": cmd_view, "log": cmd_log, "status": cmd_status,
|
|
1931
|
+
"login": cmd_login, "logout": cmd_logout,
|
|
1847
1932
|
"push": cmd_push, "tag": cmd_tag, "publish": cmd_publish,
|
|
1848
1933
|
"delete": cmd_delete, "review": cmd_review, "consent": cmd_consent,
|
|
1849
1934
|
"update": cmd_update, "lock": cmd_lock, "reset": cmd_reset, "uninstall": cmd_uninstall,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "methodproof"
|
|
3
|
-
version = "0.7.
|
|
3
|
+
version = "0.7.7"
|
|
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
|
|
File without changes
|