ContextStudioWizard/wizard.sh
Karamelmar 48011dd915 Show prominent cd command after wizard completes
- Print green "Enter your project now: cd <path>" at the top of next steps
- Add "(must be inside the project folder)" note to CLI option

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 12:18:30 +01:00

161 lines
7.2 KiB
Bash
Executable file

#!/usr/bin/env bash
# ╔══════════════════════════════════════════════════════════════════╗
# ║ Context Studio Wizard — Project Setup ║
# ╚══════════════════════════════════════════════════════════════════╝
set -uo pipefail
WIZARD_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$WIZARD_DIR/lib/utils.sh"
source "$WIZARD_DIR/lib/prereqs.sh"
source "$WIZARD_DIR/lib/core.sh"
source "$WIZARD_DIR/lib/project.sh"
source "$WIZARD_DIR/lib/workflow.sh"
# ── Find existing projects base dir ───────────────────────────────────────
find_projects_dir() {
local candidates=("Projects" "projects" "Project" "project" "Dev" "dev" "Workspace" "workspace" "Code" "code" "src" "Src")
for candidate in "${candidates[@]}"; do
if [[ -d "$HOME/$candidate" ]]; then
echo "$HOME/$candidate"
return
fi
done
echo "$HOME/Projects"
}
# ── Project info ───────────────────────────────────────────────────────────
collect_project_info() {
header "Project Details"
ask PROJECT_NAME "Project name" ""
if [[ -z "$PROJECT_NAME" ]]; then die "Project name is required."; fi
local projects_base
projects_base="$(find_projects_dir)"
local default_dir="$projects_base/$(slugify "$PROJECT_NAME")"
ask PROJECT_DIR "Project location" "$default_dir"
if [[ -z "$PROJECT_DIR" ]]; then die "Project location is required."; fi
PROJECT_DIR="${PROJECT_DIR/#\~/$HOME}"
if [[ -e "$PROJECT_DIR" ]]; then
warn "Directory already exists: $PROJECT_DIR"
ask_yn _continue "Continue anyway?" "n"
if [[ "$_continue" != "y" ]]; then die "Aborted."; fi
fi
}
# ── Workflow source ────────────────────────────────────────────────────────
collect_workflow_info() {
header "Workflow Configuration"
ask_choice WORKFLOW_SOURCE "How do you want to configure your workflow?" \
"Generate from scratch" \
"Clone from existing repo"
if [[ "$WORKFLOW_SOURCE" == "Clone from existing repo" ]]; then
ask WORKFLOW_REPO "Workflow repo URL" ""
if [[ -z "$WORKFLOW_REPO" ]]; then die "Repo URL is required."; fi
else
ask PROJECT_DESC "Project description" "A software project"
ask TECH_STACK "Tech stack (e.g. Node.js, Rust, Python)" "Node.js"
ask_choice AGENT_PRESET "Agent preset" \
"minimal (5 agents: coordinator, 2 coders, researcher, tester)" \
"standard (9 agents: 2 coordinators, 3 coders, 2 researchers, tester, reviewer)"
case "$AGENT_PRESET" in
minimal*) AGENT_PRESET="minimal" ;;
*) AGENT_PRESET="standard" ;;
esac
fi
}
# ── Summary & confirm ──────────────────────────────────────────────────────
confirm_summary() {
header "Summary"
echo -e " ${BOLD}Project name${RESET} : $PROJECT_NAME"
echo -e " ${BOLD}Location${RESET} : $PROJECT_DIR"
echo -e " ${BOLD}Core${RESET} : $CS_CORE_DIR"
if [[ "${WORKFLOW_SOURCE:-}" == "Clone from existing repo" ]]; then
echo -e " ${BOLD}Workflow${RESET} : clone ${WORKFLOW_REPO:-}"
else
echo -e " ${BOLD}Workflow${RESET} : generate (${AGENT_PRESET:-minimal} preset)"
echo -e " ${BOLD}Description${RESET} : ${PROJECT_DESC:-}"
echo -e " ${BOLD}Tech stack${RESET} : ${TECH_STACK:-}"
fi
echo ""
ask_yn _ok "Create project?" "y"
if [[ "$_ok" != "y" ]]; then die "Aborted."; fi
}
# ── Build ──────────────────────────────────────────────────────────────────
build_project() {
header "Building Project"
create_project_structure "$PROJECT_DIR" "$PROJECT_NAME"
create_devcontainer "$PROJECT_DIR" "$PROJECT_NAME"
if [[ "${WORKFLOW_SOURCE:-}" == "Clone from existing repo" ]]; then
clone_workflow "$PROJECT_DIR" "${WORKFLOW_REPO:-}"
else
generate_workflow "$PROJECT_DIR" "$PROJECT_NAME" \
"${PROJECT_DESC:-A software project}" \
"${TECH_STACK:-Node.js}" \
"${AGENT_PRESET:-minimal}"
fi
git -C "$PROJECT_DIR" init -q
git -C "$PROJECT_DIR" add .
git -C "$PROJECT_DIR" commit -q -m "Initial project setup via Context Studio Wizard"
success "Git repo initialized"
}
# ── Done ───────────────────────────────────────────────────────────────────
print_next_steps() {
local slug
slug="$(slugify "$PROJECT_NAME")"
header "Done!"
success "Project created at: $PROJECT_DIR"
echo ""
echo -e "${BOLD}${GREEN} ➜ Enter your project now:${RESET}"
echo -e "${BOLD}${CYAN} cd \"$PROJECT_DIR\"${RESET}"
echo ""
echo -e "${BOLD}Next steps:${RESET}"
echo ""
echo -e " ${CYAN}Option A — VS Code devcontainer:${RESET}"
echo -e " code \"$PROJECT_DIR\""
echo -e " → \"Reopen in Container\""
echo ""
echo -e " ${CYAN}Option B — CLI (must be inside the project folder):${RESET}"
echo -e " cd \"$PROJECT_DIR\""
echo -e " $CONTAINER_CMD build -t $slug .devcontainer/"
echo -e " $CONTAINER_CMD run -it --rm \\"
echo -e " -v \"\$(pwd)\":/workspace \\"
echo -e " -v \"\$HOME/.context-studio/core\":/opt/context-studio/core \\"
echo -e " -e ANTHROPIC_API_KEY=\"\$ANTHROPIC_API_KEY\" \\"
echo -e " $slug bash"
echo ""
echo -e " ${CYAN}Inside container — start Context Studio:${RESET}"
echo -e " node \$CS_CORE_DIR/core/start.js"
echo -e " # or headless (no Electron):"
echo -e " node \$CS_CORE_DIR/core/start.js --ui-mode=headless"
echo ""
}
# ── Main ───────────────────────────────────────────────────────────────────
main() {
echo ""
echo -e "${BOLD}${CYAN}╔══════════════════════════════════════╗${RESET}"
echo -e "${BOLD}${CYAN}║ Context Studio Wizard v1.0 ║${RESET}"
echo -e "${BOLD}${CYAN}╚══════════════════════════════════════╝${RESET}"
check_prerequisites
setup_core
collect_project_info
collect_workflow_info
confirm_summary
build_project
print_next_steps
}
main "$@"