diff --git a/automation/__pycache__/memory-add.cpython-313.pyc b/automation/__pycache__/memory-add.cpython-313.pyc new file mode 100644 index 0000000..755df8d Binary files /dev/null and b/automation/__pycache__/memory-add.cpython-313.pyc differ diff --git a/automation/__pycache__/memory-list.cpython-313.pyc b/automation/__pycache__/memory-list.cpython-313.pyc new file mode 100644 index 0000000..85aa257 Binary files /dev/null and b/automation/__pycache__/memory-list.cpython-313.pyc differ diff --git a/automation/completions.bash b/automation/completions.bash new file mode 100644 index 0000000..3efb5ec --- /dev/null +++ b/automation/completions.bash @@ -0,0 +1,53 @@ +#!/bin/bash +# Bash completions for Claude Code automation scripts +# Source this file: source ~/.claude/automation/completions.bash + +_claude_automation() { + local cur="${COMP_WORDS[COMP_CWORD]}" + local scripts="validate-setup quick-status backup restore clean memory-add memory-list" + + COMPREPLY=($(compgen -W "${scripts}" -- "${cur}")) +} + +_claude_memory_add() { + local cur="${COMP_WORDS[COMP_CWORD]}" + local prev="${COMP_WORDS[COMP_CWORD-1]}" + + if [[ ${COMP_CWORD} -eq 1 ]]; then + COMPREPLY=($(compgen -W "preference decision project fact auto" -- "${cur}")) + fi +} + +_claude_memory_list() { + local cur="${COMP_WORDS[COMP_CWORD]}" + + COMPREPLY=($(compgen -W "preferences decisions projects facts --all" -- "${cur}")) +} + +_claude_restore() { + local cur="${COMP_WORDS[COMP_CWORD]}" + local backup_dir="${HOME}/.claude/backups" + + if [[ -d "${backup_dir}" ]]; then + local backups=$(ls -1 "${backup_dir}"/*.tar.gz 2>/dev/null | xargs -n1 basename) + COMPREPLY=($(compgen -W "${backups}" -- "${cur}")) + fi +} + +# Register completions +complete -F _claude_memory_add memory-add.py +complete -F _claude_memory_list memory-list.py +complete -F _claude_restore restore.sh + +# Alias completions for convenience +alias claude-validate='~/.claude/automation/validate-setup.sh' +alias claude-status='~/.claude/automation/quick-status.sh' +alias claude-backup='~/.claude/automation/backup.sh' +alias claude-restore='~/.claude/automation/restore.sh' +alias claude-clean='~/.claude/automation/clean.sh' +alias claude-memory-add='python3 ~/.claude/automation/memory-add.py' +alias claude-memory-list='python3 ~/.claude/automation/memory-list.py' + +echo "Claude Code completions loaded. Available aliases:" +echo " claude-validate, claude-status, claude-backup, claude-restore" +echo " claude-clean, claude-memory-add, claude-memory-list" diff --git a/automation/completions.zsh b/automation/completions.zsh new file mode 100644 index 0000000..da41c58 --- /dev/null +++ b/automation/completions.zsh @@ -0,0 +1,60 @@ +#!/bin/zsh +# Zsh completions for Claude Code automation scripts +# Source this file: source ~/.claude/automation/completions.zsh + +# Memory add completion +_memory_add() { + local -a categories + categories=('preference:Save as preference' 'decision:Save as decision' 'project:Save as project context' 'fact:Save as fact' 'auto:Auto-categorize') + + _arguments \ + '1:category:->category' \ + '*:content:' && return 0 + + case $state in + category) + _describe 'category' categories + ;; + esac +} + +# Memory list completion +_memory_list() { + local -a categories + categories=('preferences' 'decisions' 'projects' 'facts') + + _arguments \ + '1:category:->category' \ + '--all[Include deprecated items]' && return 0 + + case $state in + category) + _describe 'category' categories + ;; + esac +} + +# Restore completion +_claude_restore() { + local backup_dir="${HOME}/.claude/backups" + + if [[ -d "${backup_dir}" ]]; then + _files -g "${backup_dir}/*.tar.gz" + fi +} + +# Register completions +compdef _memory_add memory-add.py +compdef _memory_list memory-list.py +compdef _claude_restore restore.sh + +# Aliases +alias claude-validate='~/.claude/automation/validate-setup.sh' +alias claude-status='~/.claude/automation/quick-status.sh' +alias claude-backup='~/.claude/automation/backup.sh' +alias claude-restore='~/.claude/automation/restore.sh' +alias claude-clean='~/.claude/automation/clean.sh' +alias claude-memory-add='python3 ~/.claude/automation/memory-add.py' +alias claude-memory-list='python3 ~/.claude/automation/memory-list.py' + +echo "Claude Code completions loaded (zsh)" diff --git a/automation/test-scripts.sh b/automation/test-scripts.sh new file mode 100755 index 0000000..da043c3 --- /dev/null +++ b/automation/test-scripts.sh @@ -0,0 +1,114 @@ +#!/bin/bash +# Test automation scripts +# Run: ./test-scripts.sh + +set -euo pipefail + +CLAUDE_DIR="${HOME}/.claude" +AUTOMATION_DIR="${CLAUDE_DIR}/automation" +SKILLS_DIR="${CLAUDE_DIR}/skills" + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' + +PASS=0 +FAIL=0 + +pass() { echo -e "${GREEN}โœ“${NC} $1"; PASS=$((PASS + 1)); } +fail() { echo -e "${RED}โœ—${NC} $1"; FAIL=$((FAIL + 1)); } +skip() { echo -e "${YELLOW}โ—‹${NC} $1 (skipped)"; } + +echo "๐Ÿงช Testing Claude Code Scripts" +echo "" + +# Test 1: validate-setup.sh +echo "=== Automation Scripts ===" +if "${AUTOMATION_DIR}/validate-setup.sh" > /dev/null 2>&1; then + pass "validate-setup.sh runs successfully" +else + fail "validate-setup.sh failed" +fi + +# Test 2: quick-status.sh (may fail without kubectl) +# Skip in automated testing - requires live connections +skip "quick-status.sh (requires live connections)" + +# Test 3: memory-add.py (test syntax only) +if python3 -m py_compile "${AUTOMATION_DIR}/memory-add.py" 2>/dev/null; then + pass "memory-add.py syntax valid" +else + fail "memory-add.py syntax error" +fi + +# Test 4: memory-list.py (test syntax only) +if python3 -m py_compile "${AUTOMATION_DIR}/memory-list.py" 2>/dev/null; then + pass "memory-list.py syntax valid" +else + fail "memory-list.py syntax error" +fi + +# Test 5: usage_report.py (test syntax only) +if python3 -m py_compile "${SKILLS_DIR}/usage/scripts/usage_report.py" 2>/dev/null; then + pass "usage_report.py syntax valid" +else + fail "usage_report.py syntax error" +fi + +echo "" +echo "=== Skill Scripts ===" + +# Test Gmail scripts (syntax only - need credentials to run) +for script in check_unread.py check_urgent.py search.py; do + if python3 -m py_compile "${SKILLS_DIR}/gmail/scripts/${script}" 2>/dev/null; then + pass "gmail/${script} syntax valid" + else + fail "gmail/${script} syntax error" + fi +done + +# Test GCal scripts +for script in agenda.py next_event.py; do + if python3 -m py_compile "${SKILLS_DIR}/gcal/scripts/${script}" 2>/dev/null; then + pass "gcal/${script} syntax valid" + else + fail "gcal/${script} syntax error" + fi +done + +# Test bash scripts (syntax check with bash -n) +echo "" +echo "=== Bash Scripts ===" + +for script in quick-status.sh health-check.sh; do + script_path=$(find "${CLAUDE_DIR}" -name "${script}" -type f | head -1) + if [[ -n "${script_path}" ]]; then + if bash -n "${script_path}" 2>/dev/null; then + pass "${script} syntax valid" + else + fail "${script} syntax error" + fi + fi +done + +# Test k8s quick-status +if bash -n "${SKILLS_DIR}/k8s-quick-status/scripts/quick-status.sh" 2>/dev/null; then + pass "k8s/quick-status.sh syntax valid" +else + fail "k8s/quick-status.sh syntax error" +fi + +echo "" +echo "=== Summary ===" +echo -e "Passed: ${GREEN}${PASS}${NC}" +echo -e "Failed: ${RED}${FAIL}${NC}" + +if [[ ${FAIL} -eq 0 ]]; then + echo -e "\n${GREEN}All tests passed!${NC}" + exit 0 +else + echo -e "\n${RED}${FAIL} test(s) failed${NC}" + exit 1 +fi