-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall-roach.sh
More file actions
197 lines (174 loc) · 5.59 KB
/
Copy pathinstall-roach.sh
File metadata and controls
197 lines (174 loc) · 5.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#!/usr/bin/env bash
# ForgeFlow installer for Roach Code
# Usage: bash <(curl -sL https://raw.githubusercontent.com/gimso2x/forgeflow/main/install-roach.sh)
#
# Or: bash install-roach.sh # from a forgeflow clone
# bash install-roach.sh --update # force update existing install
set -euo pipefail
REPO="https://github.com/gimso2x/forgeflow.git"
FORGEFLOW_DIR="${FORGEFLOW_DIR:-$HOME/.forgeflow/repo}"
SKILL_TARGET="${SKILL_TARGET:-$HOME/.roach-code/skills/forgeflow}"
CONFIG_FILE=""
# --- Detect OS and config path ---
detect_config() {
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "win32" || "$(uname -s)" == *"MINGW"* || "$(uname -s)" == *"CYGWIN"* ]]; then
# Windows (Git Bash / MSYS2)
local win_home
win_home="$(cd "$USERPROFILE" 2>/dev/null && pwd)" || win_home="$HOME"
CONFIG_FILE="${win_home}/roach-code.toml"
elif [[ "$(uname -s)" == "Darwin" ]]; then
CONFIG_FILE="$HOME/.config/roach-code/config.toml"
# fallback
if [[ ! -f "$CONFIG_FILE" ]]; then
CONFIG_FILE="$HOME/roach-code.toml"
fi
else
CONFIG_FILE="$HOME/.config/roach-code/config.toml"
if [[ ! -f "$CONFIG_FILE" ]]; then
CONFIG_FILE="$HOME/roach-code.toml"
fi
fi
# Check workspace-local config too
if [[ -f "./roach-code.toml" ]]; then
CONFIG_FILE="./roach-code.toml"
fi
}
# --- Clone or update repo ---
clone_or_update() {
if [[ -d "$FORGEFLOW_DIR/.git" ]]; then
echo " Updating forgeflow repo..."
git -C "$FORGEFLOW_DIR" pull --ff-only || {
echo "ERROR: git pull failed. Remove $FORGEFLOW_DIR and retry."
exit 1
}
else
echo " Cloning forgeflow repo..."
mkdir -p "$(dirname "$FORGEFLOW_DIR")"
git clone --depth 1 "$REPO" "$FORGEFLOW_DIR"
fi
}
# --- Copy files ---
install_skills() {
echo " Installing to $SKILL_TARGET..."
mkdir -p "$SKILL_TARGET"
# Copy skill directories
for dir in skills/*/; do
local name
name="$(basename "$dir")"
mkdir -p "$SKILL_TARGET/$name"
cp -r "$dir"* "$SKILL_TARGET/$name/" 2>/dev/null || true
done
# Copy skill root files
cp skills/SKILLS.md "$SKILL_TARGET/" 2>/dev/null || true
cp skills/_template.md "$SKILL_TARGET/" 2>/dev/null || true
# Copy templates, scripts, docs
mkdir -p "$SKILL_TARGET/templates"
cp -r templates/* "$SKILL_TARGET/templates/" 2>/dev/null || true
mkdir -p "$SKILL_TARGET/scripts"
cp -r scripts/* "$SKILL_TARGET/scripts/" 2>/dev/null || true
mkdir -p "$SKILL_TARGET/docs"
cp -r docs/* "$SKILL_TARGET/docs/" 2>/dev/null || true
echo " Skills, templates, scripts, docs copied."
}
# --- Update roach-code.toml ---
update_config() {
if [[ -z "$CONFIG_FILE" || ! -f "$CONFIG_FILE" ]]; then
echo ""
echo " No roach-code.toml found. Add this to your config manually:"
echo ""
echo ' [skills]'
echo " paths = [\"$(echo "$SKILL_TARGET" | sed "s|$HOME|~|")\"]"
echo ""
return
fi
# Normalize path for toml (use forward slashes, $HOME → ~)
local pretty_path
pretty_path="$(echo "$SKILL_TARGET" | sed "s|$HOME|~|")"
if grep -q '\[skills\]' "$CONFIG_FILE"; then
if grep -q 'paths.*=' "$CONFIG_FILE"; then
# paths already exists — check if forgeflow is there
if grep -q 'forgeflow' "$CONFIG_FILE"; then
echo " roach-code.toml already has forgeflow skill path."
else
echo " WARNING: [skills] paths exists but doesn't include forgeflow."
echo " Add this path: $pretty_path"
fi
else
# [skills] exists but no paths — add it
# Use a portable approach
local tmp
tmp="$(mktemp)"
awk -v path="$pretty_path" '
/^\[skills\]/ { print; print "paths = [" path "]"; next }
{ print }
' "$CONFIG_FILE" > "$tmp" && mv "$tmp" "$CONFIG_FILE"
echo " Added paths to [skills] in $CONFIG_FILE"
fi
else
# No [skills] section — append
echo "" >> "$CONFIG_FILE"
echo "[skills]" >> "$CONFIG_FILE"
echo "paths = [\"$pretty_path\"]" >> "$CONFIG_FILE"
echo " Added [skills] section to $CONFIG_FILE"
fi
}
# --- Main ---
main() {
echo ""
echo " ForgeFlow installer for Roach Code"
echo " ==================================="
echo ""
# If running from inside a forgeflow clone, use local files
if [[ -f "skills/forgeflow/SKILL.md" && -f "VERSION" ]]; then
echo " Detected local forgeflow clone."
FORGEFLOW_DIR="$(pwd)"
cd "$FORGEFLOW_DIR"
else
detect_config
clone_or_update
cd "$FORGEFLOW_DIR"
fi
install_skills
detect_config
update_config
# --- Post-install smoke test ---
echo ""
echo " Running post-install smoke test..."
local smoke_pass=true
# Check core skill files exist
for f in \
"$SKILL_TARGET/forgeflow/SKILL.md" \
"$SKILL_TARGET/clarify/SKILL.md" \
"$SKILL_TARGET/templates/brief.md" \
"$SKILL_TARGET/templates/run-state.json"; do
if [[ ! -f "$f" ]]; then
echo " WARNING: Missing file: $f"
smoke_pass=false
fi
done
# Check scripts are present
if [[ -f "$SKILL_TARGET/scripts/forgeflow_storage.py" ]]; then
if python3 "$SKILL_TARGET/scripts/forgeflow_storage.py" --help >/dev/null 2>&1; then
echo " forgeflow_storage.py: OK"
else
echo " WARNING: forgeflow_storage.py failed --help check"
smoke_pass=false
fi
fi
if $smoke_pass; then
echo " Smoke test: PASS"
else
echo " Smoke test: WARNINGS (see above). Installation may be incomplete."
fi
echo ""
echo " Done!"
echo ""
echo " Usage:"
echo " /forgeflow:ff-loop \"your task description\""
echo " /forgeflow:clarify \"your task\""
echo ""
echo " Update:"
echo " bash $FORGEFLOW_DIR/install-roach.sh --update"
echo ""
}
main "$@"