Releases: guan4tou2/REDLOG
Releases · guan4tou2/REDLOG
Release list
v0.6.67
v0.6.66
docs: CHANGELOG.md for v0.6.42–v0.6.65 + README picks up the new feat…
v0.6.65
docs: agent hook plugin guide — three tiers + Aider example Extended docs/plugin-development.md with a "Wrapping a new AI agent" section aimed at anyone adding support for a new agent (Cursor, Aider, Gemini CLI, Continue, etc). Covers: - The three integration tiers (native hook API / SHELL wrapper / shell fallback) with a picker table so plugin authors know which one to reach for based on what the agent gives them. - installMethod choice — when to use claude-settings vs shell-source vs manual, and which state file each mutates. - Hook script contract — the minimum event payload, port/token discovery, and short curl timeouts so a paused RedLog doesn't wedge the agent's tool loop. - Full working Aider plugin manifest + wrapper skeleton as a template people can copy. - Testing checklist including the common failure modes (missing token, wrong shape rejected by the API). Points at the two in-repo hooks (claude-code-hook.sh and codex-wrapper.sh) as the reference for each extreme so authors don't guess. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
v0.6.64
feat: hook cwd exclusion list + folder picker, auto-upgrade, target fix Three related changes triggered by "白名單這不應該限制 claude 吧" + "改成開啟資料夾來選擇路徑" + noticing json.dumps was still being logged as a target. 1. Hook cwd: whitelist → exclusion list The v0.6.59 cwd whitelist inverted the sensible default. Claude Code Bash tool calls are AI actions worth auditing, so they should default to ON; the operator can opt paths OUT (personal notes, hobby coding, secrets folder). Settings ▸ 整合 renamed to "Claude Code Hook — 例外清單" and now writes `excludedPaths` to ~/.redlog/hook-config.json instead of `watchPaths`. The hook keeps reading `watchPaths` for backward-compat with anyone still holding a v0.6.59 config, and the UI shows an amber "legacy whitelist still active" banner in that case so it's obvious the old rule is narrowing the log. Also: Settings picks a folder via Electron's native openDirectory dialog (hookConfig:pickPath IPC) instead of asking users to type the path. 2. Shell hook auto-upgrade Anyone who installed the shell hook between v0.6.20 and v0.6.46 has a copy with `'pid': $$$` that fails to log a single command_start / command_end. autoUpgradeInstalledHooks() runs at RedLog startup, checks every installed shell-source hook for the known-broken marker, and overwrites with the bundled fresh copy when it matches. Idempotent, and emits a `system.hook_auto_upgrade` chain event when it fires so the mutation is on the record. 3. Target extractor: require explicit URL scheme in the fallback The fallback in extractTarget() ran DOMAIN_RE across any command, so `python -c "import json.dumps"` recorded target=json.dumps, and any `source ~/.redlog/shell-preexec-hook.sh` recorded that filename. Now the fallback only fires when the command contains `http://` or `https://` — real URL cases (docker run … http://svc, etc) still land, false positives stop. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
v0.6.63
fix(ui): stop vh-based children punching through zoomed body
v0.6.62 shrank body height by the inverse zoom to keep the visual
render inside the viewport, but any child that used Tailwind's
h-screen (100vh) still sized itself against the un-zoomed viewport
and overflowed by (zoom-1)×100vh. Result: StatusBar and the Timeline
event log were still sitting below the visible window edge.
Pin the height chain from html → body → #root → App root:
- html, body, #root: height: 100% (cascade against body's shrunk
calc, not against 100vh)
- App root (App.tsx) + ProjectPicker root: h-screen → h-full so
they inherit from #root instead of restating 100vh
Now the top-level app frame is exactly one visual screen after the
zoom multiplies things back — no more clipping at the bottom.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
v0.6.62
fix(ui): body zoom no longer pushes StatusBar off-screen
Report: "底部的欄位都不見了" — the StatusBar row along the bottom
and the Timeline event log below the track were both getting clipped
by the window.
Root cause: `body { zoom: 1.1 }` scales the layout box, and every child
that uses `h-screen` (100vh) then measures itself against the un-scaled
viewport. Result: the app's root `<div className="h-screen flex flex-col">`
became 110vh tall after zoom, so the StatusBar sat 10vh below the
window's actual bottom edge. Same story for the Timeline event log —
the track ate the visible space and pushed the log out.
Two fixes:
- body: add `height: calc(100vh / var(--app-zoom, 1.1))`. Pre-shrunk
body composites at exactly the viewport after zoom multiplies it back
to 100vh, so `h-screen` children stay inside the window.
- Timeline: replace the hardcoded 240 px detail-panel and 160/180 px
event-log heights with vh values (45vh / 18vh / 22vh). Fixed pixels
were the wrong choice once zoom + the +1-step hint font landed —
they don't scale with the operator's chosen scale or window height.
Session_end events are also no longer suppressed by the housekeeping
filter — they're the anchor for the "▶ Replay entire session" button,
so hiding them meant the button was unreachable.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
v0.6.61
test: interactive ssh now fires pivot event, update assertions
v0.6.60 changed detectPivot('ssh user@host') from null → interactive
pivot event, but the old assertion still expected null and broke CI.
Replaced with (a) a genuine flag-only null case (`ssh -V`, `ssh -Q`)
and (b) an explicit interactive-ssh test that pins subtype='interactive'
and via=hostname.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
v0.6.59
feat: hook two-gate privacy — recording + cwd whitelist
The Claude Code hook is installed globally (~/.claude/settings.json),
so a naive fire-on-every-Bash design would silently log the user's
daily coding, hobby projects, and unrelated Claude sessions into the
engagement audit chain. That's a privacy leak.
Two gates now, both required before an event is sent:
1. RedLog is currently recording (`/api/recording` returns true)
2. Claude Code's cwd sits under a path in the user's whitelist
Whitelist lives at ~/.redlog/hook-config.json:
{ "watchPaths": ["~/Desktop/BugBounty", "~/Desktop/redlog"] }
Missing file, missing key, or empty array → hook records NOTHING
(privacy-first default; users have to explicitly opt in per path).
Managed through Settings ▸ 整合 ▸ Claude Code Hook Engagement Paths —
add/remove buttons write straight to the file via `hookConfig:get` /
`hookConfig:save` IPC. UI hints say plainly what "empty list" means so
a fresh install doesn't quietly log everything.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
v0.6.58
fix(hook): claude-code-hook reads Claude Code's new stdin JSON API
The Claude Code hook contract moved from CLAUDE_TOOL_* env vars to a
single JSON object delivered on stdin. This hook still expected the old
env vars — so every fire silently `exit 0`'d after the tool-name check
without sending anything. Every project pairing RedLog with a Claude
Code hook has been logging zero Bash tool calls for months.
Also fixes a lurking bash bug: `TOOL_INPUT="${CLAUDE_TOOL_INPUT:-{}}"`
appended a stray `}` to any JSON containing a closing brace, so even if
Claude had still been setting the env var, the JSON parse would have
failed. Rewritten to slurp stdin, hand the JSON to a single python3
step for parse + redaction + payload build, and stay quiet on any error
(a hook must never break Claude Code's UX).
New event fields:
- `session_id` — Claude Code session that ran the tool
- `transcript_path` — pointer to the full conversation .jsonl on disk
- `cwd` — working directory the tool ran under
Deliberately NOT copying conversation content into the chain: it's
Anthropic-owned, it would inflate the chain by orders of magnitude, and
`transcript_path` gives auditors on-demand access without any of those
downsides.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
v0.6.57
feat(ui): HUD pin to expanded bottom row + tighter dashboard spacing
HUD pin toggle (📍/📌) used to sit in the top-right corner alongside
▲/✕. Two problems:
1. Operator asked to move it to the bottom of the expanded pane —
pin is a low-frequency action, top-right belongs to the two
buttons you actually reach for (expand + hide).
2. It cluttered the corner when the HUD was expanded, and never
appeared when collapsed anyway.
Now MARK + PIN sit side-by-side in a bottom action row inside the
expanded pane. Same interactive semantics.
Dashboard: padding p-5 → p-4, section gap space-y-5 → space-y-3. With
the new 17px root font-size + 1.1 body zoom + hint-text bump, the
`快捷鍵` block was scrolling off the bottom of the viewport on stock
window sizes. Tighter spacing pulls it back into the initial view.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>