methodproof 0.7.36__tar.gz → 0.7.37__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 (86) hide show
  1. {methodproof-0.7.36 → methodproof-0.7.37}/CHANGELOG.md +8 -0
  2. {methodproof-0.7.36 → methodproof-0.7.37}/PKG-INFO +6 -4
  3. {methodproof-0.7.36 → methodproof-0.7.37}/README.md +5 -3
  4. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/agents/base.py +0 -9
  5. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/config.py +4 -14
  6. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/claude_code.py +6 -0
  7. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/claude_code.sh +54 -3
  8. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/tui/start.py +3 -1
  9. {methodproof-0.7.36 → methodproof-0.7.37}/pyproject.toml +1 -1
  10. {methodproof-0.7.36 → methodproof-0.7.37}/.github/workflows/ci.yml +0 -0
  11. {methodproof-0.7.36 → methodproof-0.7.37}/.gitignore +0 -0
  12. {methodproof-0.7.36 → methodproof-0.7.37}/LICENSE +0 -0
  13. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/__init__.py +0 -0
  14. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/__main__.py +0 -0
  15. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/_daemon.py +0 -0
  16. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/agents/__init__.py +0 -0
  17. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/agents/music.py +0 -0
  18. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/agents/terminal.py +0 -0
  19. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/agents/watcher.py +0 -0
  20. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/analysis.py +0 -0
  21. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/binding.py +0 -0
  22. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/bip39.py +0 -0
  23. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/bridge.py +0 -0
  24. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/cli.py +0 -0
  25. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/crypto.py +0 -0
  26. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/e2e.py +0 -0
  27. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/graph.py +0 -0
  28. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hook.py +0 -0
  29. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/__init__.py +0 -0
  30. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/cline_hook.sh +0 -0
  31. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/codex_hook.sh +0 -0
  32. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/gemini_hook.sh +0 -0
  33. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/install.py +0 -0
  34. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/kiro_hook.sh +0 -0
  35. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/mcp_register.py +0 -0
  36. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/openclaw/HOOK.md +0 -0
  37. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/openclaw/handler.ts +0 -0
  38. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/openclaw_install.py +0 -0
  39. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/opencode_plugin.js +0 -0
  40. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/wrappers.py +0 -0
  41. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/integrity.py +0 -0
  42. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/kdf.py +0 -0
  43. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/keychain.py +0 -0
  44. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/live.py +0 -0
  45. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/lock.py +0 -0
  46. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/mcp.py +0 -0
  47. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/migrate_db.py +0 -0
  48. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/proxy.py +0 -0
  49. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/proxy_daemon.py +0 -0
  50. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/repos.py +0 -0
  51. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/skills/methodproof/SKILL.md +0 -0
  52. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/store.py +0 -0
  53. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/sync.py +0 -0
  54. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/tui/__init__.py +0 -0
  55. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/tui/consent.py +0 -0
  56. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/tui/init.py +0 -0
  57. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/tui/log.py +0 -0
  58. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/tui/login_success.py +0 -0
  59. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/tui/review.py +0 -0
  60. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/tui/status.py +0 -0
  61. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/tui/theme.py +0 -0
  62. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/viewer.py +0 -0
  63. {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/wordlist.py +0 -0
  64. {methodproof-0.7.36 → methodproof-0.7.37}/test_windows_compat.py +0 -0
  65. {methodproof-0.7.36 → methodproof-0.7.37}/tests/__init__.py +0 -0
  66. {methodproof-0.7.36 → methodproof-0.7.37}/tests/conftest.py +0 -0
  67. {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_analysis.py +0 -0
  68. {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_cli_auth.py +0 -0
  69. {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_cli_config.py +0 -0
  70. {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_cli_helpers.py +0 -0
  71. {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_cli_session.py +0 -0
  72. {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_cli_share.py +0 -0
  73. {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_cli_start.py +0 -0
  74. {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_cli_update.py +0 -0
  75. {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_e2e_integration.py +0 -0
  76. {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_graph.py +0 -0
  77. {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_hooks.py +0 -0
  78. {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_live.py +0 -0
  79. {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_openclaw_hooks.py +0 -0
  80. {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_profiles.py +0 -0
  81. {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_security.py +0 -0
  82. {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_store.py +0 -0
  83. {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_sync.py +0 -0
  84. {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_viewer.py +0 -0
  85. {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_wrappers.py +0 -0
  86. {methodproof-0.7.36 → methodproof-0.7.37}/uv.lock +0 -0
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.7.37] — 2026-04-12
4
+
5
+ ### Changed
6
+ - **Full tool metadata capture** — shell hook now stores complete `tool_input` and `tool_response` objects alongside display previews. Previously only extracted preview strings; raw data was discarded. Enables upstream graph analysis, causal edge building, and artifact tracking from tool events.
7
+ - **Enriched shell hook** — `PreToolUse` captures `tool_input_preview` per tool type (Bash→command, Read/Edit/Write→file_path, Grep→pattern+path, Glob→pattern, Agent→description). `PostToolUse` captures `result_preview` (Bash→stdout/stderr, Read→line count, Grep→file+line count, Glob→file count) plus `tool_input_preview` so results show what was done.
8
+ - **Journal gating removed** — all captured metadata is now persisted regardless of journal mode. No more field stripping in `emit()`. `JOURNAL_CONTENT_FIELDS` retained as a reference for TUI enrichment display.
9
+ - **`tool_result` TUI shows input + result** — e.g. `Grep ✓ def main /src 3 files, 15 lines` instead of just `Grep ✓`.
10
+
3
11
  ## [0.7.36] — 2026-04-12
4
12
 
5
13
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: methodproof
3
- Version: 0.7.36
3
+ Version: 0.7.37
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
@@ -88,9 +88,10 @@ methodproof view # explore your session in the browser
88
88
  | `enter` | Event detail | Modal overlay with all metadata fields |
89
89
  | `m` | Quiet mode | Hide dim events (music, environment, MCP, context compaction) |
90
90
  | `p` | Pause | Pause/resume event polling |
91
- | `q` | Stop | Stop the session |
91
+ | `q` | Exit TUI | Detach daemon keeps recording. Reconnect with `mp connect` |
92
+ | `x` | End session | Stop recording with confirmation prompt |
92
93
 
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
+ Active modes display as badges in the session bar: `J` (journal), `⏸` (scroll locked), `Q` (quiet), `T` (tree collapsed), filter name when not "all". Source tracking shows which AI tool session (`claude #1`, `codex #2`) generated each event.
94
95
 
95
96
  ## Security Architecture
96
97
 
@@ -178,8 +179,9 @@ flowchart TB
178
179
  | Command | What it does |
179
180
  |---------|-------------|
180
181
  | `init` | Interactive consent selector, install hooks, create data directory |
181
- | `start [--dir .] [--tags t1,t2] [--public] [--live] [--journal] [--e2e]` | Start recording |
182
+ | `start [--dir .] [--tags t1,t2] [--public] [--live] [--journal] [--e2e]` | Start recording (auto-connects if session already active) |
182
183
  | `stop` | Stop recording, build process graph |
184
+ | `connect [session_id]` | Attach TUI to an active session (defaults to current) |
183
185
  | `view [session_id]` | Open session graph in browser |
184
186
  | `log` | List sessions with sync status, visibility, tags |
185
187
  | `login [--api-url URL]` | Authenticate with the platform |
@@ -71,9 +71,10 @@ methodproof view # explore your session in the browser
71
71
  | `enter` | Event detail | Modal overlay with all metadata fields |
72
72
  | `m` | Quiet mode | Hide dim events (music, environment, MCP, context compaction) |
73
73
  | `p` | Pause | Pause/resume event polling |
74
- | `q` | Stop | Stop the session |
74
+ | `q` | Exit TUI | Detach daemon keeps recording. Reconnect with `mp connect` |
75
+ | `x` | End session | Stop recording with confirmation prompt |
75
76
 
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
+ Active modes display as badges in the session bar: `J` (journal), `⏸` (scroll locked), `Q` (quiet), `T` (tree collapsed), filter name when not "all". Source tracking shows which AI tool session (`claude #1`, `codex #2`) generated each event.
77
78
 
78
79
  ## Security Architecture
79
80
 
@@ -161,8 +162,9 @@ flowchart TB
161
162
  | Command | What it does |
162
163
  |---------|-------------|
163
164
  | `init` | Interactive consent selector, install hooks, create data directory |
164
- | `start [--dir .] [--tags t1,t2] [--public] [--live] [--journal] [--e2e]` | Start recording |
165
+ | `start [--dir .] [--tags t1,t2] [--public] [--live] [--journal] [--e2e]` | Start recording (auto-connects if session already active) |
165
166
  | `stop` | Stop recording, build process graph |
167
+ | `connect [session_id]` | Attach TUI to an active session (defaults to current) |
166
168
  | `view [session_id]` | Open session graph in browser |
167
169
  | `log` | List sessions with sync status, visibility, tags |
168
170
  | `login [--api-url URL]` | Authenticate with the platform |
@@ -140,15 +140,6 @@ def emit(event_type: str, metadata: dict[str, Any]) -> None:
140
140
  if event_type == etype and not _capture.get(category, True):
141
141
  metadata.pop(field, None)
142
142
 
143
- # Journal mode gate — strip content fields when journal is OFF (default).
144
- # Structural equivalents (prompt_length, etc.) are always kept.
145
- # Journal ON = complete explicit record. Journal OFF = structural only.
146
- if not _journal_mode:
147
- from methodproof.config import JOURNAL_CONTENT_FIELDS
148
- for etype, field in JOURNAL_CONTENT_FIELDS:
149
- if event_type == etype and field in metadata:
150
- metadata.pop(field, None)
151
-
152
143
  entry = {
153
144
  "id": uuid.uuid4().hex,
154
145
  "session_id": _session_id,
@@ -79,47 +79,37 @@ CAPTURE_DESCRIPTIONS: dict[str, str] = {
79
79
  "code_capture": "Full file diffs and git patches (Pro only, encrypted, private by default)",
80
80
  }
81
81
 
82
- # Content fields that Journal Mode unlocks. When journal_mode is OFF (default),
83
- # these fields are stripped only structural equivalents remain (lengths, counts, types).
84
- # When journal_mode is ON (Pro+), EVERYTHING is persisted and encrypted.
85
- # Journal = the complete, explicit record of the session.
82
+ # Journal content fields no longer gated. All captured metadata is persisted.
83
+ # This list is retained as a reference for the TUI journal enrichment layer,
84
+ # which uses it to identify fields worth displaying as secondary content lines.
86
85
  JOURNAL_CONTENT_FIELDS: list[tuple[str, str]] = [
87
- # AI prompts — full prompt text
88
86
  ("llm_prompt", "prompt_text"),
89
87
  ("agent_prompt", "prompt_preview"),
90
- # AI responses — full completion text
91
88
  ("llm_completion", "response_text"),
92
89
  ("agent_completion", "response_preview"),
93
90
  ("agent_tool_dispatch", "tool_input_preview"),
94
91
  ("agent_tool_result", "result_preview"),
95
92
  ("agent_skill_invoke", "skill_input_preview"),
96
- # Terminal — full command output (command itself is structural, not gated)
97
93
  ("terminal_cmd", "output_snippet"),
98
- # Code — full diffs and commit messages
99
94
  ("file_edit", "diff"),
100
95
  ("git_commit", "diff"),
101
96
  ("git_commit", "message"),
102
- # Web — full search queries, URLs, page titles
97
+ ("git_commit", "body"),
103
98
  ("web_search", "query"),
104
99
  ("web_search", "clicked_results"),
105
100
  ("web_visit", "url"),
106
101
  ("web_visit", "title"),
107
- # Browser — full search queries, URLs, copy content, AI chat input
108
102
  ("browser_search", "query"),
109
103
  ("browser_visit", "url"),
110
104
  ("browser_visit", "title"),
111
105
  ("browser_copy", "text_snippet"),
112
106
  ("browser_ai_chat", "detected_input"),
113
107
  ("browser_ai_chat", "url"),
114
- # Tasks — subject reveals intent
115
108
  ("task_created", "subject"),
116
- # Claude Code hooks — tool input/output and raw user prompt
117
109
  ("user_prompt", "prompt_text"),
118
110
  ("tool_call", "tool_input_preview"),
119
111
  ("tool_result", "result_preview"),
120
- # Agent final message and commit body reveal content
121
112
  ("agent_complete", "last_message_preview"),
122
- ("git_commit", "body"),
123
113
  ]
124
114
 
125
115
 
@@ -99,20 +99,26 @@ _META_EXTRACTORS = {
99
99
  },
100
100
  "PreToolUse": lambda d: {
101
101
  "tool": _TOOL, "tool_name": d.get("tool_name", "unknown"),
102
+ "tool_input": d.get("tool_input") or {},
102
103
  "tool_input_preview": _tool_input_preview(d),
103
104
  },
104
105
  "PostToolUse": lambda d: {
105
106
  "tool": _TOOL, "tool_name": d.get("tool_name", "unknown"), "success": True,
107
+ "tool_input": d.get("tool_input") or {},
108
+ "tool_response": d.get("tool_response") or {},
109
+ "tool_input_preview": _tool_input_preview(d),
106
110
  "result_preview": _extract_result_text(d.get("tool_response")),
107
111
  },
108
112
  "PostToolUseFailure": lambda d: {
109
113
  "tool": _TOOL, "tool_name": d.get("tool_name", "unknown"),
110
114
  "success": False, "is_interrupt": d.get("is_interrupt", False),
115
+ "tool_input": d.get("tool_input") or {},
111
116
  "error": str(d.get("error", ""))[:200],
112
117
  },
113
118
  "SubagentStart": lambda d: {"tool": _TOOL, "agent_type": d.get("agent_type", "unknown"), "agent_id": d.get("agent_id", "")},
114
119
  "SubagentStop": lambda d: {
115
120
  "tool": _TOOL, "agent_type": d.get("agent_type", "unknown"), "agent_id": d.get("agent_id", ""),
121
+ "last_assistant_message": d.get("last_assistant_message", ""),
116
122
  "last_message_preview": str(d.get("last_assistant_message", ""))[:200],
117
123
  },
118
124
  "TaskCreated": lambda d: {"tool": _TOOL, "task_id": d.get("task_id", ""), "subject": d.get("task_subject", "")},
@@ -37,11 +37,62 @@ if command -v jq >/dev/null 2>&1; then
37
37
  ;;
38
38
  PreToolUse)
39
39
  TYPE="tool_call"
40
- META=$(echo "$INPUT" | jq -c '{tool: (.tool_name // "unknown"), tool_use_id: (.tool_use_id // "")}' 2>/dev/null || echo '{}')
40
+ META=$(echo "$INPUT" | jq -c '{
41
+ tool: (.tool_name // "unknown"),
42
+ tool_use_id: (.tool_use_id // ""),
43
+ tool_input: (.tool_input // {}),
44
+ tool_input_preview: (
45
+ (.tool_input // {}) as $ti |
46
+ (.tool_name // "unknown") as $tn |
47
+ (if $tn == "Bash" then ($ti.command // "")
48
+ elif $tn == "Read" then ($ti.file_path // "")
49
+ elif $tn == "Write" then ($ti.file_path // "")
50
+ elif $tn == "Edit" then ($ti.file_path // "")
51
+ elif $tn == "Grep" then (($ti.pattern // "") + " " + ($ti.path // ""))
52
+ elif $tn == "Glob" then ($ti.pattern // "")
53
+ elif $tn == "Agent" then ($ti.description // $ti.prompt // "" | .[0:200])
54
+ else ($ti.command // $ti.file_path // $ti.path // $ti.query // $ti.pattern // $ti.url // $ti.description // $ti.prompt // ($ti | tostring)) end
55
+ ) | tostring | .[0:200]
56
+ )
57
+ }' 2>/dev/null || echo '{}')
41
58
  ;;
42
59
  PostToolUse)
43
60
  TYPE="tool_result"
44
- META=$(echo "$INPUT" | jq -c '{tool: (.tool_name // "unknown"), tool_use_id: (.tool_use_id // "")}' 2>/dev/null || echo '{}')
61
+ META=$(echo "$INPUT" | jq -c '{
62
+ tool: (.tool_name // "unknown"),
63
+ tool_use_id: (.tool_use_id // ""),
64
+ success: true,
65
+ tool_input: (.tool_input // {}),
66
+ tool_response: (.tool_response // {}),
67
+ tool_input_preview: (
68
+ (.tool_input // {}) as $ti |
69
+ (.tool_name // "unknown") as $tn |
70
+ (if $tn == "Bash" then ($ti.command // "")
71
+ elif $tn == "Read" then ($ti.file_path // "")
72
+ elif $tn == "Write" then ($ti.file_path // "")
73
+ elif $tn == "Edit" then ($ti.file_path // "")
74
+ elif $tn == "Grep" then (($ti.pattern // "") + " " + ($ti.path // ""))
75
+ elif $tn == "Glob" then ($ti.pattern // "")
76
+ elif $tn == "Agent" then ($ti.description // $ti.prompt // "" | .[0:200])
77
+ else ($ti.command // $ti.file_path // $ti.path // $ti.query // $ti.pattern // $ti.url // $ti.description // $ti.prompt // ($ti | tostring)) end
78
+ ) | tostring | .[0:200]
79
+ ),
80
+ result_preview: (
81
+ (.tool_response // {}) as $tr |
82
+ (.tool_name // "unknown") as $tn |
83
+ (if $tn == "Bash" then
84
+ (if ($tr.stderr // "") != "" then ("stderr: " + $tr.stderr) else ($tr.stdout // "") end | .[0:200])
85
+ elif $tn == "Read" then
86
+ (($tr.file.numLines // $tr.numLines // 0) | tostring) + " lines"
87
+ elif $tn == "Grep" then
88
+ (($tr.numFiles // 0) | tostring) + " files, " + (($tr.numLines // 0) | tostring) + " lines"
89
+ elif $tn == "Glob" then
90
+ (($tr.numFiles // 0) | tostring) + " files"
91
+ elif ($tr | type) == "string" then ($tr | .[0:200])
92
+ else ($tr | tostring | .[0:200]) end
93
+ )
94
+ )
95
+ }' 2>/dev/null || echo '{}')
45
96
  ;;
46
97
  SubagentStart)
47
98
  TYPE="agent_launch"
@@ -65,7 +116,7 @@ if command -v jq >/dev/null 2>&1; then
65
116
  ;;
66
117
  PostToolUseFailure)
67
118
  TYPE="tool_failure"
68
- META=$(echo "$INPUT" | jq -c '{tool_name: (.tool_name // "unknown"), is_interrupt: (.is_interrupt // false), error: (.error // "" | .[0:200])}' 2>/dev/null || echo '{}')
119
+ META=$(echo "$INPUT" | jq -c '{tool: (.tool_name // "unknown"), is_interrupt: (.is_interrupt // false), success: false, error: (.error // "" | .[0:200])}' 2>/dev/null || echo '{}')
69
120
  ;;
70
121
  SessionEnd)
71
122
  TYPE="claude_session_end"
@@ -266,7 +266,9 @@ def _fmt_meta(ev: dict) -> str:
266
266
  if etype == "tool_result":
267
267
  name = meta.get("tool_name") or meta.get("tool", "")
268
268
  ok = "✓" if meta.get("success", True) else "✗"
269
- return f"{name} {ok}"
269
+ inp = (meta.get("tool_input_preview") or "")[:40]
270
+ result = (meta.get("result_preview") or "")[:40]
271
+ return f"{name} {ok} {inp} {result}".strip()
270
272
  if etype == "tool_failure":
271
273
  name = meta.get("tool_name") or meta.get("tool", "")
272
274
  err = (meta.get("error") or "")[:40]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "methodproof"
3
- version = "0.7.36"
3
+ version = "0.7.37"
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", "textual>=0.59", "rich>=13.7"]
File without changes
File without changes
File without changes