#!/usr/bin/env bash # ============================================ # Workspace Command # ============================================ # # Drops into a subshell with all driver commands # AND all static dx commands available as plain # functions — no 'dx' prefix needed. # # The prompt changes to signal you are inside # the dx workspace. # # Usage: # dx workspace # dx ws function cmd::workspace::run() { local framework framework="$(app::framework)" local driver driver="$(driver::resolve)" local driver_file driver_file="$(ctx::dxkit)/drivers/${driver}/driver.sh" if [[ ! -f "$driver_file" ]]; then log::error "No driver found for framework '${framework}' (resolved: ${driver})" log::error "Cannot start dx workspace without an active driver." return 1 fi local rc_file rc_file="$(mktemp /tmp/dx-workspace-rc.XXXXXX)" cat > "$rc_file" </dev/null || true elif [[ -f "\$HOME/.bash_profile" ]]; then source "\$HOME/.bash_profile" 2>/dev/null || true fi # Load dxkit bootstrap — sources core, detects platform, # applies MSYS2 guards, and defines dx::load_modules source "$(ctx::dxkit)/bootstrap.sh" # Set framework before loading app so app::on_load # resolves the correct framework module export APP_FRAMEWORK="${framework}" # Load all standard modules (mirrors dx entrypoint) dx::load_modules load_module app env::load_env_files # Source the active driver so its functions are in scope source "${driver_file}" # ============================================ # Driver command wrappers (run in-process) # e.g. migrate-create → yii2::migrate::create # ============================================ $( for cmd in "${!DRIVER_COMMANDS[@]}"; do echo "function ${cmd}() { ${DRIVER_COMMANDS[$cmd]} \"\$@\"; }" done ) # ============================================ # Static dx command wrappers (subprocess) # Uses \$PROJECT_ROOT/dx to avoid path mangling # on Windows/MSYS2 — PROJECT_ROOT is exported # by bootstrap so it is always available here. # ============================================ $( while IFS= read -r -d '' cmd_file; do cmd_name="$(basename "$cmd_file" .command.sh)" [[ "$cmd_name" == "workspace" ]] && continue echo "function ${cmd_name}() { \"\$PROJECT_ROOT/dx\" ${cmd_name} \"\$@\"; }" done < <(find "$(ctx::dxkit)/commands" -name "*.command.sh" -print0) ) # ============================================ # Prompt # ============================================ export PS1="\[\033[0;36m\][dx:${driver}]\[\033[0m\] \w \$ " # ============================================ # Welcome # ============================================ echo "" echo " dx workspace — ${framework}" echo " Type 'exit' to return to your shell." echo "" echo " Framework commands:" $( for cmd in $(echo "${!DRIVER_COMMANDS[@]}" | tr ' ' '\n' | sort); do echo " echo \" ${cmd}\"" done ) echo "" RCEOF bash --rcfile "$rc_file" -i rm -f "$rc_file" } function cmd::workspace::help() { local framework framework="$(app::framework)" cat <