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/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.3 (CLI Mode)"
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
- # --- Smart Model Discovery ---
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" "$@"