juno-code 1.0.12 → 1.0.14
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 +11 -20
- package/dist/bin/cli.js +350 -260
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/cli.mjs +350 -260
- package/dist/bin/cli.mjs.map +1 -1
- package/dist/bin/feedback-collector.js.map +1 -1
- package/dist/bin/feedback-collector.mjs.map +1 -1
- package/dist/bin/juno-code.sh +66 -0
- package/dist/index.js +36 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +36 -8
- package/dist/index.mjs.map +1 -1
- package/dist/templates/scripts/bootstrap.sh +189 -0
- package/dist/templates/scripts/clean_logs_folder.sh +1 -1
- package/dist/templates/scripts/install_requirements.sh +257 -23
- package/package.json +8 -5
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# bootstrap.sh
|
|
4
|
+
#
|
|
5
|
+
# Purpose: Pre-flight Python environment setup for juno-code
|
|
6
|
+
#
|
|
7
|
+
# This script runs before the main juno-code entrypoint and ensures:
|
|
8
|
+
# 1. Python virtual environment (.venv_juno) exists
|
|
9
|
+
# 2. Required Python packages are installed
|
|
10
|
+
# 3. Virtual environment is activated if needed
|
|
11
|
+
# 4. Main application can run with proper Python dependencies
|
|
12
|
+
#
|
|
13
|
+
# Usage: ./bootstrap.sh [main-entrypoint-command] [args...]
|
|
14
|
+
#
|
|
15
|
+
# Created by: juno-code init command
|
|
16
|
+
# Date: Auto-generated during project initialization
|
|
17
|
+
|
|
18
|
+
set -euo pipefail # Exit on error, undefined variable, or pipe failure
|
|
19
|
+
|
|
20
|
+
# DEBUG OUTPUT: Show that bootstrap.sh is being executed
|
|
21
|
+
# User feedback: "Add a one line printing from .sh file as well so we could debug it"
|
|
22
|
+
echo "[DEBUG] bootstrap.sh is being executed from: $(pwd)" >&2
|
|
23
|
+
|
|
24
|
+
# Color output for better readability
|
|
25
|
+
RED='\033[0;31m'
|
|
26
|
+
GREEN='\033[0;32m'
|
|
27
|
+
YELLOW='\033[1;33m'
|
|
28
|
+
BLUE='\033[0;34m'
|
|
29
|
+
NC='\033[0m' # No Color
|
|
30
|
+
|
|
31
|
+
# Configuration
|
|
32
|
+
VENV_DIR=".venv_juno"
|
|
33
|
+
SCRIPTS_DIR=".juno_task/scripts"
|
|
34
|
+
INSTALL_SCRIPT="${SCRIPTS_DIR}/install_requirements.sh"
|
|
35
|
+
|
|
36
|
+
# Logging functions
|
|
37
|
+
log_info() {
|
|
38
|
+
echo -e "${BLUE}[BOOTSTRAP]${NC} $1"
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
log_success() {
|
|
42
|
+
echo -e "${GREEN}[BOOTSTRAP]${NC} $1"
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
log_warning() {
|
|
46
|
+
echo -e "${YELLOW}[BOOTSTRAP]${NC} $1"
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
log_error() {
|
|
50
|
+
echo -e "${RED}[BOOTSTRAP]${NC} $1"
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
# Function to check if we're inside .venv_juno specifically
|
|
54
|
+
# CRITICAL FIX: Don't just check for ANY venv - check if we're in .venv_juno
|
|
55
|
+
# User feedback: "bootstrap.sh has the issues that install_requirements.sh used to have.
|
|
56
|
+
# the detection of virtual enviroment is not correct."
|
|
57
|
+
# Previous approach was too permissive - accepted ANY venv (conda, other venvs)
|
|
58
|
+
# NEW APPROACH: Only return success if we're in .venv_juno specifically
|
|
59
|
+
is_in_venv_juno() {
|
|
60
|
+
# Check if VIRTUAL_ENV is set and points to .venv_juno
|
|
61
|
+
if [ -n "${VIRTUAL_ENV:-}" ]; then
|
|
62
|
+
# Check if VIRTUAL_ENV path contains .venv_juno
|
|
63
|
+
if [[ "${VIRTUAL_ENV:-}" == *"/.venv_juno" ]] || [[ "${VIRTUAL_ENV:-}" == *".venv_juno"* ]]; then
|
|
64
|
+
return 0 # Inside .venv_juno
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
# Check if the basename is .venv_juno
|
|
68
|
+
if [ "$(basename "${VIRTUAL_ENV:-}")" = ".venv_juno" ]; then
|
|
69
|
+
return 0 # Inside .venv_juno
|
|
70
|
+
fi
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
return 1 # Not inside .venv_juno (or not in any venv)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
# Function to activate virtual environment
|
|
77
|
+
activate_venv() {
|
|
78
|
+
local venv_path="$1"
|
|
79
|
+
|
|
80
|
+
if [ ! -d "$venv_path" ]; then
|
|
81
|
+
log_error "Virtual environment not found: $venv_path"
|
|
82
|
+
return 1
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
# Activate the venv
|
|
86
|
+
# shellcheck disable=SC1091
|
|
87
|
+
if [ -f "$venv_path/bin/activate" ]; then
|
|
88
|
+
source "$venv_path/bin/activate"
|
|
89
|
+
log_success "Activated virtual environment: $venv_path"
|
|
90
|
+
return 0
|
|
91
|
+
else
|
|
92
|
+
log_error "Activation script not found: $venv_path/bin/activate"
|
|
93
|
+
return 1
|
|
94
|
+
fi
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
# Function to ensure Python environment is ready
|
|
98
|
+
ensure_python_environment() {
|
|
99
|
+
log_info "Checking Python environment..."
|
|
100
|
+
|
|
101
|
+
# CRITICAL FIX: Check if we're specifically in .venv_juno, not just ANY venv
|
|
102
|
+
# User feedback: "the detection of virtual enviroment is not correct"
|
|
103
|
+
# Previous logic accepted ANY venv (conda, other venvs) which was wrong
|
|
104
|
+
# NEW LOGIC: Only accept .venv_juno specifically
|
|
105
|
+
|
|
106
|
+
# Step 1: Check if we're already in .venv_juno specifically
|
|
107
|
+
if is_in_venv_juno; then
|
|
108
|
+
log_success "Already inside .venv_juno virtual environment"
|
|
109
|
+
return 0
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
# Step 2: Not in .venv_juno - check if .venv_juno exists in project root
|
|
113
|
+
if [ -d "$VENV_DIR" ]; then
|
|
114
|
+
log_info "Found existing virtual environment: $VENV_DIR"
|
|
115
|
+
|
|
116
|
+
# Activate the venv
|
|
117
|
+
if activate_venv "$VENV_DIR"; then
|
|
118
|
+
return 0
|
|
119
|
+
else
|
|
120
|
+
log_error "Failed to activate virtual environment"
|
|
121
|
+
return 1
|
|
122
|
+
fi
|
|
123
|
+
fi
|
|
124
|
+
|
|
125
|
+
# Step 3: .venv_juno doesn't exist - need to create it
|
|
126
|
+
log_warning "Virtual environment not found: $VENV_DIR"
|
|
127
|
+
log_info "Running install_requirements.sh to create virtual environment..."
|
|
128
|
+
|
|
129
|
+
# Check if install_requirements.sh exists
|
|
130
|
+
if [ ! -f "$INSTALL_SCRIPT" ]; then
|
|
131
|
+
log_error "Install script not found: $INSTALL_SCRIPT"
|
|
132
|
+
log_error "Please run 'juno-code init' to initialize the project"
|
|
133
|
+
return 1
|
|
134
|
+
fi
|
|
135
|
+
|
|
136
|
+
# Make sure the script is executable
|
|
137
|
+
chmod +x "$INSTALL_SCRIPT"
|
|
138
|
+
|
|
139
|
+
# Run the install script
|
|
140
|
+
if bash "$INSTALL_SCRIPT"; then
|
|
141
|
+
log_success "Python environment setup completed successfully"
|
|
142
|
+
|
|
143
|
+
# After install, activate the venv if it was created
|
|
144
|
+
if [ -d "$VENV_DIR" ]; then
|
|
145
|
+
if activate_venv "$VENV_DIR"; then
|
|
146
|
+
return 0
|
|
147
|
+
fi
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
return 0
|
|
151
|
+
else
|
|
152
|
+
log_error "Failed to run install_requirements.sh"
|
|
153
|
+
log_error "Please check the error messages above"
|
|
154
|
+
return 1
|
|
155
|
+
fi
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
# Main bootstrap logic
|
|
159
|
+
main() {
|
|
160
|
+
log_info "=== juno-code Bootstrap ==="
|
|
161
|
+
echo ""
|
|
162
|
+
|
|
163
|
+
# Ensure Python environment is ready
|
|
164
|
+
if ! ensure_python_environment; then
|
|
165
|
+
log_error "Failed to setup Python environment"
|
|
166
|
+
exit 1
|
|
167
|
+
fi
|
|
168
|
+
|
|
169
|
+
echo ""
|
|
170
|
+
log_success "Python environment ready!"
|
|
171
|
+
|
|
172
|
+
# If there are additional arguments, execute them as the main entrypoint
|
|
173
|
+
if [ $# -gt 0 ]; then
|
|
174
|
+
log_info "Executing main entrypoint: $*"
|
|
175
|
+
echo ""
|
|
176
|
+
|
|
177
|
+
# Execute the main entrypoint with all arguments
|
|
178
|
+
exec "$@"
|
|
179
|
+
else
|
|
180
|
+
log_info "No main entrypoint specified - environment is ready for use"
|
|
181
|
+
log_info "To activate the virtual environment manually, run:"
|
|
182
|
+
echo ""
|
|
183
|
+
echo " source $VENV_DIR/bin/activate"
|
|
184
|
+
echo ""
|
|
185
|
+
fi
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
# Run main function with all arguments
|
|
189
|
+
main "$@"
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
#
|
|
12
12
|
# Usage: ./clean_logs_folder.sh
|
|
13
13
|
#
|
|
14
|
-
# Created by: juno-
|
|
14
|
+
# Created by: juno-code init command
|
|
15
15
|
# Date: Auto-generated during project initialization
|
|
16
16
|
|
|
17
17
|
set -euo pipefail # Exit on error, undefined variable, or pipe failure
|
|
@@ -2,25 +2,32 @@
|
|
|
2
2
|
|
|
3
3
|
# install_requirements.sh
|
|
4
4
|
#
|
|
5
|
-
# Purpose: Install Python dependencies required for juno-
|
|
5
|
+
# Purpose: Install Python dependencies required for juno-code
|
|
6
6
|
#
|
|
7
7
|
# This script:
|
|
8
|
-
# 1. Checks if '
|
|
9
|
-
# 2. Falls back to '
|
|
10
|
-
# 3.
|
|
8
|
+
# 1. Checks if 'pipx' (recommended for app installations) is installed
|
|
9
|
+
# 2. Falls back to 'uv' (ultrafast Python package manager) if 'pipx' not available
|
|
10
|
+
# 3. Falls back to 'pip' if neither 'pipx' nor 'uv' is available
|
|
11
|
+
# 4. Detects externally managed Python (PEP 668) on Ubuntu/Debian systems
|
|
12
|
+
# 5. Handles installation based on environment:
|
|
11
13
|
# - If inside venv: installs into venv
|
|
12
|
-
# - If
|
|
13
|
-
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
14
|
+
# - If externally managed Python detected: uses pipx or creates temporary venv
|
|
15
|
+
# - If outside venv (non-managed): uses --system flag for system-wide installation
|
|
16
|
+
# 6. Installs required packages: juno-kanban, roundtable-ai
|
|
17
|
+
# 7. Reports if requirements are already satisfied
|
|
16
18
|
#
|
|
17
19
|
# Usage: ./install_requirements.sh
|
|
18
20
|
#
|
|
19
|
-
# Created by: juno-
|
|
21
|
+
# Created by: juno-code init command
|
|
20
22
|
# Date: Auto-generated during project initialization
|
|
21
23
|
|
|
22
24
|
set -euo pipefail # Exit on error, undefined variable, or pipe failure
|
|
23
25
|
|
|
26
|
+
# DEBUG OUTPUT: Show that install_requirements.sh is being executed
|
|
27
|
+
# User feedback: "Add a one line printing from .sh file as well so we could debug it"
|
|
28
|
+
echo "[DEBUG] install_requirements.sh is being executed from: $(pwd)" >&2
|
|
29
|
+
echo "[DEBUG] .venv_juno will be created in: $(pwd)/.venv_juno" >&2
|
|
30
|
+
|
|
24
31
|
# Color output for better readability
|
|
25
32
|
RED='\033[0;31m'
|
|
26
33
|
GREEN='\033[0;32m'
|
|
@@ -100,17 +107,168 @@ is_in_virtualenv() {
|
|
|
100
107
|
return 1 # Not inside venv
|
|
101
108
|
}
|
|
102
109
|
|
|
103
|
-
# Function to
|
|
110
|
+
# Function to find the best Python version (3.10-3.13, preferably 3.13)
|
|
111
|
+
find_best_python() {
|
|
112
|
+
# Try to find Python in order of preference: 3.13, 3.12, 3.11, 3.10
|
|
113
|
+
local python_versions=("python3.13" "python3.12" "python3.11" "python3.10")
|
|
114
|
+
|
|
115
|
+
for py_cmd in "${python_versions[@]}"; do
|
|
116
|
+
if command -v "$py_cmd" &> /dev/null; then
|
|
117
|
+
# Verify it's actually the right version
|
|
118
|
+
local version
|
|
119
|
+
version=$($py_cmd --version 2>&1 | grep -oE '[0-9]+\.[0-9]+' | head -1)
|
|
120
|
+
local major
|
|
121
|
+
major=$(echo "$version" | cut -d'.' -f1)
|
|
122
|
+
local minor
|
|
123
|
+
minor=$(echo "$version" | cut -d'.' -f2)
|
|
124
|
+
|
|
125
|
+
# Check if version is 3.10 or higher
|
|
126
|
+
if [ "$major" -eq 3 ] && [ "$minor" -ge 10 ]; then
|
|
127
|
+
echo "$py_cmd"
|
|
128
|
+
return 0
|
|
129
|
+
fi
|
|
130
|
+
fi
|
|
131
|
+
done
|
|
132
|
+
|
|
133
|
+
# Fall back to python3 if available and check its version
|
|
134
|
+
if command -v python3 &> /dev/null; then
|
|
135
|
+
local version
|
|
136
|
+
version=$(python3 --version 2>&1 | grep -oE '[0-9]+\.[0-9]+' | head -1)
|
|
137
|
+
local major
|
|
138
|
+
major=$(echo "$version" | cut -d'.' -f1)
|
|
139
|
+
local minor
|
|
140
|
+
minor=$(echo "$version" | cut -d'.' -f2)
|
|
141
|
+
|
|
142
|
+
# Check if version is 3.10 or higher
|
|
143
|
+
if [ "$major" -eq 3 ] && [ "$minor" -ge 10 ]; then
|
|
144
|
+
echo "python3"
|
|
145
|
+
return 0
|
|
146
|
+
else
|
|
147
|
+
# Python3 exists but is too old
|
|
148
|
+
log_error "Found Python $version, but Python 3.10+ is required"
|
|
149
|
+
return 1
|
|
150
|
+
fi
|
|
151
|
+
fi
|
|
152
|
+
|
|
153
|
+
# No suitable Python found
|
|
154
|
+
log_error "No Python 3.10+ found. Please install Python 3.10, 3.11, 3.12, or 3.13 (preferably 3.13)"
|
|
155
|
+
return 1
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
# Function to check if Python is externally managed (PEP 668)
|
|
159
|
+
# This is common on Ubuntu 23.04+, Debian, and other modern Linux distros
|
|
160
|
+
is_externally_managed_python() {
|
|
161
|
+
# Check for EXTERNALLY-MANAGED marker file
|
|
162
|
+
local python_cmd="python3"
|
|
163
|
+
if ! command -v python3 &> /dev/null; then
|
|
164
|
+
if command -v python &> /dev/null; then
|
|
165
|
+
python_cmd="python"
|
|
166
|
+
else
|
|
167
|
+
return 1 # Python not found, can't determine
|
|
168
|
+
fi
|
|
169
|
+
fi
|
|
170
|
+
|
|
171
|
+
# Get the stdlib directory and check for EXTERNALLY-MANAGED file
|
|
172
|
+
local stdlib_dir
|
|
173
|
+
stdlib_dir=$($python_cmd -c "import sysconfig; print(sysconfig.get_path('stdlib'))" 2>/dev/null || echo "")
|
|
174
|
+
|
|
175
|
+
if [ -n "$stdlib_dir" ] && [ -f "$stdlib_dir/EXTERNALLY-MANAGED" ]; then
|
|
176
|
+
return 0 # Externally managed
|
|
177
|
+
fi
|
|
178
|
+
|
|
179
|
+
return 1 # Not externally managed
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
# Function to install packages using pipx
|
|
183
|
+
install_with_pipx() {
|
|
184
|
+
log_info "Installing packages using 'pipx' (recommended for Python applications)..."
|
|
185
|
+
|
|
186
|
+
local failed_packages=()
|
|
187
|
+
|
|
188
|
+
for package in "${REQUIRED_PACKAGES[@]}"; do
|
|
189
|
+
log_info "Installing: $package"
|
|
190
|
+
if pipx install "$package" --force &>/dev/null || pipx install "$package" &>/dev/null; then
|
|
191
|
+
log_success "Successfully installed: $package"
|
|
192
|
+
else
|
|
193
|
+
log_error "Failed to install: $package"
|
|
194
|
+
failed_packages+=("$package")
|
|
195
|
+
fi
|
|
196
|
+
done
|
|
197
|
+
|
|
198
|
+
if [ ${#failed_packages[@]} -gt 0 ]; then
|
|
199
|
+
log_error "Failed to install ${#failed_packages[@]} package(s): ${failed_packages[*]}"
|
|
200
|
+
return 1
|
|
201
|
+
fi
|
|
202
|
+
|
|
203
|
+
return 0
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
# Function to install packages using uv with externally managed Python handling
|
|
104
207
|
install_with_uv() {
|
|
105
208
|
log_info "Installing packages using 'uv' (ultrafast Python package manager)..."
|
|
106
209
|
|
|
107
|
-
# Determine if we need --system flag
|
|
108
210
|
local uv_flags="--quiet"
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
211
|
+
|
|
212
|
+
# CRITICAL FIX: Properly detect if uv will work in the current environment
|
|
213
|
+
# User feedback: "Maybe the way you are verifying being inside venv by uv is not correct !!!"
|
|
214
|
+
# Previous approach failed because uv pip list doesn't reliably indicate venv compatibility
|
|
215
|
+
# NEW APPROACH: Always create .venv_juno unless we're already inside it
|
|
216
|
+
|
|
217
|
+
local venv_path=".venv_juno"
|
|
218
|
+
local need_venv=true
|
|
219
|
+
|
|
220
|
+
# Check if we're already inside .venv_juno
|
|
221
|
+
if [ -n "${VIRTUAL_ENV:-}" ] && ( [[ "${VIRTUAL_ENV:-}" == *"/.venv_juno" ]] || [[ "${VIRTUAL_ENV:-}" == *".venv_juno"* ]] ); then
|
|
222
|
+
log_info "Already inside .venv_juno virtual environment"
|
|
223
|
+
need_venv=false
|
|
224
|
+
# Check if we're in .venv_juno by checking the activate script path
|
|
225
|
+
elif [ -n "${VIRTUAL_ENV:-}" ] && [ "$(basename "${VIRTUAL_ENV:-}")" = ".venv_juno" ]; then
|
|
226
|
+
log_info "Already inside .venv_juno virtual environment"
|
|
227
|
+
need_venv=false
|
|
228
|
+
fi
|
|
229
|
+
|
|
230
|
+
# If we need a venv, create and activate .venv_juno
|
|
231
|
+
if [ "$need_venv" = true ]; then
|
|
232
|
+
log_info "Creating/using .venv_juno virtual environment for reliable uv installation..."
|
|
233
|
+
|
|
234
|
+
# Find best Python version (3.10-3.13, preferably 3.13)
|
|
235
|
+
local python_cmd
|
|
236
|
+
if ! python_cmd=$(find_best_python); then
|
|
237
|
+
log_error "Cannot create venv: No suitable Python version found"
|
|
238
|
+
log_info "Please install Python 3.10+ (preferably Python 3.13)"
|
|
239
|
+
log_info " Mac: brew install python@3.13"
|
|
240
|
+
log_info " Ubuntu/Debian: sudo apt install python3.13 python3.13-venv"
|
|
241
|
+
return 1
|
|
242
|
+
fi
|
|
243
|
+
|
|
244
|
+
local version
|
|
245
|
+
version=$($python_cmd --version 2>&1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+')
|
|
246
|
+
log_info "Using Python $version for virtual environment"
|
|
247
|
+
|
|
248
|
+
# Create a project-local venv if it doesn't exist
|
|
249
|
+
if [ ! -d "$venv_path" ]; then
|
|
250
|
+
log_info "Creating virtual environment with $python_cmd..."
|
|
251
|
+
if ! $python_cmd -m venv "$venv_path" 2>/dev/null; then
|
|
252
|
+
log_error "Failed to create virtual environment"
|
|
253
|
+
log_info "Please ensure python venv module is installed:"
|
|
254
|
+
log_info " Mac: brew install python@3.13"
|
|
255
|
+
log_info " Ubuntu/Debian: sudo apt install python3.13-venv python3-full"
|
|
256
|
+
return 1
|
|
257
|
+
fi
|
|
258
|
+
log_success "Created virtual environment at $venv_path with Python $version"
|
|
259
|
+
else
|
|
260
|
+
log_info "Using existing virtual environment at $venv_path"
|
|
261
|
+
fi
|
|
262
|
+
|
|
263
|
+
# Activate the venv for this script
|
|
264
|
+
# shellcheck disable=SC1091
|
|
265
|
+
if [ -f "$venv_path/bin/activate" ]; then
|
|
266
|
+
source "$venv_path/bin/activate"
|
|
267
|
+
log_success "Activated virtual environment - uv will now install into .venv_juno"
|
|
268
|
+
else
|
|
269
|
+
log_error "Virtual environment activation script not found"
|
|
270
|
+
return 1
|
|
271
|
+
fi
|
|
114
272
|
fi
|
|
115
273
|
|
|
116
274
|
local failed_packages=()
|
|
@@ -133,7 +291,7 @@ install_with_uv() {
|
|
|
133
291
|
return 0
|
|
134
292
|
}
|
|
135
293
|
|
|
136
|
-
# Function to install packages using pip
|
|
294
|
+
# Function to install packages using pip with externally managed Python handling
|
|
137
295
|
install_with_pip() {
|
|
138
296
|
log_info "Installing packages using 'pip'..."
|
|
139
297
|
|
|
@@ -148,6 +306,41 @@ install_with_pip() {
|
|
|
148
306
|
fi
|
|
149
307
|
fi
|
|
150
308
|
|
|
309
|
+
# Handle externally managed Python or missing venv
|
|
310
|
+
if ! is_in_virtualenv && is_externally_managed_python; then
|
|
311
|
+
log_warning "Detected externally managed Python (PEP 668) - Ubuntu/Debian system"
|
|
312
|
+
log_info "Creating virtual environment for installation..."
|
|
313
|
+
|
|
314
|
+
# Find best Python version (3.10-3.13, preferably 3.13)
|
|
315
|
+
if ! python_cmd=$(find_best_python); then
|
|
316
|
+
log_error "Cannot create venv: No suitable Python version found"
|
|
317
|
+
log_info "Please install Python 3.10+ (preferably Python 3.13)"
|
|
318
|
+
log_info " Ubuntu/Debian: sudo apt install python3.13 python3.13-venv"
|
|
319
|
+
return 1
|
|
320
|
+
fi
|
|
321
|
+
|
|
322
|
+
local version
|
|
323
|
+
version=$($python_cmd --version 2>&1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+')
|
|
324
|
+
log_info "Using Python $version for virtual environment"
|
|
325
|
+
|
|
326
|
+
# Create a project-local venv if it doesn't exist
|
|
327
|
+
local venv_path=".venv_juno"
|
|
328
|
+
if [ ! -d "$venv_path" ]; then
|
|
329
|
+
if ! $python_cmd -m venv "$venv_path" 2>/dev/null; then
|
|
330
|
+
log_error "Failed to create virtual environment"
|
|
331
|
+
log_info "Please install python3-venv (Linux: sudo apt install python3.13-venv python3-full)"
|
|
332
|
+
return 1
|
|
333
|
+
fi
|
|
334
|
+
log_success "Created virtual environment at $venv_path with Python $version"
|
|
335
|
+
fi
|
|
336
|
+
|
|
337
|
+
# Activate the venv for this script
|
|
338
|
+
# shellcheck disable=SC1091
|
|
339
|
+
source "$venv_path/bin/activate"
|
|
340
|
+
log_success "Activated virtual environment"
|
|
341
|
+
python_cmd="python" # Use the venv's python
|
|
342
|
+
fi
|
|
343
|
+
|
|
151
344
|
local failed_packages=()
|
|
152
345
|
|
|
153
346
|
for package in "${REQUIRED_PACKAGES[@]}"; do
|
|
@@ -194,28 +387,50 @@ main() {
|
|
|
194
387
|
# Step 2: Determine which package manager to use
|
|
195
388
|
local installer=""
|
|
196
389
|
|
|
197
|
-
if
|
|
390
|
+
# Check if Python is externally managed (Ubuntu/Debian PEP 668)
|
|
391
|
+
local is_ext_managed=false
|
|
392
|
+
if is_externally_managed_python && ! is_in_virtualenv; then
|
|
393
|
+
is_ext_managed=true
|
|
394
|
+
log_warning "Detected externally managed Python environment (Ubuntu/Debian PEP 668)"
|
|
395
|
+
fi
|
|
396
|
+
|
|
397
|
+
# Prioritize pipx for externally managed systems
|
|
398
|
+
if [ "$is_ext_managed" = true ] && command -v pipx &> /dev/null; then
|
|
399
|
+
log_success "'pipx' found - using pipx (recommended for externally managed Python)"
|
|
400
|
+
installer="pipx"
|
|
401
|
+
elif command -v uv &> /dev/null; then
|
|
198
402
|
log_success "'uv' found - using ultrafast Python package manager"
|
|
199
403
|
installer="uv"
|
|
200
404
|
elif command -v pip3 &> /dev/null || command -v pip &> /dev/null; then
|
|
201
405
|
log_success "'pip' found - using standard Python package installer"
|
|
202
406
|
installer="pip"
|
|
203
407
|
else
|
|
204
|
-
#
|
|
205
|
-
log_error "
|
|
408
|
+
# No package manager found
|
|
409
|
+
log_error "No suitable package manager found!"
|
|
206
410
|
echo ""
|
|
207
411
|
log_info "Please install one of the following:"
|
|
208
412
|
echo ""
|
|
209
|
-
|
|
413
|
+
if [ "$is_ext_managed" = true ]; then
|
|
414
|
+
echo " Option 1: Install 'pipx' (RECOMMENDED for Ubuntu/Debian)"
|
|
415
|
+
echo " sudo apt install pipx"
|
|
416
|
+
echo " pipx ensurepath"
|
|
417
|
+
echo ""
|
|
418
|
+
fi
|
|
419
|
+
echo " Option 2: Install 'uv' (ultrafast Python package manager)"
|
|
210
420
|
echo " curl -LsSf https://astral.sh/uv/install.sh | sh"
|
|
211
421
|
echo " OR"
|
|
212
422
|
echo " brew install uv (macOS)"
|
|
213
423
|
echo ""
|
|
214
|
-
echo " Option
|
|
424
|
+
echo " Option 3: Install 'pip' (standard Python package manager)"
|
|
215
425
|
echo " python3 -m ensurepip --upgrade"
|
|
216
426
|
echo " OR"
|
|
217
427
|
echo " curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && python3 get-pip.py"
|
|
218
428
|
echo ""
|
|
429
|
+
if [ "$is_ext_managed" = true ]; then
|
|
430
|
+
log_info "Note: On Ubuntu/Debian with externally managed Python, 'pipx' is recommended"
|
|
431
|
+
log_info "Alternatively, install python3-venv: sudo apt install python3-venv python3-full"
|
|
432
|
+
fi
|
|
433
|
+
echo ""
|
|
219
434
|
exit 1
|
|
220
435
|
fi
|
|
221
436
|
|
|
@@ -224,10 +439,25 @@ main() {
|
|
|
224
439
|
log_info "Installing required packages: ${REQUIRED_PACKAGES[*]}"
|
|
225
440
|
echo ""
|
|
226
441
|
|
|
227
|
-
if [ "$installer" = "
|
|
442
|
+
if [ "$installer" = "pipx" ]; then
|
|
443
|
+
if install_with_pipx; then
|
|
444
|
+
echo ""
|
|
445
|
+
log_success "All packages installed successfully using 'pipx'!"
|
|
446
|
+
log_info "Packages installed in isolated environments and added to PATH"
|
|
447
|
+
echo ""
|
|
448
|
+
exit 0
|
|
449
|
+
else
|
|
450
|
+
log_error "Some packages failed to install with 'pipx'"
|
|
451
|
+
exit 1
|
|
452
|
+
fi
|
|
453
|
+
elif [ "$installer" = "uv" ]; then
|
|
228
454
|
if install_with_uv; then
|
|
229
455
|
echo ""
|
|
230
456
|
log_success "All packages installed successfully using 'uv'!"
|
|
457
|
+
if [ -d ".venv_juno" ]; then
|
|
458
|
+
log_info "Packages installed in virtual environment: .venv_juno"
|
|
459
|
+
log_info "To use them, activate the venv: source .venv_juno/bin/activate"
|
|
460
|
+
fi
|
|
231
461
|
echo ""
|
|
232
462
|
exit 0
|
|
233
463
|
else
|
|
@@ -238,6 +468,10 @@ main() {
|
|
|
238
468
|
if install_with_pip; then
|
|
239
469
|
echo ""
|
|
240
470
|
log_success "All packages installed successfully using 'pip'!"
|
|
471
|
+
if [ -d ".venv_juno" ]; then
|
|
472
|
+
log_info "Packages installed in virtual environment: .venv_juno"
|
|
473
|
+
log_info "To use them, activate the venv: source .venv_juno/bin/activate"
|
|
474
|
+
fi
|
|
241
475
|
echo ""
|
|
242
476
|
exit 0
|
|
243
477
|
else
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "juno-code",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "AI Subagent Orchestration CLI -
|
|
3
|
+
"version": "1.0.14",
|
|
4
|
+
"description": "AI Subagent Orchestration CLI - Professional TypeScript CLI for AI-powered code intelligence, MCP server orchestration, and subagent collaboration",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
7
7
|
"code",
|
|
@@ -35,6 +35,9 @@
|
|
|
35
35
|
"README.md",
|
|
36
36
|
"CHANGELOG.md"
|
|
37
37
|
],
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build:copy-wrapper": "node -e \"const fs = require('fs-extra'); fs.copySync('src/bin/juno-code.sh', 'dist/bin/juno-code.sh'); fs.chmodSync('dist/bin/juno-code.sh', 0o755);\""
|
|
40
|
+
},
|
|
38
41
|
"dependencies": {
|
|
39
42
|
"@modelcontextprotocol/sdk": "^1.20.0",
|
|
40
43
|
"chalk": "^5.3.0",
|
|
@@ -61,12 +64,12 @@
|
|
|
61
64
|
},
|
|
62
65
|
"repository": {
|
|
63
66
|
"type": "git",
|
|
64
|
-
"url": "https://github.com/owner/juno-
|
|
67
|
+
"url": "https://github.com/owner/juno-code.git"
|
|
65
68
|
},
|
|
66
69
|
"bugs": {
|
|
67
|
-
"url": "https://github.com/owner/juno-
|
|
70
|
+
"url": "https://github.com/owner/juno-code/issues"
|
|
68
71
|
},
|
|
69
|
-
"homepage": "https://github.com/owner/juno-
|
|
72
|
+
"homepage": "https://github.com/owner/juno-code#readme",
|
|
70
73
|
"license": "MIT",
|
|
71
74
|
"author": {
|
|
72
75
|
"name": "Development Team",
|