@kmlckj/licos-ai-cli 0.0.22 → 0.0.24
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/__templates__/expo/.licosproj/scripts/dev_run.sh +38 -27
- package/lib/__templates__/expo/.licosproj/scripts/server_dev_run.sh +16 -8
- package/lib/__templates__/expo/client/metro.config.js +1 -1
- package/lib/__templates__/expo/server/src/index.ts +1 -1
- package/lib/cli.js +1 -1
- package/package.json +1 -1
|
@@ -7,18 +7,14 @@ mkdir -p "$LOG_DIR"
|
|
|
7
7
|
# ==================== 配置项 ====================
|
|
8
8
|
# Server 服务配置
|
|
9
9
|
SERVER_HOST="0.0.0.0"
|
|
10
|
-
SERVER_PORT="
|
|
10
|
+
SERVER_PORT="${LICOS_BACKEND_PORT:-${SERVER_PORT:-5001}}"
|
|
11
11
|
# Expo 项目配置
|
|
12
12
|
EXPO_HOST="0.0.0.0"
|
|
13
13
|
EXPO_DIR="expo"
|
|
14
|
-
EXPO_PORT="5000"
|
|
15
|
-
WEB_URL="${LICOS_PROJECT_DOMAIN_DEFAULT:-http://127.0.0.1:${SERVER_PORT}}"
|
|
14
|
+
EXPO_PORT="${LICOS_RUN_PORT:-${PORT:-5000}}"
|
|
16
15
|
ASSUME_YES="1"
|
|
17
|
-
|
|
18
|
-
EXPO_PUBLIC_LICOS_PROJECT_ID="${LICOS_PROJECT_ID:-}"
|
|
16
|
+
PROTECTED_PORTS="${LICOS_DEV_PROTECTED_PORTS:-8080 8081 9091}"
|
|
19
17
|
|
|
20
|
-
EXPO_PACKAGER_PROXY_URL="${EXPO_PUBLIC_BACKEND_BASE_URL}"
|
|
21
|
-
export EXPO_PUBLIC_BACKEND_BASE_URL EXPO_PACKAGER_PROXY_URL EXPO_PUBLIC_LICOS_PROJECT_ID
|
|
22
18
|
# 运行时变量(为避免 set -u 的未绑定错误,预置为空)
|
|
23
19
|
SERVER_PID=""
|
|
24
20
|
EXPO_PID=""
|
|
@@ -41,7 +37,7 @@ while [ $# -gt 0 ]; do
|
|
|
41
37
|
esac
|
|
42
38
|
done
|
|
43
39
|
is_port_free() {
|
|
44
|
-
!
|
|
40
|
+
! nc -z -w 1 127.0.0.1 "$1" >/dev/null 2>&1
|
|
45
41
|
}
|
|
46
42
|
choose_next_free_port() {
|
|
47
43
|
local start=$1
|
|
@@ -51,6 +47,15 @@ choose_next_free_port() {
|
|
|
51
47
|
done
|
|
52
48
|
echo "$p"
|
|
53
49
|
}
|
|
50
|
+
is_protected_port() {
|
|
51
|
+
local port_val=$1
|
|
52
|
+
for protected in $PROTECTED_PORTS; do
|
|
53
|
+
if [ "$protected" = "$port_val" ]; then
|
|
54
|
+
return 0
|
|
55
|
+
fi
|
|
56
|
+
done
|
|
57
|
+
return 1
|
|
58
|
+
}
|
|
54
59
|
ensure_port() {
|
|
55
60
|
local var_name=$1
|
|
56
61
|
local port_val=$2
|
|
@@ -59,32 +64,37 @@ ensure_port() {
|
|
|
59
64
|
eval "$var_name=$port_val"
|
|
60
65
|
else
|
|
61
66
|
echo "端口已占用:$port_val"
|
|
67
|
+
if is_protected_port "$port_val"; then
|
|
68
|
+
local new_port
|
|
69
|
+
new_port=$(choose_next_free_port "$((port_val+1))")
|
|
70
|
+
echo "端口 $port_val 是平台保护端口,改用新的端口:$new_port"
|
|
71
|
+
eval "$var_name=$new_port"
|
|
72
|
+
return 0
|
|
73
|
+
fi
|
|
62
74
|
local choice
|
|
63
|
-
if [ "$
|
|
75
|
+
if [ "${LICOS_DEV_KILL_PORTS:-0}" = "1" ]; then
|
|
76
|
+
if [ "$ASSUME_YES" = "1" ]; then choice="Y"; else read -r -p "是否关闭该端口的进程?[Y/n] " choice || choice="Y"; fi
|
|
77
|
+
else
|
|
78
|
+
choice="n"
|
|
79
|
+
fi
|
|
64
80
|
if [ -z "$choice" ] || [ "$choice" = "y" ] || [ "$choice" = "Y" ]; then
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
pids=$(lsof -t -i tcp:"$port_val" -sTCP:LISTEN 2>/dev/null || true)
|
|
68
|
-
if [ -n "$pids" ]; then
|
|
69
|
-
echo "正在关闭进程:$pids"
|
|
70
|
-
kill -9 $pids 2>/dev/null || echo "关闭进程失败:$pids"
|
|
71
|
-
eval "$var_name=$port_val"
|
|
72
|
-
else
|
|
73
|
-
echo "未获取到占用该端口的进程"
|
|
74
|
-
eval "$var_name=$port_val"
|
|
75
|
-
fi
|
|
76
|
-
else
|
|
77
|
-
echo "缺少 lsof,无法自动关闭进程"
|
|
78
|
-
eval "$var_name=$port_val"
|
|
79
|
-
fi
|
|
81
|
+
fuser -k "${port_val}/tcp" 2>/dev/null || echo "关闭端口进程失败或端口未找到:$port_val"
|
|
82
|
+
eval "$var_name=$port_val"
|
|
80
83
|
else
|
|
81
84
|
local new_port
|
|
82
|
-
new_port=$(choose_next_free_port "$port_val")
|
|
83
|
-
|
|
85
|
+
new_port=$(choose_next_free_port "$((port_val+1))")
|
|
86
|
+
echo "使用新的端口:$new_port"
|
|
84
87
|
eval "$var_name=$new_port"
|
|
85
88
|
fi
|
|
86
89
|
fi
|
|
87
90
|
}
|
|
91
|
+
configure_expo_env() {
|
|
92
|
+
local web_url="${LICOS_PROJECT_DOMAIN_DEFAULT:-http://127.0.0.1:${SERVER_PORT}}"
|
|
93
|
+
EXPO_PUBLIC_BACKEND_BASE_URL="${EXPO_PUBLIC_BACKEND_BASE_URL:-$web_url}"
|
|
94
|
+
EXPO_PUBLIC_LICOS_PROJECT_ID="${LICOS_PROJECT_ID:-}"
|
|
95
|
+
EXPO_PACKAGER_PROXY_URL="${EXPO_PACKAGER_PROXY_URL:-$EXPO_PUBLIC_BACKEND_BASE_URL}"
|
|
96
|
+
export EXPO_PUBLIC_BACKEND_BASE_URL EXPO_PACKAGER_PROXY_URL EXPO_PUBLIC_LICOS_PROJECT_ID
|
|
97
|
+
}
|
|
88
98
|
|
|
89
99
|
pipe_to_log() {
|
|
90
100
|
local source="${1:-CLIENT}"
|
|
@@ -166,12 +176,13 @@ echo "正在检查依赖命令和目录是否存在..."
|
|
|
166
176
|
# 检查核心命令
|
|
167
177
|
check_command "npm"
|
|
168
178
|
check_command "pnpm"
|
|
169
|
-
check_command "
|
|
179
|
+
check_command "nc"
|
|
170
180
|
check_command "bash"
|
|
171
181
|
|
|
172
182
|
# 端口占用预检查与处理
|
|
173
183
|
ensure_port SERVER_PORT "$SERVER_PORT"
|
|
174
184
|
ensure_port EXPO_PORT "$EXPO_PORT"
|
|
185
|
+
configure_expo_env
|
|
175
186
|
|
|
176
187
|
echo "==================== 启动 server 服务 ===================="
|
|
177
188
|
echo "正在执行:pnpm run dev (server)"
|
|
@@ -4,7 +4,8 @@ ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
|
4
4
|
SERVER_DIR="$ROOT_DIR/server"
|
|
5
5
|
LOG_DIR="${LICOS_LOG_DIR:-$ROOT_DIR/logs}"
|
|
6
6
|
LOG_SERVER_FILE="$LOG_DIR/server.log"
|
|
7
|
-
SERVER_PORT="${SERVER_PORT:-
|
|
7
|
+
SERVER_PORT="${LICOS_BACKEND_PORT:-${SERVER_PORT:-5001}}"
|
|
8
|
+
PROTECTED_PORTS="${LICOS_DEV_PROTECTED_PORTS:-8080 8081 9091}"
|
|
8
9
|
|
|
9
10
|
mkdir -p "$LOG_DIR"
|
|
10
11
|
|
|
@@ -23,14 +24,21 @@ pipe_to_log() {
|
|
|
23
24
|
}
|
|
24
25
|
|
|
25
26
|
kill_old_server() {
|
|
26
|
-
if
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
if ! nc -z -w 1 127.0.0.1 "$SERVER_PORT" >/dev/null 2>&1; then
|
|
28
|
+
return 0
|
|
29
|
+
fi
|
|
30
|
+
for protected in $PROTECTED_PORTS; do
|
|
31
|
+
if [ "$protected" = "$SERVER_PORT" ]; then
|
|
32
|
+
echo "端口 $SERVER_PORT 是平台保护端口,不会关闭占用进程"
|
|
33
|
+
return 0
|
|
33
34
|
fi
|
|
35
|
+
done
|
|
36
|
+
if [ "${LICOS_DEV_KILL_PORTS:-0}" = "1" ]; then
|
|
37
|
+
echo "正在关闭旧的 server 端口:$SERVER_PORT"
|
|
38
|
+
fuser -k "${SERVER_PORT}/tcp" 2>/dev/null || echo "关闭端口进程失败或端口未找到:$SERVER_PORT"
|
|
39
|
+
sleep 1
|
|
40
|
+
else
|
|
41
|
+
echo "端口 $SERVER_PORT 已占用,未启用 LICOS_DEV_KILL_PORTS,跳过自动关闭"
|
|
34
42
|
fi
|
|
35
43
|
}
|
|
36
44
|
|
|
@@ -32,7 +32,7 @@ config.resolver.blockList = [
|
|
|
32
32
|
/.*node_modules\/\.pnpm\/.*_tmp_\d+.*/,
|
|
33
33
|
];
|
|
34
34
|
|
|
35
|
-
const BACKEND_TARGET = 'http://localhost:
|
|
35
|
+
const BACKEND_TARGET = process.env.EXPO_PUBLIC_BACKEND_BASE_URL || 'http://localhost:5001';
|
|
36
36
|
|
|
37
37
|
const apiProxy = createProxyMiddleware({
|
|
38
38
|
target: BACKEND_TARGET,
|
package/lib/cli.js
CHANGED
|
@@ -2107,7 +2107,7 @@ const EventBuilder = {
|
|
|
2107
2107
|
};
|
|
2108
2108
|
|
|
2109
2109
|
var name = "@kmlckj/licos-ai-cli";
|
|
2110
|
-
var version = "0.0.
|
|
2110
|
+
var version = "0.0.24";
|
|
2111
2111
|
var description = "LICOS AI coding workspace CLI - project template engine and dev tools";
|
|
2112
2112
|
var license = "MIT";
|
|
2113
2113
|
var author = "kmlckj";
|