aidevops 2.56.0 → 2.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/VERSION +1 -1
- package/aidevops.sh +1 -1
- package/package.json +1 -1
- package/setup.sh +128 -1
- package/templates/deploy-templates.sh +92 -9
package/README.md
CHANGED
|
@@ -57,7 +57,7 @@ The result: AI agents that work *with* your development process, not around it.
|
|
|
57
57
|
[](https://github.com/marcusquinn/aidevops/commits/main)
|
|
58
58
|
|
|
59
59
|
<!-- Repository Stats -->
|
|
60
|
-
[](https://github.com/marcusquinn/aidevops/releases)
|
|
61
61
|
[](https://github.com/marcusquinn/aidevops)
|
|
62
62
|
[](https://github.com/marcusquinn/aidevops)
|
|
63
63
|
[](https://github.com/marcusquinn/aidevops)
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.
|
|
1
|
+
2.57.0
|
package/aidevops.sh
CHANGED
package/package.json
CHANGED
package/setup.sh
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# AI Assistant Server Access Framework Setup Script
|
|
4
4
|
# Helps developers set up the framework for their infrastructure
|
|
5
5
|
#
|
|
6
|
-
# Version: 2.
|
|
6
|
+
# Version: 2.57.0
|
|
7
7
|
#
|
|
8
8
|
# Quick Install (one-liner):
|
|
9
9
|
# bash <(curl -fsSL https://aidevops.dev/install)
|
|
@@ -562,6 +562,132 @@ setup_git_clis() {
|
|
|
562
562
|
return 0
|
|
563
563
|
}
|
|
564
564
|
|
|
565
|
+
# Setup Worktrunk - Git worktree management for parallel AI agent workflows
|
|
566
|
+
setup_worktrunk() {
|
|
567
|
+
print_info "Setting up Worktrunk (git worktree management)..."
|
|
568
|
+
|
|
569
|
+
# Check if worktrunk (wt) is already installed
|
|
570
|
+
if command -v wt >/dev/null 2>&1; then
|
|
571
|
+
local wt_version
|
|
572
|
+
wt_version=$(wt --version 2>/dev/null | head -1 || echo "unknown")
|
|
573
|
+
print_success "Worktrunk already installed: $wt_version"
|
|
574
|
+
|
|
575
|
+
# Check if shell integration is installed
|
|
576
|
+
local shell_name
|
|
577
|
+
shell_name=$(basename "${SHELL:-/bin/bash}")
|
|
578
|
+
local shell_rc=""
|
|
579
|
+
case "$shell_name" in
|
|
580
|
+
zsh) shell_rc="$HOME/.zshrc" ;;
|
|
581
|
+
bash)
|
|
582
|
+
if [[ "$(uname)" == "Darwin" ]]; then
|
|
583
|
+
shell_rc="$HOME/.bash_profile"
|
|
584
|
+
else
|
|
585
|
+
shell_rc="$HOME/.bashrc"
|
|
586
|
+
fi
|
|
587
|
+
;;
|
|
588
|
+
esac
|
|
589
|
+
|
|
590
|
+
if [[ -n "$shell_rc" ]] && [[ -f "$shell_rc" ]]; then
|
|
591
|
+
if ! grep -q "worktrunk" "$shell_rc" 2>/dev/null; then
|
|
592
|
+
print_info "Shell integration not detected"
|
|
593
|
+
read -r -p "Install Worktrunk shell integration (enables 'wt switch' to change directories)? (y/n): " install_shell
|
|
594
|
+
if [[ "$install_shell" == "y" ]]; then
|
|
595
|
+
if wt config shell install 2>/dev/null; then
|
|
596
|
+
print_success "Shell integration installed"
|
|
597
|
+
print_info "Restart your terminal or run: source $shell_rc"
|
|
598
|
+
else
|
|
599
|
+
print_warning "Shell integration failed - run manually: wt config shell install"
|
|
600
|
+
fi
|
|
601
|
+
fi
|
|
602
|
+
else
|
|
603
|
+
print_success "Shell integration already configured"
|
|
604
|
+
fi
|
|
605
|
+
fi
|
|
606
|
+
return 0
|
|
607
|
+
fi
|
|
608
|
+
|
|
609
|
+
# Worktrunk not installed - offer to install
|
|
610
|
+
print_info "Worktrunk makes git worktrees as easy as branches"
|
|
611
|
+
echo " • wt switch feat - Switch/create worktree (with cd)"
|
|
612
|
+
echo " • wt list - List worktrees with CI status"
|
|
613
|
+
echo " • wt merge - Squash/rebase/merge + cleanup"
|
|
614
|
+
echo " • Hooks for automated setup (npm install, etc.)"
|
|
615
|
+
echo ""
|
|
616
|
+
echo " Note: aidevops also includes worktree-helper.sh as a fallback"
|
|
617
|
+
echo ""
|
|
618
|
+
|
|
619
|
+
local pkg_manager
|
|
620
|
+
pkg_manager=$(detect_package_manager)
|
|
621
|
+
|
|
622
|
+
if [[ "$pkg_manager" == "brew" ]]; then
|
|
623
|
+
read -r -p "Install Worktrunk via Homebrew? (y/n): " install_wt
|
|
624
|
+
|
|
625
|
+
if [[ "$install_wt" == "y" ]]; then
|
|
626
|
+
print_info "Installing Worktrunk..."
|
|
627
|
+
if brew install max-sixty/worktrunk/wt 2>/dev/null; then
|
|
628
|
+
print_success "Worktrunk installed"
|
|
629
|
+
|
|
630
|
+
# Install shell integration
|
|
631
|
+
print_info "Installing shell integration..."
|
|
632
|
+
if wt config shell install 2>/dev/null; then
|
|
633
|
+
print_success "Shell integration installed"
|
|
634
|
+
print_info "Restart your terminal or source your shell config"
|
|
635
|
+
else
|
|
636
|
+
print_warning "Shell integration failed - run manually: wt config shell install"
|
|
637
|
+
fi
|
|
638
|
+
|
|
639
|
+
echo ""
|
|
640
|
+
print_info "Quick start:"
|
|
641
|
+
echo " wt switch feature/my-feature # Create/switch to worktree"
|
|
642
|
+
echo " wt list # List all worktrees"
|
|
643
|
+
echo " wt merge # Merge and cleanup"
|
|
644
|
+
echo ""
|
|
645
|
+
print_info "Documentation: ~/.aidevops/agents/tools/git/worktrunk.md"
|
|
646
|
+
else
|
|
647
|
+
print_warning "Homebrew installation failed"
|
|
648
|
+
echo " Try: cargo install worktrunk && wt config shell install"
|
|
649
|
+
fi
|
|
650
|
+
else
|
|
651
|
+
print_info "Skipped Worktrunk installation"
|
|
652
|
+
print_info "Install later: brew install max-sixty/worktrunk/wt"
|
|
653
|
+
print_info "Fallback available: ~/.aidevops/agents/scripts/worktree-helper.sh"
|
|
654
|
+
fi
|
|
655
|
+
elif command -v cargo >/dev/null 2>&1; then
|
|
656
|
+
read -r -p "Install Worktrunk via Cargo? (y/n): " install_wt
|
|
657
|
+
|
|
658
|
+
if [[ "$install_wt" == "y" ]]; then
|
|
659
|
+
print_info "Installing Worktrunk via Cargo..."
|
|
660
|
+
if cargo install worktrunk 2>/dev/null; then
|
|
661
|
+
print_success "Worktrunk installed"
|
|
662
|
+
|
|
663
|
+
# Install shell integration
|
|
664
|
+
if wt config shell install 2>/dev/null; then
|
|
665
|
+
print_success "Shell integration installed"
|
|
666
|
+
else
|
|
667
|
+
print_warning "Shell integration failed - run manually: wt config shell install"
|
|
668
|
+
fi
|
|
669
|
+
else
|
|
670
|
+
print_warning "Cargo installation failed"
|
|
671
|
+
fi
|
|
672
|
+
else
|
|
673
|
+
print_info "Skipped Worktrunk installation"
|
|
674
|
+
fi
|
|
675
|
+
else
|
|
676
|
+
print_warning "Worktrunk not installed"
|
|
677
|
+
echo ""
|
|
678
|
+
echo " Install options:"
|
|
679
|
+
echo " macOS/Linux (Homebrew): brew install max-sixty/worktrunk/wt"
|
|
680
|
+
echo " Cargo: cargo install worktrunk"
|
|
681
|
+
echo " Windows: winget install max-sixty.worktrunk"
|
|
682
|
+
echo ""
|
|
683
|
+
echo " After install: wt config shell install"
|
|
684
|
+
echo ""
|
|
685
|
+
print_info "Fallback available: ~/.aidevops/agents/scripts/worktree-helper.sh"
|
|
686
|
+
fi
|
|
687
|
+
|
|
688
|
+
return 0
|
|
689
|
+
}
|
|
690
|
+
|
|
565
691
|
# Setup recommended tools (Tabby terminal, Zed editor)
|
|
566
692
|
setup_recommended_tools() {
|
|
567
693
|
print_info "Checking recommended development tools..."
|
|
@@ -2306,6 +2432,7 @@ main() {
|
|
|
2306
2432
|
confirm_step "Check optional dependencies (bun, node, python)" && check_optional_deps
|
|
2307
2433
|
confirm_step "Setup recommended tools (Tabby, Zed, etc.)" && setup_recommended_tools
|
|
2308
2434
|
confirm_step "Setup Git CLIs (gh, glab, tea)" && setup_git_clis
|
|
2435
|
+
confirm_step "Setup Worktrunk (git worktree management)" && setup_worktrunk
|
|
2309
2436
|
confirm_step "Setup SSH key" && setup_ssh_key
|
|
2310
2437
|
confirm_step "Setup configuration files" && setup_configs
|
|
2311
2438
|
confirm_step "Set secure permissions on config files" && set_permissions
|
|
@@ -12,6 +12,10 @@ readonly YELLOW='\033[1;33m'
|
|
|
12
12
|
readonly BLUE='\033[0;34m'
|
|
13
13
|
readonly NC='\033[0m' # No Color
|
|
14
14
|
|
|
15
|
+
# Backup configuration
|
|
16
|
+
readonly BACKUP_KEEP_COUNT=5
|
|
17
|
+
readonly BACKUP_BASE_DIR="$HOME/.aidevops/template-backups"
|
|
18
|
+
|
|
15
19
|
# Print functions
|
|
16
20
|
print_info() { local msg="$1"; echo -e "${BLUE}[INFO]${NC} $msg"; return 0; }
|
|
17
21
|
print_success() { local msg="$1"; echo -e "${GREEN}[SUCCESS]${NC} $msg"; return 0; }
|
|
@@ -28,15 +32,93 @@ if [[ ! -f "$REPO_ROOT/AGENTS.md" ]] || [[ ! -d "$REPO_ROOT/.agent" ]]; then
|
|
|
28
32
|
exit 1
|
|
29
33
|
fi
|
|
30
34
|
|
|
35
|
+
# Create a backup with rotation (keeps last N backups in centralized location)
|
|
36
|
+
# Usage: create_backup_with_rotation <source_path> <backup_name>
|
|
37
|
+
create_backup_with_rotation() {
|
|
38
|
+
local source_path="$1"
|
|
39
|
+
local backup_name="$2"
|
|
40
|
+
local backup_dir
|
|
41
|
+
# Use nanoseconds to avoid collisions on rapid successive invocations
|
|
42
|
+
backup_dir="$BACKUP_BASE_DIR/$backup_name/$(date +%Y%m%d_%H%M%S%N)"
|
|
43
|
+
|
|
44
|
+
# Validate source exists before attempting backup
|
|
45
|
+
if [[ -d "$source_path" ]]; then
|
|
46
|
+
mkdir -p "$backup_dir"
|
|
47
|
+
cp -R "$source_path" "$backup_dir/"
|
|
48
|
+
elif [[ -f "$source_path" ]]; then
|
|
49
|
+
mkdir -p "$backup_dir"
|
|
50
|
+
cp "$source_path" "$backup_dir/"
|
|
51
|
+
else
|
|
52
|
+
print_warning "Source path does not exist: $source_path"
|
|
53
|
+
return 1
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
print_info "Backed up to $backup_dir"
|
|
57
|
+
|
|
58
|
+
# Rotate old backups (keep last N)
|
|
59
|
+
local backup_type_dir="$BACKUP_BASE_DIR/$backup_name"
|
|
60
|
+
local backup_count
|
|
61
|
+
backup_count=$(find "$backup_type_dir" -maxdepth 1 -type d -name "20*" 2>/dev/null | wc -l)
|
|
62
|
+
|
|
63
|
+
if (( backup_count > BACKUP_KEEP_COUNT )); then
|
|
64
|
+
local to_delete=$((backup_count - BACKUP_KEEP_COUNT))
|
|
65
|
+
# Delete oldest backups (sorted by name = sorted by date)
|
|
66
|
+
find "$backup_type_dir" -maxdepth 1 -type d -name "20*" -print0 2>/dev/null | sort -z | head -z -n "$to_delete" | xargs -0 rm -rf
|
|
67
|
+
print_info "Rotated backups: removed $to_delete old backup(s)"
|
|
68
|
+
fi
|
|
69
|
+
|
|
70
|
+
return 0
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# Clean up old in-place backup files from previous versions
|
|
74
|
+
# Uses find -delete to safely remove only files (not directories)
|
|
75
|
+
cleanup_old_backups() {
|
|
76
|
+
local cleaned=0
|
|
77
|
+
local count
|
|
78
|
+
|
|
79
|
+
# Clean ~/AGENTS.md.backup.* files
|
|
80
|
+
count=$(find "$HOME" -maxdepth 1 -name "AGENTS.md.backup.*" -type f 2>/dev/null | wc -l)
|
|
81
|
+
if (( count > 0 )); then
|
|
82
|
+
find "$HOME" -maxdepth 1 -name "AGENTS.md.backup.*" -type f -delete 2>/dev/null
|
|
83
|
+
(( cleaned += count ))
|
|
84
|
+
fi
|
|
85
|
+
|
|
86
|
+
# Clean ~/git/AGENTS.md.backup.* or ~/Git/AGENTS.md.backup.* files
|
|
87
|
+
for git_dir in "$HOME/git" "$HOME/Git"; do
|
|
88
|
+
if [[ -d "$git_dir" ]]; then
|
|
89
|
+
count=$(find "$git_dir" -maxdepth 1 -name "AGENTS.md.backup.*" -type f 2>/dev/null | wc -l)
|
|
90
|
+
if (( count > 0 )); then
|
|
91
|
+
find "$git_dir" -maxdepth 1 -name "AGENTS.md.backup.*" -type f -delete 2>/dev/null
|
|
92
|
+
(( cleaned += count ))
|
|
93
|
+
fi
|
|
94
|
+
fi
|
|
95
|
+
done
|
|
96
|
+
|
|
97
|
+
# Clean ~/.aidevops/.agent-workspace/README.md.backup.* files
|
|
98
|
+
local workspace="$HOME/.aidevops/.agent-workspace"
|
|
99
|
+
if [[ -d "$workspace" ]]; then
|
|
100
|
+
count=$(find "$workspace" -maxdepth 1 -name "README.md.backup.*" -type f 2>/dev/null | wc -l)
|
|
101
|
+
if (( count > 0 )); then
|
|
102
|
+
find "$workspace" -maxdepth 1 -name "README.md.backup.*" -type f -delete 2>/dev/null
|
|
103
|
+
(( cleaned += count ))
|
|
104
|
+
fi
|
|
105
|
+
fi
|
|
106
|
+
|
|
107
|
+
if (( cleaned > 0 )); then
|
|
108
|
+
print_success "Cleaned up $cleaned old backup file(s)"
|
|
109
|
+
fi
|
|
110
|
+
|
|
111
|
+
return 0
|
|
112
|
+
}
|
|
113
|
+
|
|
31
114
|
deploy_home_agents() {
|
|
32
115
|
local target_file="$HOME/AGENTS.md"
|
|
33
116
|
|
|
34
117
|
print_info "Deploying minimal AGENTS.md to home directory..."
|
|
35
118
|
|
|
36
|
-
# Backup existing file if it exists
|
|
119
|
+
# Backup existing file if it exists (with rotation)
|
|
37
120
|
if [[ -f "$target_file" ]]; then
|
|
38
|
-
|
|
39
|
-
cp "$target_file" "$target_file.backup.$(date +%Y%m%d_%H%M%S)"
|
|
121
|
+
create_backup_with_rotation "$target_file" "home-agents"
|
|
40
122
|
fi
|
|
41
123
|
|
|
42
124
|
# Deploy template
|
|
@@ -57,10 +139,9 @@ deploy_git_agents() {
|
|
|
57
139
|
print_info "Created git directory: $git_dir"
|
|
58
140
|
fi
|
|
59
141
|
|
|
60
|
-
# Backup existing file if it exists
|
|
142
|
+
# Backup existing file if it exists (with rotation)
|
|
61
143
|
if [[ -f "$target_file" ]]; then
|
|
62
|
-
|
|
63
|
-
cp "$target_file" "$target_file.backup.$(date +%Y%m%d_%H%M%S)"
|
|
144
|
+
create_backup_with_rotation "$target_file" "git-agents"
|
|
64
145
|
fi
|
|
65
146
|
|
|
66
147
|
# Deploy template
|
|
@@ -81,10 +162,9 @@ deploy_agent_directory() {
|
|
|
81
162
|
print_info "Created workspace directory: $agent_workspace"
|
|
82
163
|
fi
|
|
83
164
|
|
|
84
|
-
# Backup existing README if it exists
|
|
165
|
+
# Backup existing README if it exists (with rotation)
|
|
85
166
|
if [[ -f "$target_file" ]]; then
|
|
86
|
-
|
|
87
|
-
cp "$target_file" "$target_file.backup.$(date +%Y%m%d_%H%M%S)"
|
|
167
|
+
create_backup_with_rotation "$target_file" "workspace-readme"
|
|
88
168
|
fi
|
|
89
169
|
|
|
90
170
|
# Deploy template
|
|
@@ -128,6 +208,9 @@ main() {
|
|
|
128
208
|
print_info "Deploying minimal, secure AGENTS.md templates..."
|
|
129
209
|
print_warning "These templates contain minimal instructions to prevent prompt injection attacks"
|
|
130
210
|
|
|
211
|
+
# Clean up old in-place backups from previous versions
|
|
212
|
+
cleanup_old_backups
|
|
213
|
+
|
|
131
214
|
deploy_home_agents
|
|
132
215
|
deploy_git_agents
|
|
133
216
|
deploy_agent_directory
|