methodproof 0.7.33__tar.gz → 0.7.35__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.33 → methodproof-0.7.35}/CHANGELOG.md +22 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/PKG-INFO +24 -1
- {methodproof-0.7.33 → methodproof-0.7.35}/README.md +23 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/cli.py +3 -1
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/store.py +8 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/sync.py +11 -3
- methodproof-0.7.35/methodproof/tui/start.py +748 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/pyproject.toml +1 -1
- methodproof-0.7.33/methodproof/tui/start.py +0 -436
- {methodproof-0.7.33 → methodproof-0.7.35}/.github/workflows/ci.yml +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/.gitignore +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/LICENSE +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/__init__.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/__main__.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/_daemon.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/agents/__init__.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/agents/base.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/agents/music.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/agents/terminal.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/agents/watcher.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/analysis.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/binding.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/bip39.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/bridge.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/config.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/crypto.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/e2e.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/graph.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/hook.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/hooks/__init__.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/hooks/claude_code.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/hooks/claude_code.sh +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/hooks/cline_hook.sh +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/hooks/codex_hook.sh +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/hooks/gemini_hook.sh +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/hooks/install.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/hooks/kiro_hook.sh +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/hooks/mcp_register.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/hooks/openclaw/HOOK.md +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/hooks/openclaw/handler.ts +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/hooks/openclaw_install.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/hooks/opencode_plugin.js +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/hooks/wrappers.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/integrity.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/kdf.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/keychain.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/live.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/lock.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/mcp.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/migrate_db.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/proxy.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/proxy_daemon.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/repos.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/skills/methodproof/SKILL.md +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/tui/__init__.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/tui/consent.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/tui/init.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/tui/log.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/tui/login_success.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/tui/review.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/tui/status.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/tui/theme.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/viewer.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/methodproof/wordlist.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/test_windows_compat.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/__init__.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/conftest.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/test_analysis.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/test_cli_auth.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/test_cli_config.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/test_cli_helpers.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/test_cli_session.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/test_cli_share.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/test_cli_start.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/test_cli_update.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/test_e2e_integration.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/test_graph.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/test_hooks.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/test_live.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/test_openclaw_hooks.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/test_profiles.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/test_security.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/test_store.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/test_sync.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/test_viewer.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/tests/test_wrappers.py +0 -0
- {methodproof-0.7.33 → methodproof-0.7.35}/uv.lock +0 -0
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.7.35] — 2026-04-12
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- **10 TUI controls for `mp start`** — `j` journal toggle, `f` event filter cycle (all/ai_input/ai_output/human/verify), `s` scroll lock, `/` feed search, `tab` sidebar cycle (stats/files/tools), `t` tree collapse (hides chain inners, shows `+N` on closer), `d` timestamp format cycle (clock/relative/elapsed), `c` copy last event to clipboard, `enter` event detail modal, `m` quiet mode (hides dim events). All modes shown as badges in the session bar.
|
|
7
|
+
- **Structural analysis summary on `user_prompt` events** — main line now shows `prompt_summary` from the 35-dimension analysis (e.g. `[instruction/synthesis] refactor auth — DI`) instead of just char count.
|
|
8
|
+
- **Multi-line journal output** — `user_prompt` shows full prompt text wrapped at 100 chars. `agent_complete` shows up to 500 chars / 8 lines preserving natural line breaks. Other event types remain single-line at 120 char cap.
|
|
9
|
+
|
|
10
|
+
## [0.7.34] — 2026-04-12
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- **`mp push` after mid-session push was permanently blocked** — pushing an active session marked it as synced. After stopping, additional events existed locally but could never be uploaded. Now: if a session was pushed while active and is now completed, `mp push` automatically re-pushes the full session. For already-completed sessions, `mp push --force` re-uploads all events.
|
|
14
|
+
|
|
15
|
+
## [0.7.33] — 2026-04-12
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
- **KINMYAKU theme palette**: `Palette` frozen dataclass replaces flat hex constants in `tui/theme.py`. Dark-adjusted colors from METHODPROOF.md spec — purple, green, red, dim all shifted for proper contrast on dark backgrounds. Five semantic roles (`ai_input`, `ai_output`, `human`, `verify`, `moment`) so TUI code reads intent, not hex. Backward-compatible re-exports — all existing imports unchanged.
|
|
19
|
+
- **Rich structural formatting for all 42 event types**: `mp start` feed now shows curated one-liners for every event type. `tool_call` → `Edit app/core/auth.py`, `tool_result` → `Edit ✓`, `agent_launch` → `explorer spawned`, etc. Previously only 8 types had formatters; the rest showed raw key dumps or nothing.
|
|
20
|
+
- **Causal chain tree indentation**: Prompt→tool_call→tool_result chains render with Unicode box-drawing characters (`├`, `│`, `└`) in gold-ember. Non-AI events (file edits, tests, commits) appear at root level. Mirrors the Neo4j graph structure during live capture.
|
|
21
|
+
- **Journal mode content enrichment**: When journal is ON, a second dim line appears below events carrying content fields — truncated prompt text, tool results, diffs. Quoted and indented with a `│` gutter. When journal is OFF, these lines don't exist.
|
|
22
|
+
- **Enriched session bar**: Now shows running event count and a gold `J` badge when journal mode is active.
|
|
23
|
+
- **Moment alert wiring**: `_show_moment()` (previously dead code) now fires when known moment types appear in the event stream.
|
|
24
|
+
|
|
3
25
|
## [0.7.32] — 2026-04-12
|
|
4
26
|
|
|
5
27
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: methodproof
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.35
|
|
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
|
|
@@ -69,6 +69,29 @@ methodproof view # explore your session in the browser
|
|
|
69
69
|
- **Auto-detection** — hooks for shell, Claude Code, OpenClaw, codex, gemini, aider installed automatically
|
|
70
70
|
- **Platform sync** — `methodproof push` uploads sessions. `methodproof publish` makes them public and shareable
|
|
71
71
|
|
|
72
|
+
## Live Session TUI
|
|
73
|
+
|
|
74
|
+
`mp start` launches a rich terminal UI that streams captured events in real-time. Events are color-coded by role (purple = AI input, gold = AI output, cream = human, green = verification) and indented into causal chains with Unicode tree characters.
|
|
75
|
+
|
|
76
|
+
### Controls
|
|
77
|
+
|
|
78
|
+
| Key | Action | Description |
|
|
79
|
+
|-----|--------|-------------|
|
|
80
|
+
| `j` | Journal toggle | Show/hide full content lines (prompts, completions, diffs) mid-session |
|
|
81
|
+
| `f` | Filter cycle | All → AI input → AI output → Human → Verify |
|
|
82
|
+
| `s` | Scroll lock | Freeze scroll position while events buffer; release snaps to bottom |
|
|
83
|
+
| `/` | Search | Filter feed — non-matching lines render dimmed |
|
|
84
|
+
| `tab` | Sidebar cycle | Stats → Recent files → Recent tools |
|
|
85
|
+
| `t` | Tree collapse | Hide chain inners, show `+N` count on closer |
|
|
86
|
+
| `d` | Timestamp format | Clock (`12:34:56`) → Relative (`+1.2s`) → Elapsed (`45.3s`) |
|
|
87
|
+
| `c` | Copy last event | Full JSON metadata to clipboard |
|
|
88
|
+
| `enter` | Event detail | Modal overlay with all metadata fields |
|
|
89
|
+
| `m` | Quiet mode | Hide dim events (music, environment, MCP, context compaction) |
|
|
90
|
+
| `p` | Pause | Pause/resume event polling |
|
|
91
|
+
| `q` | Stop | Stop the session |
|
|
92
|
+
|
|
93
|
+
Active modes display as badges in the session bar: `J` (journal), `⏸` (scroll locked), `Q` (quiet), `T` (tree collapsed), filter name when not "all".
|
|
94
|
+
|
|
72
95
|
## Security Architecture
|
|
73
96
|
|
|
74
97
|
Every event passes through consent gating, encryption, and hash chaining before touching disk. The platform adds a server co-signature on push, creating two-party evidence.
|
|
@@ -52,6 +52,29 @@ methodproof view # explore your session in the browser
|
|
|
52
52
|
- **Auto-detection** — hooks for shell, Claude Code, OpenClaw, codex, gemini, aider installed automatically
|
|
53
53
|
- **Platform sync** — `methodproof push` uploads sessions. `methodproof publish` makes them public and shareable
|
|
54
54
|
|
|
55
|
+
## Live Session TUI
|
|
56
|
+
|
|
57
|
+
`mp start` launches a rich terminal UI that streams captured events in real-time. Events are color-coded by role (purple = AI input, gold = AI output, cream = human, green = verification) and indented into causal chains with Unicode tree characters.
|
|
58
|
+
|
|
59
|
+
### Controls
|
|
60
|
+
|
|
61
|
+
| Key | Action | Description |
|
|
62
|
+
|-----|--------|-------------|
|
|
63
|
+
| `j` | Journal toggle | Show/hide full content lines (prompts, completions, diffs) mid-session |
|
|
64
|
+
| `f` | Filter cycle | All → AI input → AI output → Human → Verify |
|
|
65
|
+
| `s` | Scroll lock | Freeze scroll position while events buffer; release snaps to bottom |
|
|
66
|
+
| `/` | Search | Filter feed — non-matching lines render dimmed |
|
|
67
|
+
| `tab` | Sidebar cycle | Stats → Recent files → Recent tools |
|
|
68
|
+
| `t` | Tree collapse | Hide chain inners, show `+N` count on closer |
|
|
69
|
+
| `d` | Timestamp format | Clock (`12:34:56`) → Relative (`+1.2s`) → Elapsed (`45.3s`) |
|
|
70
|
+
| `c` | Copy last event | Full JSON metadata to clipboard |
|
|
71
|
+
| `enter` | Event detail | Modal overlay with all metadata fields |
|
|
72
|
+
| `m` | Quiet mode | Hide dim events (music, environment, MCP, context compaction) |
|
|
73
|
+
| `p` | Pause | Pause/resume event polling |
|
|
74
|
+
| `q` | Stop | Stop the session |
|
|
75
|
+
|
|
76
|
+
Active modes display as badges in the session bar: `J` (journal), `⏸` (scroll locked), `Q` (quiet), `T` (tree collapsed), filter name when not "all".
|
|
77
|
+
|
|
55
78
|
## Security Architecture
|
|
56
79
|
|
|
57
80
|
Every event passes through consent gating, encryption, and hash chaining before touching disk. The platform adds a server co-signature on push, creating two-party evidence.
|
|
@@ -1793,7 +1793,8 @@ def cmd_push(args: argparse.Namespace) -> None:
|
|
|
1793
1793
|
print("No sessions to push.")
|
|
1794
1794
|
sys.exit(1)
|
|
1795
1795
|
from methodproof.sync import push
|
|
1796
|
-
|
|
1796
|
+
force = getattr(args, "force", False)
|
|
1797
|
+
remote_id = push(sid, cfg["token"], cfg["api_url"], force=force)
|
|
1797
1798
|
app = _app_url(cfg["api_url"])
|
|
1798
1799
|
print(f"Pushed {sid[:8]} → {cfg['api_url']} (private).")
|
|
1799
1800
|
print(f" View: {app}/personal/sessions/{remote_id}")
|
|
@@ -2222,6 +2223,7 @@ def main() -> None:
|
|
|
2222
2223
|
sw.add_argument("account", nargs="?", help="Email or account ID prefix")
|
|
2223
2224
|
pu = sub.add_parser("push", help="Upload privately to your account")
|
|
2224
2225
|
pu.add_argument("session_id", nargs="?")
|
|
2226
|
+
pu.add_argument("--force", "-f", action="store_true", help="Re-upload all events (replaces previous push)")
|
|
2225
2227
|
pu.add_argument("--local", action="store_true", help="Push to local dev API (localhost:8000)")
|
|
2226
2228
|
tg = sub.add_parser("tag", help="Tag a session")
|
|
2227
2229
|
tg.add_argument("session_id", help="Session ID (prefix ok)")
|
|
@@ -389,3 +389,11 @@ def mark_synced(session_id: str, remote_id: str) -> None:
|
|
|
389
389
|
(remote_id, session_id),
|
|
390
390
|
)
|
|
391
391
|
_db().commit()
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
def clear_sync(session_id: str) -> None:
|
|
395
|
+
_db().execute(
|
|
396
|
+
"UPDATE sessions SET synced = 0, remote_id = NULL WHERE id = ?",
|
|
397
|
+
(session_id,),
|
|
398
|
+
)
|
|
399
|
+
_db().commit()
|
|
@@ -84,14 +84,22 @@ def _request(
|
|
|
84
84
|
raise SystemExit(f"API error {exc.code}: {detail}") from None
|
|
85
85
|
|
|
86
86
|
|
|
87
|
-
def push(session_id: str, token: str, api_url: str) -> str:
|
|
87
|
+
def push(session_id: str, token: str, api_url: str, force: bool = False) -> str:
|
|
88
88
|
"""Upload a local session to the platform."""
|
|
89
89
|
session = store.get_session(session_id)
|
|
90
90
|
if not session:
|
|
91
91
|
raise SystemExit(f"Session not found: {session_id}")
|
|
92
92
|
if session["synced"]:
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
if force:
|
|
94
|
+
print(f"Force re-push: {session_id[:8]}")
|
|
95
|
+
store.clear_sync(session_id)
|
|
96
|
+
elif not session.get("completed_at"):
|
|
97
|
+
print(f"Session was pushed while still active — re-pushing complete session.")
|
|
98
|
+
store.clear_sync(session_id)
|
|
99
|
+
else:
|
|
100
|
+
print(f"Already synced: {session_id[:8]}")
|
|
101
|
+
print(f" (Use `mp push --force` to re-upload all events)")
|
|
102
|
+
return session.get("remote_id", "")
|
|
95
103
|
|
|
96
104
|
# Create remote session (include binding + device_id if available)
|
|
97
105
|
print("Creating remote session...", end=" ", flush=True)
|