diff --git a/AGENTS.md b/AGENTS.md index f7df7daef..cbfc283d4 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -66,7 +66,7 @@ - After merging a PR: run `bun scripts/update-clawtributors.ts` if the contributor is missing, then commit the regenerated README. ## Shorthand Commands -- `sync up`: if working tree is dirty, commit all changes (pick a sensible Conventional Commit message), then `git pull --rebase`; if rebase conflicts and cannot resolve, stop; otherwise `git push`. +- `sync`: if working tree is dirty, commit all changes (pick a sensible Conventional Commit message), then `git pull --rebase`; if rebase conflicts and cannot resolve, stop; otherwise `git push`. ### PR Workflow (Review vs Land) - **Review mode (PR link only):** read `gh pr view/diff`; **do not** switch branches; **do not** change code. @@ -116,8 +116,7 @@ - Code style: add brief comments for tricky logic; keep files under ~500 LOC when feasible (split/refactor as needed). - Tool schema guardrails (google-antigravity): avoid `Type.Union` in tool input schemas; no `anyOf`/`oneOf`/`allOf`. Use `stringEnum`/`optionalStringEnum` (Type.Unsafe enum) for string lists, and `Type.Optional(...)` instead of `... | null`. Keep top-level tool schema as `type: "object"` with `properties`. - Tool schema guardrails: avoid raw `format` property names in tool schemas; some validators treat `format` as a reserved keyword and reject the schema. -- When asked to open a “session” file, open the Pi session logs under `~/.clawdbot/agents/main/sessions/*.jsonl` (newest unless a specific ID is given), not the default `sessions.json`. If logs are needed from another machine, SSH via Tailscale and read the same path there. -- Menubar dimming + restart flow mirrors Trimmy: use `scripts/restart-mac.sh` (kills all Clawdbot variants, runs `swift build`, packages, relaunches). Icon dimming depends on MenuBarExtraAccess wiring in AppMain; keep `appearsDisabled` updates intact when touching the status item. +- When asked to open a “session” file, open the Pi session logs under `~/.clawdbot/agents//sessions/*.jsonl` (use the `agent=` value in the Runtime line of the system prompt; newest unless a specific ID is given), not the default `sessions.json`. If logs are needed from another machine, SSH via Tailscale and read the same path there. - Do not rebuild the macOS app over SSH; rebuilds must be run directly on the Mac. - Never send streaming/partial replies to external messaging surfaces (WhatsApp, Telegram); only final replies should be delivered there. Streaming/tool events may still go to internal UIs/control channel. - Voice wake forwarding tips: @@ -133,19 +132,3 @@ - Publish: `npm publish --access public --otp=""` (run from the package dir). - Verify without local npmrc side effects: `npm view version --userconfig "$(mktemp)"`. - Kill the tmux session after publish. - -## Exclamation Mark Escaping Workaround -The Claude Code Bash tool escapes `!` to `\\!` in command arguments. When using `clawdbot message send` with messages containing exclamation marks, use heredoc syntax: - -```bash -# WRONG - will send "Hello\\!" with backslash -clawdbot message send --to "+1234" --message 'Hello!' - -# CORRECT - use heredoc to avoid escaping -clawdbot message send --to "+1234" --message "$(cat <<'EOF' -Hello! -EOF -)" -``` - -This is a Claude Code quirk, not a clawdbot bug. diff --git a/skills/session-logs/SKILL.md b/skills/session-logs/SKILL.md index 986cc2e7c..9a4462c4c 100644 --- a/skills/session-logs/SKILL.md +++ b/skills/session-logs/SKILL.md @@ -1,16 +1,20 @@ --- name: session-logs -description: Search and analyze your own conversation history from session log files using jq. -metadata: {"clawdbot":{"emoji":"📜","requires":{"bins":["jq"]}}} +description: Search and analyze your own session logs (older/parent conversations) using jq. +metadata: {"clawdbot":{"emoji":"📜","requires":{"bins":["jq","rg"]}}} --- # session-logs -Search your complete conversation history stored in session JSONL files. Use this when you need to recall something not in your memory files. +Search your complete conversation history stored in session JSONL files. Use this when a user references older/parent conversations or asks what was said before. + +## Trigger + +Use this skill when the user asks about prior chats, parent conversations, or historical context that isn’t in memory files. ## Location -Session logs live at: `~/.clawdbot/agents/main/sessions/` +Session logs live at: `~/.clawdbot/agents//sessions/` (use the `agent=` value from the system prompt Runtime line). - **`sessions.json`** - Index mapping session keys to session IDs - **`.jsonl`** - Full conversation transcript per session @@ -21,14 +25,14 @@ Each `.jsonl` file contains messages with: - `type`: "session" (metadata) or "message" - `timestamp`: ISO timestamp - `message.role`: "user", "assistant", or "toolResult" -- `message.content[]`: Text, thinking, or tool calls +- `message.content[]`: Text, thinking, or tool calls (filter `type=="text"` for human-readable content) - `message.usage.cost.total`: Cost per response ## Common Queries ### List all sessions by date and size ```bash -for f in ~/.clawdbot/agents/main/sessions/*.jsonl; do +for f in ~/.clawdbot/agents//sessions/*.jsonl; do date=$(head -1 "$f" | jq -r '.timestamp' | cut -dT -f1) size=$(ls -lh "$f" | awk '{print $5}') echo "$date $size $(basename $f)" @@ -37,19 +41,19 @@ done | sort -r ### Find sessions from a specific day ```bash -for f in ~/.clawdbot/agents/main/sessions/*.jsonl; do +for f in ~/.clawdbot/agents//sessions/*.jsonl; do head -1 "$f" | jq -r '.timestamp' | grep -q "2026-01-06" && echo "$f" done ``` ### Extract user messages from a session ```bash -jq -r 'select(.message.role == "user") | .message.content[0].text' .jsonl +jq -r 'select(.message.role == "user") | .message.content[]? | select(.type == "text") | .text' .jsonl ``` ### Search for keyword in assistant responses ```bash -jq -r 'select(.message.role == "assistant") | .message.content[]? | select(.type == "text") | .text' .jsonl | grep -i "keyword" +jq -r 'select(.message.role == "assistant") | .message.content[]? | select(.type == "text") | .text' .jsonl | rg -i "keyword" ``` ### Get total cost for a session @@ -59,7 +63,7 @@ jq -s '[.[] | .message.usage.cost.total // 0] | add' .jsonl ### Daily cost summary ```bash -for f in ~/.clawdbot/agents/main/sessions/*.jsonl; do +for f in ~/.clawdbot/agents//sessions/*.jsonl; do date=$(head -1 "$f" | jq -r '.timestamp' | cut -dT -f1) cost=$(jq -s '[.[] | .message.usage.cost.total // 0] | add' "$f") echo "$date $cost" @@ -84,7 +88,7 @@ jq -r '.message.content[]? | select(.type == "toolCall") | .name' .json ### Search across ALL sessions for a phrase ```bash -grep -l "phrase" ~/.clawdbot/agents/main/sessions/*.jsonl +rg -l "phrase" ~/.clawdbot/agents//sessions/*.jsonl ``` ## Tips @@ -93,3 +97,9 @@ grep -l "phrase" ~/.clawdbot/agents/main/sessions/*.jsonl - Large sessions can be several MB - use `head`/`tail` for sampling - The `sessions.json` index maps chat providers (discord, whatsapp, etc.) to session IDs - Deleted sessions have `.deleted.` suffix + +## Fast text-only hint (low noise) + +```bash +jq -r 'select(.type=="message") | .message.content[]? | select(.type=="text") | .text' ~/.clawdbot/agents//sessions/.jsonl | rg 'keyword' +```