Skip to content

Commit dba1db2

Browse files
authored
feat(setup): register Homeboy project (#100)
1 parent a55f371 commit dba1db2

3 files changed

Lines changed: 156 additions & 1 deletion

File tree

lib/homeboy.sh

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
#!/bin/bash
2+
# Homeboy project registration for the installed WordPress site.
3+
4+
homeboy_slugify() {
5+
printf '%s' "$1" | sed 's|https\?://||; s|/.*$||; s|\..*$||' | \
6+
tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9-]/-/g; s/--*/-/g; s/^-//; s/-$//'
7+
}
8+
9+
homeboy_json_escape() {
10+
local value="$1"
11+
value=${value//\\/\\\\}
12+
value=${value//\"/\\\"}
13+
value=${value//$'\n'/\\n}
14+
printf '%s' "$value"
15+
}
16+
17+
homeboy_project_json() {
18+
local domain base_path server_id
19+
domain="$(homeboy_json_escape "$1")"
20+
base_path="$(homeboy_json_escape "$2")"
21+
server_id="$(homeboy_json_escape "${3:-}")"
22+
23+
printf '{"domain":"%s","base_path":"%s"' "$domain" "$base_path"
24+
if [ -n "$server_id" ]; then
25+
printf ',"server_id":"%s"' "$server_id"
26+
fi
27+
printf '}'
28+
}
29+
30+
homeboy_server_json() {
31+
local user port
32+
user="$(homeboy_json_escape "$1")"
33+
port="$2"
34+
printf '{"host":"localhost","user":"%s","port":%s}' "$user" "$port"
35+
}
36+
37+
homeboy_project_id() {
38+
if [ -n "${HOMEBOY_PROJECT_ID:-}" ]; then
39+
printf '%s' "$HOMEBOY_PROJECT_ID"
40+
elif [ -n "${AGENT_SLUG:-}" ]; then
41+
printf '%s' "$AGENT_SLUG"
42+
else
43+
homeboy_slugify "${SITE_DOMAIN:-$SITE_PATH}"
44+
fi
45+
}
46+
47+
homeboy_server_id() {
48+
if [ "$LOCAL_MODE" = true ]; then
49+
printf 'local'
50+
return 0
51+
fi
52+
53+
if [ -n "${HOMEBOY_SERVER_ID:-}" ]; then
54+
printf '%s' "$HOMEBOY_SERVER_ID"
55+
return 0
56+
fi
57+
58+
if [ "$DRY_RUN" = false ] && homeboy server show "$SITE_DOMAIN" >/dev/null 2>&1; then
59+
printf '%s' "$SITE_DOMAIN"
60+
fi
61+
62+
return 0
63+
}
64+
65+
ensure_homeboy_local_server() {
66+
if [ "$LOCAL_MODE" != true ]; then
67+
return 0
68+
fi
69+
70+
if [ "$DRY_RUN" = true ]; then
71+
echo -e "${BLUE}[dry-run]${NC} homeboy server set local --json '{\"host\":\"localhost\",\"user\":\"$(whoami)\",\"port\":22}'"
72+
return 0
73+
fi
74+
75+
if homeboy server show local >/dev/null 2>&1; then
76+
homeboy server set local --json "$(homeboy_server_json "$(whoami)" 22)" >/dev/null
77+
else
78+
homeboy server create local --host localhost --user "$(whoami)" --port 22 >/dev/null
79+
fi
80+
}
81+
82+
setup_homeboy_project() {
83+
if [ "${HOMEBOY_MODE:-auto}" = "disabled" ]; then
84+
log "Skipping Homeboy project setup (--no-homeboy)"
85+
return 0
86+
fi
87+
88+
if ! command -v homeboy >/dev/null 2>&1; then
89+
if [ "${HOMEBOY_MODE:-auto}" = "enabled" ]; then
90+
error "Homeboy project setup requested, but the 'homeboy' command was not found"
91+
fi
92+
log "Skipping Homeboy project setup (homeboy not installed)"
93+
return 0
94+
fi
95+
96+
local project_id server_id spec
97+
project_id="$(homeboy_project_id)"
98+
HOMEBOY_PROJECT_ID="$project_id"
99+
server_id="$(homeboy_server_id)"
100+
HOMEBOY_SERVER_ID_RESOLVED="$server_id"
101+
spec="$(homeboy_project_json "$SITE_DOMAIN" "$SITE_PATH" "$server_id")"
102+
103+
log "Phase 4.6: Creating/updating Homeboy project '$project_id' for WordPress site"
104+
log "Homeboy project target: domain=$SITE_DOMAIN path=$SITE_PATH${server_id:+ server=$server_id}"
105+
106+
ensure_homeboy_local_server
107+
108+
if [ "$DRY_RUN" = true ]; then
109+
echo -e "${BLUE}[dry-run]${NC} homeboy project set $project_id --json '$spec' || homeboy project create $project_id $SITE_DOMAIN --base-path '$SITE_PATH'${server_id:+ --server-id $server_id}"
110+
return 0
111+
fi
112+
113+
if homeboy project show "$project_id" >/dev/null 2>&1; then
114+
homeboy project set "$project_id" --json "$spec" >/dev/null
115+
log "Updated Homeboy project '$project_id'"
116+
else
117+
if [ -n "$server_id" ]; then
118+
homeboy project create "$project_id" "$SITE_DOMAIN" --base-path "$SITE_PATH" --server-id "$server_id" >/dev/null
119+
else
120+
homeboy project create "$project_id" "$SITE_DOMAIN" --base-path "$SITE_PATH" >/dev/null
121+
fi
122+
log "Created Homeboy project '$project_id'"
123+
fi
124+
}

lib/summary.sh

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,16 @@ print_summary() {
3737
echo " Code tools: data-machine-code (workspace, GitHub, git)"
3838
echo " Workspace: $DM_WORKSPACE_DIR (created on first use)"
3939
echo ""
40+
if [ "${HOMEBOY_MODE:-auto}" != "disabled" ] && [ -n "${HOMEBOY_PROJECT_ID:-}" ]; then
41+
echo "Homeboy:"
42+
echo " Project: $HOMEBOY_PROJECT_ID"
43+
echo " Site path: $SITE_PATH"
44+
if [ -n "${HOMEBOY_SERVER_ID_RESOLVED:-}" ]; then
45+
echo " Server: $HOMEBOY_SERVER_ID_RESOLVED"
46+
fi
47+
echo " Show: homeboy project show $HOMEBOY_PROJECT_ID"
48+
echo ""
49+
fi
4050
echo "Agent:"
4151
if [ "$LOCAL_MODE" = true ]; then
4252
echo " User: $(whoami) (local)"

setup.sh

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ set -e
2222
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
2323

2424
# Source shared modules
25-
for lib in common detect wordpress infrastructure data-machine skills summary; do
25+
for lib in common detect wordpress infrastructure data-machine homeboy skills summary; do
2626
source "$SCRIPT_DIR/lib/${lib}.sh"
2727
done
2828

@@ -58,6 +58,8 @@ INSTALL_SKILLS=true
5858
SKILLS_ONLY=false
5959
RUNTIME_ONLY=false
6060
RUNTIME=""
61+
HOMEBOY_MODE="auto"
62+
HOMEBOY_PROJECT_ID="${HOMEBOY_PROJECT_ID:-}"
6163
DETECTED_RUNTIMES=()
6264
IS_STUDIO=false
6365

@@ -124,6 +126,18 @@ while [[ $# -gt 0 ]]; do
124126
INSTALL_SKILLS=false
125127
shift
126128
;;
129+
--with-homeboy)
130+
HOMEBOY_MODE="enabled"
131+
shift
132+
;;
133+
--no-homeboy)
134+
HOMEBOY_MODE="disabled"
135+
shift
136+
;;
137+
--homeboy-project-id)
138+
HOMEBOY_PROJECT_ID="$2"
139+
shift 2
140+
;;
127141
--runtime-only)
128142
RUNTIME_ONLY=true
129143
MODE="existing"
@@ -185,6 +199,10 @@ OPTIONS:
185199
--multisite Convert to WordPress Multisite (subdirectory by default)
186200
--subdomain Use subdomain multisite (requires wildcard DNS; use with --multisite)
187201
--no-skills Skip WordPress agent skills installation
202+
--with-homeboy Create/update a Homeboy project for this WordPress site
203+
--no-homeboy Skip Homeboy project setup, even if homeboy is installed
204+
--homeboy-project-id <id>
205+
Override Homeboy project ID (default: agent/site slug)
188206
--skills-only Only run skills installation on existing site
189207
--skip-ssl Skip SSL/HTTPS configuration
190208
--root Run agent as root (default)
@@ -201,6 +219,8 @@ ENVIRONMENT VARIABLES:
201219
DB_PASS Database password (auto-generated if not set)
202220
AGENT_SLUG Override agent slug (default: derived from domain)
203221
AGENT_NAME Override agent display name (default: blogname)
222+
HOMEBOY_PROJECT_ID Override Homeboy project ID (default: agent/site slug)
223+
HOMEBOY_SERVER_ID Homeboy server ID for VPS project registration
204224
OPENCODE_MODEL Override default model (e.g., anthropic/claude-sonnet-4-20250514)
205225
OPENCODE_SMALL_MODEL Override small model (e.g., anthropic/claude-haiku-4-5)
206226
KIMAKI_BOT_TOKEN Discord bot token (skip interactive setup)
@@ -299,6 +319,7 @@ if [ "$RUNTIME_ONLY" != true ]; then
299319
install_data_machine
300320
create_dm_agent
301321
install_extra_plugins
322+
setup_homeboy_project
302323
setup_nginx
303324
setup_ssl
304325
setup_service_permissions

0 commit comments

Comments
 (0)