vibepup 1.0.3 β 1.0.4
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 +51 -0
- package/bin/ralph.js +24 -24
- package/lib/ralph-win.js +4 -397
- package/lib/ralph.sh +2 -264
- package/lib/runner/index.js +578 -0
- package/package.json +8 -3
- package/test/cli.test.js +139 -0
- package/tui/go.mod +14 -9
- package/tui/go.sum +6 -0
- package/tui/main_test.go +58 -0
- package/tui/vibepup-tui +0 -0
- package/vibepup-1.0.3.tgz +0 -0
package/lib/ralph.sh
CHANGED
|
@@ -87,7 +87,7 @@ while [[ "$#" -gt 0 ]]; do
|
|
|
87
87
|
esac
|
|
88
88
|
done
|
|
89
89
|
|
|
90
|
-
echo "πΎ Vibepup v1.0.
|
|
90
|
+
echo "πΎ Vibepup v1.0.4 (CLI Mode)"
|
|
91
91
|
echo " Engine: $ENGINE_DIR"
|
|
92
92
|
echo " Context: $PROJECT_DIR"
|
|
93
93
|
|
|
@@ -142,266 +142,4 @@ if [[ "$FREE_MODE" == "true" ]]; then
|
|
|
142
142
|
exit 0
|
|
143
143
|
fi
|
|
144
144
|
|
|
145
|
-
|
|
146
|
-
get_available_models() {
|
|
147
|
-
local PREF_MODELS=("$@")
|
|
148
|
-
local AVAILABLE_MODELS=("${PREF_MODELS[@]}")
|
|
149
|
-
|
|
150
|
-
# Refresh models cache silently (ignoring errors) to ensure CLI is ready
|
|
151
|
-
opencode models --refresh >/dev/null 2>&1 || true
|
|
152
|
-
|
|
153
|
-
# Always add a reliable fallback at the end if not present
|
|
154
|
-
if [[ ! " ${AVAILABLE_MODELS[*]} " =~ " opencode/grok-code " ]]; then
|
|
155
|
-
AVAILABLE_MODELS+=("opencode/grok-code")
|
|
156
|
-
fi
|
|
157
|
-
|
|
158
|
-
echo "${AVAILABLE_MODELS[@]}"
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
echo " Configuring Build Models..."
|
|
162
|
-
read -r -a BUILD_MODELS <<< "$(get_available_models "${BUILD_MODELS_PREF[@]}")"
|
|
163
|
-
echo " Build Chain: ${BUILD_MODELS[*]}"
|
|
164
|
-
|
|
165
|
-
echo " Configuring Plan Models..."
|
|
166
|
-
read -r -a PLAN_MODELS <<< "$(get_available_models "${PLAN_MODELS_PREF[@]}")"
|
|
167
|
-
echo " Plan Chain: ${PLAN_MODELS[*]}"
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
# --- Phase 0: The Architect (Genesis) ---
|
|
171
|
-
if [ "$MODE" == "new" ]; then
|
|
172
|
-
echo ""
|
|
173
|
-
echo "ποΈ Phase 0: The Architect"
|
|
174
|
-
echo " Idea: $PROJECT_IDEA"
|
|
175
|
-
|
|
176
|
-
ARCHITECT_MODEL="${PLAN_MODELS[0]}"
|
|
177
|
-
echo " Using: $ARCHITECT_MODEL"
|
|
178
|
-
|
|
179
|
-
# NOTE: We assume agents/architect.md is in lib/agents/
|
|
180
|
-
opencode run "PROJECT IDEA: $PROJECT_IDEA" \
|
|
181
|
-
--file "$ENGINE_DIR/agents/architect.md" \
|
|
182
|
-
--model "$ARCHITECT_MODEL"
|
|
183
|
-
|
|
184
|
-
echo "β
Architect initialization complete."
|
|
185
|
-
fi
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
# --- Initialization & Migration ---
|
|
189
|
-
if [ ! -f "$PROJECT_DIR/prd.md" ]; then
|
|
190
|
-
if [ -f "$PROJECT_DIR/prd.json" ]; then
|
|
191
|
-
echo "π Migrating legacy prd.json to prd.md..."
|
|
192
|
-
jq -r '.[] | "- [ ] " + .description' "$PROJECT_DIR/prd.json" > "$PROJECT_DIR/prd.md"
|
|
193
|
-
mv "$PROJECT_DIR/prd.json" "$PROJECT_DIR/prd.json.bak"
|
|
194
|
-
else
|
|
195
|
-
echo "β οΈ No prd.md found. Initializing..."
|
|
196
|
-
cat > "$PROJECT_DIR/prd.md" <<INNEREOF
|
|
197
|
-
# Product Requirements Document (PRD)
|
|
198
|
-
|
|
199
|
-
- [ ] Initialize repo-map.md with project architecture
|
|
200
|
-
- [ ] Setup initial project structure
|
|
201
|
-
INNEREOF
|
|
202
|
-
fi
|
|
203
|
-
fi
|
|
204
|
-
|
|
205
|
-
if [ ! -f "$PROJECT_DIR/repo-map.md" ]; then
|
|
206
|
-
touch "$PROJECT_DIR/repo-map.md"
|
|
207
|
-
fi
|
|
208
|
-
|
|
209
|
-
if [ ! -f "$PROJECT_DIR/prd.state.json" ]; then
|
|
210
|
-
echo "{}" > "$PROJECT_DIR/prd.state.json"
|
|
211
|
-
fi
|
|
212
|
-
|
|
213
|
-
touch "$PROJECT_DIR/progress.log"
|
|
214
|
-
|
|
215
|
-
# --- Helper Functions ---
|
|
216
|
-
|
|
217
|
-
detect_phase() {
|
|
218
|
-
if [ ! -s "$PROJECT_DIR/repo-map.md" ]; then
|
|
219
|
-
echo "PLAN"
|
|
220
|
-
return
|
|
221
|
-
fi
|
|
222
|
-
echo "BUILD"
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
get_current_prd_hash() {
|
|
226
|
-
md5sum "$PROJECT_DIR/prd.md" | awk '{print $1}'
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
prepare_iteration_context() {
|
|
230
|
-
local ITER_ID="$1"
|
|
231
|
-
local ITER_DIR="$RUNS_DIR/$ITER_ID"
|
|
232
|
-
mkdir -p "$ITER_DIR"
|
|
233
|
-
|
|
234
|
-
tail -n 200 "$PROJECT_DIR/progress.log" > "$ITER_DIR/progress.tail.log"
|
|
235
|
-
|
|
236
|
-
rm -f "$RUNS_DIR/latest"
|
|
237
|
-
ln -s "$ITER_DIR" "$RUNS_DIR/latest"
|
|
238
|
-
|
|
239
|
-
echo "$ITER_DIR"
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
run_with_watchdog () {
|
|
243
|
-
local log="$1"; shift
|
|
244
|
-
: > "$log"
|
|
245
|
-
|
|
246
|
-
# run in background and capture output
|
|
247
|
-
( "$@" 2>&1 | tee -a "$log" ) &
|
|
248
|
-
local pid=$!
|
|
249
|
-
local start=$(date +%s)
|
|
250
|
-
local last=$start
|
|
251
|
-
local last_size=0
|
|
252
|
-
|
|
253
|
-
while kill -0 "$pid" 2>/dev/null; do
|
|
254
|
-
sleep 5
|
|
255
|
-
local now=$(date +%s)
|
|
256
|
-
local size=$(wc -c < "$log" 2>/dev/null || echo 0)
|
|
257
|
-
|
|
258
|
-
if (( size != last_size )); then
|
|
259
|
-
last="$now"
|
|
260
|
-
last_size="$size"
|
|
261
|
-
fi
|
|
262
|
-
|
|
263
|
-
if (( now - start > RALPH_MAX_TURN_SECONDS )); then
|
|
264
|
-
echo "[RALPH] TIMEOUT: killing opencode turn" >> "$log"
|
|
265
|
-
kill -INT "$pid" 2>/dev/null || true
|
|
266
|
-
sleep 3
|
|
267
|
-
kill -TERM "$pid" 2>/dev/null || true
|
|
268
|
-
sleep 1
|
|
269
|
-
kill -KILL "$pid" 2>/dev/null || true
|
|
270
|
-
return 124
|
|
271
|
-
fi
|
|
272
|
-
|
|
273
|
-
if (( now - last > RALPH_NO_OUTPUT_SECONDS )); then
|
|
274
|
-
echo "[RALPH] NO OUTPUT: likely waiting for input / hung tool" >> "$log"
|
|
275
|
-
kill -INT "$pid" 2>/dev/null || true
|
|
276
|
-
sleep 3
|
|
277
|
-
kill -TERM "$pid" 2>/dev/null || true
|
|
278
|
-
sleep 1
|
|
279
|
-
kill -KILL "$pid" 2>/dev/null || true
|
|
280
|
-
return 125
|
|
281
|
-
fi
|
|
282
|
-
done
|
|
283
|
-
|
|
284
|
-
wait "$pid"
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
run_agent() {
|
|
288
|
-
local MODEL="$1"
|
|
289
|
-
local PHASE="$2"
|
|
290
|
-
local ITER_DIR="$3"
|
|
291
|
-
|
|
292
|
-
local SYSTEM_PROMPT="$ENGINE_DIR/prompt.md"
|
|
293
|
-
local PROMPT_SUFFIX=""
|
|
294
|
-
local EXTRA_ARGS=()
|
|
295
|
-
|
|
296
|
-
if [ "$DESIGN_MODE" == "true" ]; then
|
|
297
|
-
echo " π¨ Design Mode Active: Injecting frontend-design skill..."
|
|
298
|
-
EXTRA_ARGS+=( "--file" "$HOME/.config/opencode/skills/frontend-design.md" )
|
|
299
|
-
PROMPT_SUFFIX="MODE: DESIGN + BUILD. Apply the frontend-design skill guidelines to all work."
|
|
300
|
-
elif [ "$PHASE" == "PLAN" ]; then
|
|
301
|
-
PROMPT_SUFFIX="MODE: PLAN. Focus on exploring and mapping. Do NOT write implementation code yet."
|
|
302
|
-
else
|
|
303
|
-
PROMPT_SUFFIX="MODE: BUILD. Focus on completing tasks in prd.md."
|
|
304
|
-
fi
|
|
305
|
-
|
|
306
|
-
echo " Thinking..."
|
|
307
|
-
|
|
308
|
-
run_with_watchdog "$ITER_DIR/agent_response.txt" \
|
|
309
|
-
opencode run "Proceed with task. $PROMPT_SUFFIX" \
|
|
310
|
-
--file "$SYSTEM_PROMPT" \
|
|
311
|
-
--file "$PROJECT_DIR/prd.md" \
|
|
312
|
-
--file "$PROJECT_DIR/prd.state.json" \
|
|
313
|
-
--file "$PROJECT_DIR/repo-map.md" \
|
|
314
|
-
--file "$ITER_DIR/progress.tail.log" \
|
|
315
|
-
"${EXTRA_ARGS[@]}" \
|
|
316
|
-
--model "$MODEL"
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
# --- Main Loop ---
|
|
320
|
-
LAST_HASH=$(get_current_prd_hash)
|
|
321
|
-
i=1
|
|
322
|
-
|
|
323
|
-
while true; do
|
|
324
|
-
# Watch Mode Check
|
|
325
|
-
# Only restart if hash changed EXTERNALLY (since last accepted state)
|
|
326
|
-
CURRENT_HASH=$(get_current_prd_hash)
|
|
327
|
-
if [[ "$CURRENT_HASH" != "$LAST_HASH" ]]; then
|
|
328
|
-
echo "π PRD Changed! Restarting loop..."
|
|
329
|
-
echo "--- PRD CHANGED: RESTARTING LOOP ---" >> "$PROJECT_DIR/progress.log"
|
|
330
|
-
LAST_HASH="$CURRENT_HASH"
|
|
331
|
-
|
|
332
|
-
# Only reset counter if we are in infinite watch mode
|
|
333
|
-
if [[ "$WATCH_MODE" == "true" ]]; then
|
|
334
|
-
i=1
|
|
335
|
-
fi
|
|
336
|
-
fi
|
|
337
|
-
|
|
338
|
-
if [[ "$WATCH_MODE" != "true" ]] && ((i > ITERATIONS)); then
|
|
339
|
-
echo "βΈοΈ Max iterations reached."
|
|
340
|
-
break
|
|
341
|
-
fi
|
|
342
|
-
|
|
343
|
-
PHASE=$(detect_phase)
|
|
344
|
-
ITER_ID=$(printf "iter-%04d" $i)
|
|
345
|
-
ITER_DIR=$(prepare_iteration_context "$ITER_ID")
|
|
346
|
-
|
|
347
|
-
echo ""
|
|
348
|
-
echo "π Loop $i ($PHASE Phase)"
|
|
349
|
-
echo " Logs: $ITER_DIR"
|
|
350
|
-
|
|
351
|
-
if [ "$PHASE" == "PLAN" ]; then
|
|
352
|
-
MODELS=("${PLAN_MODELS[@]}")
|
|
353
|
-
else
|
|
354
|
-
MODELS=("${BUILD_MODELS[@]}")
|
|
355
|
-
fi
|
|
356
|
-
|
|
357
|
-
echo " Queue: ${MODELS[*]}"
|
|
358
|
-
SUCCESS=false
|
|
359
|
-
for MODEL in "${MODELS[@]}"; do
|
|
360
|
-
echo " Using: $MODEL"
|
|
361
|
-
set +e
|
|
362
|
-
run_agent "$MODEL" "$PHASE" "$ITER_DIR"
|
|
363
|
-
EXIT_CODE=$?
|
|
364
|
-
set -e
|
|
365
|
-
|
|
366
|
-
RESPONSE=$(cat "$ITER_DIR/agent_response.txt")
|
|
367
|
-
|
|
368
|
-
if echo "$RESPONSE" | grep -Eiq "not supported|ModelNotFoundError|Make sure the model is enabled"; then
|
|
369
|
-
echo " β οΈ Model $MODEL not supported. Falling back..."
|
|
370
|
-
continue
|
|
371
|
-
fi
|
|
372
|
-
|
|
373
|
-
if [ $EXIT_CODE -eq 0 ] && [ -n "$RESPONSE" ]; then
|
|
374
|
-
SUCCESS=true
|
|
375
|
-
echo "$RESPONSE"
|
|
376
|
-
|
|
377
|
-
if echo "$RESPONSE" | grep -q "<promise>COMPLETE</promise>"; then
|
|
378
|
-
echo "β
Agent signaled completion."
|
|
379
|
-
if [[ "$WATCH_MODE" != "true" ]]; then
|
|
380
|
-
exit 0
|
|
381
|
-
else
|
|
382
|
-
echo "βΈοΈ Project Complete. Waiting for changes in prd.md..."
|
|
383
|
-
while [[ "$(get_current_prd_hash)" == "$LAST_HASH" ]]; do
|
|
384
|
-
sleep 2
|
|
385
|
-
done
|
|
386
|
-
echo "π Change detected! Resuming..."
|
|
387
|
-
i=1
|
|
388
|
-
continue
|
|
389
|
-
fi
|
|
390
|
-
fi
|
|
391
|
-
break
|
|
392
|
-
else
|
|
393
|
-
echo " β οΈ Model $MODEL failed (Exit: $EXIT_CODE). Falling back..."
|
|
394
|
-
fi
|
|
395
|
-
done
|
|
396
|
-
|
|
397
|
-
if [ "$SUCCESS" = false ]; then
|
|
398
|
-
echo "β All models failed this iteration."
|
|
399
|
-
sleep 2
|
|
400
|
-
fi
|
|
401
|
-
|
|
402
|
-
# Sync hash AFTER run so self-edits don't trigger restart
|
|
403
|
-
LAST_HASH=$(get_current_prd_hash)
|
|
404
|
-
|
|
405
|
-
((i++))
|
|
406
|
-
sleep 1
|
|
407
|
-
done
|
|
145
|
+
exec node "$(dirname "$0")/runner/index.js" "$@"
|