-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstart.sh
More file actions
executable file
·138 lines (120 loc) · 4.36 KB
/
start.sh
File metadata and controls
executable file
·138 lines (120 loc) · 4.36 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
#!/usr/bin/env bash
# DevKit — CLI launcher
# Validates host model provider, pulls missing models, provisions auth, builds + launches container.
# Usage: ./start.sh [OPTIONS] [SOURCE_DIR]
set -euo pipefail
BASE_IMAGE_NAME="devkit"
IMAGE_NAME=""
CONTAINER_NAME=""
CONTAINER_NAME_OVERRIDE=""
WORKSPACE_DIR="/workspaces/project"
SOURCE_DIR=""
EXTRA_ENVS=()
BUILD_ONLY=false
SKIP_MODEL_PULL=false
REQUIRED_MODELS=("LocalLLAMA")
PRIMARY_MODEL="LocalLLAMA"
# Host model provider endpoint
MODEL_PROVIDER_HOST="${MODEL_PROVIDER_HOST:-http://localhost:8080}"
usage() {
cat <<EOF
DevKit
Usage:
./start.sh [OPTIONS] [SOURCE_DIR]
Arguments:
SOURCE_DIR Path to your source code directory to mount (default: current directory)
Options:
-e KEY=VAL Pass extra environment variables to the container (repeatable)
-n, --name Override the container name (default: devkit-<project>)
-h, --help Show this help message
Examples:
./start.sh # mount current directory
./start.sh ~/my-project # mount a specific project
EOF
}
# --- Argument parsing ---
while [[ $# -gt 0 ]]; do
case "$1" in
-h | --help)
usage
exit 0
;;
-e)
EXTRA_ENVS+=("-e" "$2")
shift 2
;;
-n | --name)
CONTAINER_NAME_OVERRIDE="$2"
shift 2
;;
-*)
echo "Unknown option: $1" >&2
usage
exit 1
;;
*)
SOURCE_DIR="$1"
shift
;;
esac
done
# Default to current directory
if [[ -z "$SOURCE_DIR" ]]; then
SOURCE_DIR="$(pwd)"
fi
# --- Resolve paths and names ---
# Reads git config in priority order: local repo → global → system.
GIT_USER_NAME="${GIT_AUTHOR_NAME:-$(git -C "$SOURCE_DIR" config user.name 2>/dev/null || true)}"
GIT_USER_EMAIL="${GIT_AUTHOR_EMAIL:-$(git -C "$SOURCE_DIR" config user.email 2>/dev/null || true)}"
if [[ -z "$GIT_USER_NAME" || -z "$GIT_USER_EMAIL" ]]; then
echo ""
echo "⚠️ Git identity not found. Commits will use default identity."
echo " Fix: git config user.name \"Your Name\" # local repo (preferred)"
echo " git config user.email \"you@example.com\" # local repo (preferred)"
echo " or globally: git config --global user.name / user.email"
fi
SOURCE_DIR="$(cd "$SOURCE_DIR" && pwd)"
PROJECT_NAME="$(basename "$SOURCE_DIR" | tr '[:upper:]' '[:lower:]')"
WORKSPACE_DIR="/workspaces/${PROJECT_NAME}"
IMAGE_NAME="${BASE_IMAGE_NAME}-${PROJECT_NAME}"
CONTAINER_NAME="${CONTAINER_NAME_OVERRIDE:-${BASE_IMAGE_NAME}-${PROJECT_NAME}}"
OPENCODE_DATA_DIR="${BASE_IMAGE_NAME}-${PROJECT_NAME}-data"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
echo ""
echo "DevKit"
echo " Project: ${PROJECT_NAME}"
echo " Source: ${SOURCE_DIR}"
echo " Workspace: ${WORKSPACE_DIR}"
echo " Image: ${IMAGE_NAME}"
echo " Model Provider: ${MODEL_PROVIDER_HOST}"
echo " Model: ${PRIMARY_MODEL}"
echo ""
# --- Build container ---
echo "Building container image: ${IMAGE_NAME}..."
podman build \
-t "${IMAGE_NAME}" \
--build-arg USER_UID="$(id -u)" \
--build-arg USER_GID="$(id -g)" \
-f "${SCRIPT_DIR}/Dockerfile" \
"${SCRIPT_DIR}"
# --- Launch container ---
echo ""
echo "Starting container: ${CONTAINER_NAME}..."
exec podman run -it --rm \
--name "${CONTAINER_NAME}" \
--security-opt=label=disable \
--tmpfs /tmp:rw,size=1G,mode=1777 \
-v "${SOURCE_DIR}:${WORKSPACE_DIR}" \
-v "${OPENCODE_DATA_DIR}:/home/dev/.local/share/opencode:Z" \
-v "${OPENCODE_DATA_DIR}-cache:/home/dev/.cache:Z" \
-v "${OPENCODE_DATA_DIR}-state:/home/dev/.local/state:Z" \
-e "HOME=/home/dev" \
-e "GIT_AUTHOR_NAME=${GIT_USER_NAME:-}" \
-e "GIT_AUTHOR_EMAIL=${GIT_USER_EMAIL:-}" \
-e "GIT_COMMITTER_NAME=${GIT_USER_NAME:-}" \
-e "GIT_COMMITTER_EMAIL=${GIT_USER_EMAIL:-}" \
"${EXTRA_ENVS[@]+"${EXTRA_ENVS[@]}"}" \
-w "${WORKSPACE_DIR}" \
"${IMAGE_NAME}" \
bash -c "if [ -n \"\$GIT_AUTHOR_NAME\" ]; then git config --global user.name \"\$GIT_AUTHOR_NAME\"; fi; if [ -n \"\$GIT_AUTHOR_EMAIL\" ]; then git config --global user.email \"\$GIT_AUTHOR_EMAIL\"; fi; if git -C \"\$PWD\" rev-parse --git-dir >/dev/null 2>&1; then git -C \"\$PWD\" config core.fsmonitor false 2>/dev/null || true; fi; echo ''; echo '✅ OpenCode Local ready!'; echo ' Run: opencode'; echo ' Model: ${PRIMARY_MODEL}'; if [ -n \"\$GIT_AUTHOR_NAME\" ] && [ -n \"\$GIT_AUTHOR_EMAIL\" ]; then echo \" Git: \$GIT_AUTHOR_NAME <\$GIT_AUTHOR_EMAIL>\"; else echo ' Git: ⚠️ no identity configured'; fi; echo ''; exec bash"