diff --git a/automation/pa-mode b/automation/pa-mode index f6b92ea..0fcce8c 100755 --- a/automation/pa-mode +++ b/automation/pa-mode @@ -11,7 +11,7 @@ usage() { echo "" echo "Commands:" echo " (none) Attach to existing session or create new one" - echo " new Force new session (detaches existing if any)" + echo " new Force new session (kills existing if any)" echo " kill Terminate the PA session" echo " status Show session status" echo "" @@ -21,46 +21,41 @@ get_session_id() { date +"%Y-%m-%d_%H-%M-%S" } -create_session() { - local session_id - session_id=$(get_session_id) - local history_file="$HISTORY_DIR/${session_id}.jsonl" - - # Record session start in index +record_session_start() { + local session_id="$1" local tmp_file tmp_file=$(mktemp) jq --arg id "$session_id" --arg started "$(date -Iseconds)" \ '.sessions += [{"id": $id, "started": $started, "ended": null, "summarized": false, "topics": []}]' \ "$INDEX_FILE" > "$tmp_file" && mv "$tmp_file" "$INDEX_FILE" - - # Create tmux session with claude in PA mode - # Using HISTFILE-like approach: set env var for history location - tmux new-session -d -s "$SESSION_NAME" -c "$HOME" \ - "PA_SESSION_ID='$session_id' PA_HISTORY_FILE='$history_file' claude --dangerously-skip-permissions --agent personal-assistant" - - echo "Created new PA session: $session_id" } -attach_session() { - if tmux has-session -t "$SESSION_NAME" 2>/dev/null; then - tmux attach-session -t "$SESSION_NAME" - else - create_session - tmux attach-session -t "$SESSION_NAME" +create_or_attach_session() { + local session_id + session_id=$(get_session_id) + local history_file="$HISTORY_DIR/${session_id}.jsonl" + + # If session doesn't exist, record it in index before creating + if ! tmux has-session -t "$SESSION_NAME" 2>/dev/null; then + record_session_start "$session_id" fi + + # Export for status line, then exec tmux (replaces this shell process) + # Using -A: attach if session exists, create if not + export CLAUDE_AGENT=personal-assistant + exec tmux new-session -A -s "$SESSION_NAME" -c "$HOME" \ + "CLAUDE_AGENT=personal-assistant PA_SESSION_ID='$session_id' PA_HISTORY_FILE='$history_file' claude --dangerously-skip-permissions --agent personal-assistant" } case "${1:-}" in "") - attach_session + create_or_attach_session ;; new) if tmux has-session -t "$SESSION_NAME" 2>/dev/null; then - echo "Killing existing session..." tmux kill-session -t "$SESSION_NAME" fi - create_session - tmux attach-session -t "$SESSION_NAME" + create_or_attach_session ;; kill) if tmux has-session -t "$SESSION_NAME" 2>/dev/null; then diff --git a/automation/statusline.sh b/automation/statusline.sh new file mode 100755 index 0000000..d6d0eb2 --- /dev/null +++ b/automation/statusline.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +# Claude Code Status Line - displays agent, model, and context usage +input=$(cat) + +AGENT="${CLAUDE_AGENT:-}" +MODEL=$(echo "$input" | jq -r '.model.display_name // "?"') + +# Calculate context percentage +CONTEXT_PCT="?" +usage=$(echo "$input" | jq '.context_window.current_usage // empty') +if [ -n "$usage" ]; then + current=$(echo "$usage" | jq '.input_tokens + .cache_creation_input_tokens + .cache_read_input_tokens') + size=$(echo "$input" | jq '.context_window.context_window_size') + if [ "$size" -gt 0 ] 2>/dev/null; then + CONTEXT_PCT=$((current * 100 / size)) + fi +fi + +if [ -n "$AGENT" ]; then + echo "[$AGENT] $MODEL | ${CONTEXT_PCT}% context" +else + echo "$MODEL | ${CONTEXT_PCT}% context" +fi diff --git a/settings.json b/settings.json index b7f7175..474316e 100644 --- a/settings.json +++ b/settings.json @@ -1,4 +1,5 @@ { + "model": "opus", "enabledPlugins": { "frontend-design@claude-plugins-official": true, "typescript-lsp@claude-plugins-official": true, @@ -6,62 +7,9 @@ "superpowers@superpowers-marketplace": true }, "alwaysThinkingEnabled": true, - "model": "opus", - "agents": { - "k8s-orchestrator": { - "model": "opus", - "promptFile": "agents/k8s-orchestrator.md", - "description": "Central orchestrator for K8s cluster management tasks" - }, - "k8s-diagnostician": { - "model": "sonnet", - "promptFile": "agents/k8s-diagnostician.md", - "description": "Cluster health, pod/node status, log analysis" - }, - "argocd-operator": { - "model": "sonnet", - "promptFile": "agents/argocd-operator.md", - "description": "ArgoCD app sync, deployments, rollbacks" - }, - "prometheus-analyst": { - "model": "sonnet", - "promptFile": "agents/prometheus-analyst.md", - "description": "Metrics queries, alert analysis, trends" - }, - "git-operator": { - "model": "sonnet", - "promptFile": "agents/git-operator.md", - "description": "Git commits, PRs, manifest management" - } + "statusLine": { + "type": "command", + "command": "~/.claude/automation/statusline.sh" }, - "autonomy": { - "safe_actions": [ - "get", - "describe", - "logs", - "list", - "top", - "diff", - "refresh" - ], - "confirm_actions": [ - "delete", - "patch", - "edit", - "scale", - "rollout", - "apply", - "sync", - "commit", - "push", - "create-pr" - ], - "forbidden_actions": [ - "drain", - "cordon", - "delete node", - "reset", - "delete namespace" - ] - } + "_note": "Agent definitions moved to ~/.claude/agents/*.md with YAML frontmatter. Autonomy levels now in ~/.claude/state/autonomy-levels.json" }