@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.
@@ -7,18 +7,14 @@ mkdir -p "$LOG_DIR"
7
7
  # ==================== 配置项 ====================
8
8
  # Server 服务配置
9
9
  SERVER_HOST="0.0.0.0"
10
- SERVER_PORT="9091"
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
- EXPO_PUBLIC_BACKEND_BASE_URL="${EXPO_PUBLIC_BACKEND_BASE_URL:-$WEB_URL}"
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
- ! lsof -iTCP:"$1" -sTCP:LISTEN >/dev/null 2>&1
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 [ "$ASSUME_YES" = "1" ]; then choice="Y"; else read -r -p "是否关闭该端口的进程?[Y/n] " choice || choice="Y"; fi
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
- if command -v lsof &> /dev/null; then
66
- local pids
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
- info "使用新的端口:$new_port"
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 "lsof"
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:-9091}"
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 command -v lsof &> /dev/null; then
27
- local pids
28
- pids=$(lsof -t -i tcp:"$SERVER_PORT" -sTCP:LISTEN 2>/dev/null || true)
29
- if [ -n "$pids" ]; then
30
- echo "正在关闭旧的 server 进程:$pids"
31
- kill -9 $pids 2>/dev/null || echo "关闭进程失败:$pids"
32
- sleep 1
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:9091';
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,
@@ -2,7 +2,7 @@ import express from "express";
2
2
  import cors from "cors";
3
3
 
4
4
  const app = express();
5
- const port = process.env.PORT || 9091;
5
+ const port = process.env.PORT || 5001;
6
6
 
7
7
  // Middleware
8
8
  app.use(cors());
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.22";
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";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kmlckj/licos-ai-cli",
3
- "version": "0.0.22",
3
+ "version": "0.0.24",
4
4
  "description": "LICOS AI coding workspace CLI - project template engine and dev tools",
5
5
  "license": "MIT",
6
6
  "author": "kmlckj",