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.
- {methodproof-0.7.36 → methodproof-0.7.37}/CHANGELOG.md +8 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/PKG-INFO +6 -4
- {methodproof-0.7.36 → methodproof-0.7.37}/README.md +5 -3
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/agents/base.py +0 -9
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/config.py +4 -14
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/claude_code.py +6 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/claude_code.sh +54 -3
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/tui/start.py +3 -1
- {methodproof-0.7.36 → methodproof-0.7.37}/pyproject.toml +1 -1
- {methodproof-0.7.36 → methodproof-0.7.37}/.github/workflows/ci.yml +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/.gitignore +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/LICENSE +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/__init__.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/__main__.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/_daemon.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/agents/__init__.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/agents/music.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/agents/terminal.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/agents/watcher.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/analysis.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/binding.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/bip39.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/bridge.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/cli.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/crypto.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/e2e.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/graph.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hook.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/__init__.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/cline_hook.sh +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/codex_hook.sh +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/gemini_hook.sh +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/install.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/kiro_hook.sh +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/mcp_register.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/openclaw/HOOK.md +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/openclaw/handler.ts +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/openclaw_install.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/opencode_plugin.js +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/hooks/wrappers.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/integrity.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/kdf.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/keychain.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/live.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/lock.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/mcp.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/migrate_db.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/proxy.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/proxy_daemon.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/repos.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/skills/methodproof/SKILL.md +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/store.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/sync.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/tui/__init__.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/tui/consent.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/tui/init.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/tui/log.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/tui/login_success.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/tui/review.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/tui/status.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/tui/theme.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/viewer.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/methodproof/wordlist.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/test_windows_compat.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/__init__.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/conftest.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_analysis.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_cli_auth.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_cli_config.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_cli_helpers.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_cli_session.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_cli_share.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_cli_start.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_cli_update.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_e2e_integration.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_graph.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_hooks.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_live.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_openclaw_hooks.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_profiles.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_security.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_store.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_sync.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_viewer.py +0 -0
- {methodproof-0.7.36 → methodproof-0.7.37}/tests/test_wrappers.py +0 -0
- {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.
|
|
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` |
|
|
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` |
|
|
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
|
-
#
|
|
83
|
-
#
|
|
84
|
-
#
|
|
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
|
-
|
|
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 '{
|
|
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 '{
|
|
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 '{
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|
|
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
|