Add shell completions and test script
New files: - completions.bash: Bash completions and aliases for automation scripts - completions.zsh: Zsh completions and aliases - test-scripts.sh: Test suite for Python and Bash scripts Test coverage: - Automation scripts (validate-setup, memory-add, memory-list) - Skill scripts (gmail, gcal, usage) - Bash scripts (quick-status, health-check, k8s) All 12 tests pass. Usage: source ~/.claude/automation/completions.bash # or .zsh ~/.claude/automation/test-scripts.sh 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
BIN
automation/__pycache__/memory-add.cpython-313.pyc
Normal file
BIN
automation/__pycache__/memory-add.cpython-313.pyc
Normal file
Binary file not shown.
BIN
automation/__pycache__/memory-list.cpython-313.pyc
Normal file
BIN
automation/__pycache__/memory-list.cpython-313.pyc
Normal file
Binary file not shown.
53
automation/completions.bash
Normal file
53
automation/completions.bash
Normal file
@@ -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"
|
||||
60
automation/completions.zsh
Normal file
60
automation/completions.zsh
Normal file
@@ -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)"
|
||||
114
automation/test-scripts.sh
Executable file
114
automation/test-scripts.sh
Executable file
@@ -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
|
||||
Reference in New Issue
Block a user