@coze-arch/cli 0.1.4-alpha.d384e3 → 0.1.4-alpha.e5481b

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.
@@ -123,11 +123,15 @@ wait_port_connectable() {
123
123
  }
124
124
 
125
125
  # detached 出去的进程没人负责回收,超过这个时长就自己退出,避免端口与内存长期泄露。
126
- MAX_RUNTIME_SECONDS=1200
126
+ MAX_RUNTIME_SECONDS=3600
127
+
128
+ timeout_watchdog_enabled() {
129
+ [[ -z "${COZE_EVAL:-}" && -z "${COZE_PROJECT_TYPE:-}" ]]
130
+ }
127
131
 
128
132
  # 真正被 detach 的是这层 bash wrapper:它是进程组 leader,组内 watchdog 到点回收整组
129
133
  # (wrapper -> pnpm -> expo/node);被包的进程自己先退出时也顺手清空进程组,不留残余。
130
- RUN_WITH_TIMEOUT='
134
+ RUN_WITH_TIMEOUT="$(declare -f timeout_watchdog_enabled)"'
131
135
  timeout_seconds=$1
132
136
  shift
133
137
 
@@ -135,7 +139,7 @@ shift
135
139
  child_pid=$!
136
140
 
137
141
  # 先忽略 TERM,才能在向整组发 TERM(自己也在组里)之后存活下来补一发 KILL。
138
- if [[ -z "${COZE_EVAL:-}" && -z "${COZE_PROJECT_TYPE:-}" ]]; then
142
+ if timeout_watchdog_enabled; then
139
143
  ( trap "" TERM
140
144
  sleep "${timeout_seconds}"
141
145
  echo "[dev] 后台进程运行超过 ${timeout_seconds}s,回收进程组 $$。"
@@ -292,7 +296,9 @@ if [ -z "${EXPO_PID}" ]; then
292
296
  fi
293
297
 
294
298
  echo "所有服务已启动。Server PID: ${SERVER_PID}, Expo PID: ${EXPO_PID}"
295
- echo "两个服务均在 ${MAX_RUNTIME_SECONDS}s 后自动退出。"
299
+ if timeout_watchdog_enabled; then
300
+ echo "两个服务均在 ${MAX_RUNTIME_SECONDS}s 后自动退出。"
301
+ fi
296
302
 
297
303
  echo "检查 Server 服务端口:$SERVER_HOST:$SERVER_PORT"
298
304
  if wait_port_connectable "$SERVER_HOST" "$SERVER_PORT" 10 2; then
@@ -114,11 +114,15 @@ LOG_FILE="${LOG_DIR}/app.log"
114
114
  PID_FILE="${LOG_DIR}/server.pid"
115
115
 
116
116
  # detached 出去的进程没人负责回收,超过这个时长就自己退出,避免端口与内存长期泄露。
117
- MAX_RUNTIME_SECONDS=1200
117
+ MAX_RUNTIME_SECONDS=3600
118
+
119
+ timeout_watchdog_enabled() {
120
+ [[ -z "${COZE_EVAL:-}" && -z "${COZE_PROJECT_TYPE:-}" ]]
121
+ }
118
122
 
119
123
  # 真正被 detach 的是这层 bash wrapper:它是进程组 leader,组内 watchdog 到点回收整组
120
124
  # (wrapper -> pnpm -> next -> node);被包的进程自己先退出时也顺手清空进程组,不留残余。
121
- RUN_WITH_TIMEOUT='
125
+ RUN_WITH_TIMEOUT="$(declare -f timeout_watchdog_enabled)"'
122
126
  timeout_seconds=$1
123
127
  shift
124
128
 
@@ -126,7 +130,7 @@ shift
126
130
  child_pid=$!
127
131
 
128
132
  # 先忽略 TERM,才能在向整组发 TERM(自己也在组里)之后存活下来补一发 KILL。
129
- if [[ -z "${COZE_EVAL:-}" && -z "${COZE_PROJECT_TYPE:-}" ]]; then
133
+ if timeout_watchdog_enabled; then
130
134
  ( trap "" TERM
131
135
  sleep "${timeout_seconds}"
132
136
  echo "[dev] 后台进程运行超过 ${timeout_seconds}s,回收进程组 $$。"
@@ -330,7 +334,9 @@ fi
330
334
  dump_discovered_routes
331
335
 
332
336
  echo "Dev server started (PID: ${server_pid}), listening on port ${DEPLOY_RUN_PORT}."
333
- echo "Auto stop after ${MAX_RUNTIME_SECONDS}s."
337
+ if timeout_watchdog_enabled; then
338
+ echo "Auto stop after ${MAX_RUNTIME_SECONDS}s."
339
+ fi
334
340
  echo "Log file: ${LOG_FILE}"
335
341
  echo "PID file: ${PID_FILE}"
336
342
  <% } %>
@@ -65,11 +65,15 @@ LOG_FILE="${LOG_DIR}/server.log"
65
65
  PID_FILE="${LOG_DIR}/server.pid"
66
66
 
67
67
  # detached 出去的进程没人负责回收,超过这个时长就自己退出,避免端口与内存长期泄露。
68
- MAX_RUNTIME_SECONDS=1200
68
+ MAX_RUNTIME_SECONDS=3600
69
+
70
+ timeout_watchdog_enabled() {
71
+ [[ -z "${COZE_EVAL:-}" && -z "${COZE_PROJECT_TYPE:-}" ]]
72
+ }
69
73
 
70
74
  # 真正被 detach 的是这层 bash wrapper:它是进程组 leader,组内 watchdog 到点回收整组
71
75
  # (wrapper -> pnpm -> nuxt -> node);被包的进程自己先退出时也顺手清空进程组,不留残余。
72
- RUN_WITH_TIMEOUT='
76
+ RUN_WITH_TIMEOUT="$(declare -f timeout_watchdog_enabled)"'
73
77
  timeout_seconds=$1
74
78
  shift
75
79
 
@@ -77,7 +81,7 @@ shift
77
81
  child_pid=$!
78
82
 
79
83
  # 先忽略 TERM,才能在向整组发 TERM(自己也在组里)之后存活下来补一发 KILL。
80
- if [[ -z "${COZE_EVAL:-}" && -z "${COZE_PROJECT_TYPE:-}" ]]; then
84
+ if timeout_watchdog_enabled; then
81
85
  ( trap "" TERM
82
86
  sleep "${timeout_seconds}"
83
87
  echo "[dev] 后台进程运行超过 ${timeout_seconds}s,回收进程组 $$。"
@@ -264,7 +268,9 @@ if [[ "${ready_status}" -ne 0 ]]; then
264
268
  fi
265
269
 
266
270
  echo "Dev server started (PID: ${server_pid}), listening on port ${DEPLOY_RUN_PORT}."
267
- echo "Auto stop after ${MAX_RUNTIME_SECONDS}s."
271
+ if timeout_watchdog_enabled; then
272
+ echo "Auto stop after ${MAX_RUNTIME_SECONDS}s."
273
+ fi
268
274
  echo "Log file: ${LOG_FILE}"
269
275
  echo "PID file: ${PID_FILE}"
270
276
  <% } %>
@@ -2,7 +2,10 @@
2
2
  set -Eeuo pipefail
3
3
 
4
4
  ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
5
- cd "$ROOT_DIR"
5
+ COZE_WORKSPACE_PATH="${COZE_WORKSPACE_PATH:-${ROOT_DIR}}"
6
+ export COZE_WORKSPACE_PATH
7
+
8
+ cd "${COZE_WORKSPACE_PATH}"
6
9
  if [ -f "./.cozeproj/scripts/init_env.sh" ]; then
7
10
  echo "⚙️ Initializing environment..."
8
11
  # 使用 bash 执行,确保即使没有 x 权限也能跑
@@ -1,6 +1,10 @@
1
1
  #!/bin/bash
2
2
  set -Eeuo pipefail
3
3
 
4
+ ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
5
+ COZE_WORKSPACE_PATH="${COZE_WORKSPACE_PATH:-${ROOT_DIR}}"
6
+ export COZE_WORKSPACE_PATH
7
+
4
8
  start_service() {
5
9
  cd "${COZE_WORKSPACE_PATH}/server/dist"
6
10
 
@@ -28,7 +28,9 @@ function Start-DevProcess([string] $workingDirectory, [string] $logFile, [hashta
28
28
  }
29
29
  }
30
30
 
31
- $workspace = if ($env:COZE_WORKSPACE_PATH) { $env:COZE_WORKSPACE_PATH } else { (Get-Location).Path }
31
+ $projectRoot = (Resolve-Path (Join-Path $PSScriptRoot "../..")).Path
32
+ $workspace = if ($env:COZE_WORKSPACE_PATH) { $env:COZE_WORKSPACE_PATH } else { $projectRoot }
33
+ $env:COZE_WORKSPACE_PATH = $workspace
32
34
  $port = if ($env:DEPLOY_RUN_PORT) { [int] $env:DEPLOY_RUN_PORT } elseif ($env:PORT) { [int] $env:PORT } else { <%= port %> }
33
35
  $serverPort = if ($env:SERVER_PORT) { [int] $env:SERVER_PORT } else { <%= serverPort %> }
34
36
  $logDirectory = if ($env:COZE_LOG_DIR) { $env:COZE_LOG_DIR } else { Join-Path $workspace "logs" }
@@ -43,7 +45,7 @@ if (Test-Path $pidFile) {
43
45
  Stop-ListeningProcess $port
44
46
  Stop-ListeningProcess $serverPort
45
47
 
46
- $environment = @{ PORT = "$port"; SERVER_PORT = "$serverPort" }
48
+ $environment = @{ COZE_WORKSPACE_PATH = $workspace; PORT = "$port"; SERVER_PORT = "$serverPort" }
47
49
  if ($env:COZE_PROJECT_DOMAIN_DEFAULT) {
48
50
  $environment.PROJECT_DOMAIN = $env:COZE_PROJECT_DOMAIN_DEFAULT
49
51
  }
@@ -4,6 +4,7 @@ set -Eeuo pipefail
4
4
 
5
5
  ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
6
6
  COZE_WORKSPACE_PATH="${COZE_WORKSPACE_PATH:-${ROOT_DIR}}"
7
+ export COZE_WORKSPACE_PATH
7
8
  cd "${COZE_WORKSPACE_PATH}"
8
9
 
9
10
  # ---------------------------------------------------------
@@ -31,11 +32,15 @@ kill_process_tree() {
31
32
  }
32
33
 
33
34
  # detached 出去的进程没人负责回收,超过这个时长就自己退出,避免端口与内存长期泄露。
34
- MAX_RUNTIME_SECONDS=1200
35
+ MAX_RUNTIME_SECONDS=3600
36
+
37
+ timeout_watchdog_enabled() {
38
+ [[ -z "${COZE_EVAL:-}" && -z "${COZE_PROJECT_TYPE:-}" ]]
39
+ }
35
40
 
36
41
  # 真正被 detach 的是这层 bash wrapper:它是进程组 leader,组内 watchdog 到点回收整组
37
42
  # (wrapper -> pnpm -> taro/nest);被包的进程自己先退出时也顺手清空进程组,不留残余。
38
- RUN_WITH_TIMEOUT='
43
+ RUN_WITH_TIMEOUT="$(declare -f timeout_watchdog_enabled)"'
39
44
  timeout_seconds=$1
40
45
  shift
41
46
 
@@ -43,7 +48,7 @@ shift
43
48
  child_pid=$!
44
49
 
45
50
  # 先忽略 TERM,才能在向整组发 TERM(自己也在组里)之后存活下来补一发 KILL。
46
- if [[ -z "${COZE_EVAL:-}" && -z "${COZE_PROJECT_TYPE:-}" ]]; then
51
+ if timeout_watchdog_enabled; then
47
52
  ( trap "" TERM
48
53
  sleep "${timeout_seconds}"
49
54
  echo "[dev] 后台进程运行超过 ${timeout_seconds}s,回收进程组 $$。"
@@ -157,12 +162,24 @@ list_port_pids() {
157
162
 
158
163
  kill_port_if_listening() {
159
164
  local port=$1
165
+ # 用于错误提示的端口环境变量名称,例如 DEPLOY_RUN_PORT 或 SERVER_PORT。
166
+ local port_env_name=$2
160
167
  local pids
168
+ local pid
161
169
  pids=$(list_port_pids "${port}")
162
170
  if [[ -z "${pids}" ]]; then
163
171
  echo "Port ${port} is free."
164
172
  return
165
173
  fi
174
+
175
+ # 端口可能由另一个项目占用。必须在杀进程前校验全部 PID,避免清理到一半才发现外部进程。
176
+ for pid in ${pids}; do
177
+ if ! process_belongs_to_workspace "${pid}"; then
178
+ echo "Error: port ${port} is occupied by PID ${pid}, which does not belong to workspace ${COZE_WORKSPACE_PATH}. Refusing to kill it. Set ${port_env_name} to another port and retry." >&2
179
+ return 1
180
+ fi
181
+ done
182
+
166
183
  echo "Port ${port} in use by PIDs: ${pids} (SIGKILL)"
167
184
  for pid in ${pids}; do
168
185
  kill_process_tree "${pid}"
@@ -170,7 +187,8 @@ kill_port_if_listening() {
170
187
  sleep 1
171
188
  pids=$(list_port_pids "${port}")
172
189
  if [[ -n "${pids}" ]]; then
173
- echo "Warning: port ${port} still busy after SIGKILL, PIDs: ${pids}"
190
+ echo "Error: port ${port} is still occupied after cleaning up this project's processes, PIDs: ${pids}. Check the remaining processes manually or set ${port_env_name} to another port and retry." >&2
191
+ return 1
174
192
  else
175
193
  echo "Port ${port} cleared."
176
194
  fi
@@ -212,9 +230,9 @@ mkdir -p "${LOG_DIR}"
212
230
  cleanup_previous_run
213
231
 
214
232
  echo "Clearing port ${PORT} (web) before start."
215
- kill_port_if_listening "${PORT}"
233
+ kill_port_if_listening "${PORT}" "DEPLOY_RUN_PORT"
216
234
  echo "Clearing port ${SERVER_PORT} (server) before start."
217
- kill_port_if_listening "${SERVER_PORT}"
235
+ kill_port_if_listening "${SERVER_PORT}" "SERVER_PORT"
218
236
 
219
237
  # ---------------------------------------------------------
220
238
  # 4. 启动服务
@@ -254,7 +272,9 @@ start_service() {
254
272
  fi
255
273
 
256
274
  echo "📝 Dev process started with PID: ${DEV_PID}"
257
- echo "Auto stop after ${MAX_RUNTIME_SECONDS}s."
275
+ if timeout_watchdog_enabled; then
276
+ echo "Auto stop after ${MAX_RUNTIME_SECONDS}s."
277
+ fi
258
278
  echo "Log file: ${LOG_FILE}"
259
279
  echo "PID file: ${PID_FILE}"
260
280
  }
@@ -1,5 +1,9 @@
1
1
  #!/bin/bash
2
2
 
3
+ ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
4
+ COZE_WORKSPACE_PATH="${COZE_WORKSPACE_PATH:-${ROOT_DIR}}"
5
+ export COZE_WORKSPACE_PATH
6
+
3
7
  cd "${COZE_WORKSPACE_PATH}"
4
8
 
5
9
  echo "✅ 初始化完成"
@@ -1,6 +1,8 @@
1
1
  $ErrorActionPreference = "Stop"
2
2
 
3
- $workspace = if ($env:COZE_WORKSPACE_PATH) { $env:COZE_WORKSPACE_PATH } else { (Get-Location).Path }
3
+ $projectRoot = (Resolve-Path (Join-Path $PSScriptRoot "../..")).Path
4
+ $workspace = if ($env:COZE_WORKSPACE_PATH) { $env:COZE_WORKSPACE_PATH } else { $projectRoot }
5
+ $env:COZE_WORKSPACE_PATH = $workspace
4
6
  Set-Location $workspace
5
7
 
6
8
  & pnpm build:pack
@@ -1,3 +1,11 @@
1
+ #!/bin/bash
2
+
3
+ ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
4
+ COZE_WORKSPACE_PATH="${COZE_WORKSPACE_PATH:-${ROOT_DIR}}"
5
+ export COZE_WORKSPACE_PATH
6
+
7
+ cd "${COZE_WORKSPACE_PATH}"
8
+
1
9
  # build_weapp.sh - 通过 PID 文件精确杀掉自己上次的构建进程
2
10
  PID_FILE="/tmp/coze-build_weapp.pid"
3
11
 
@@ -1,6 +1,8 @@
1
1
  $ErrorActionPreference = "Stop"
2
2
 
3
- $workspace = if ($env:COZE_WORKSPACE_PATH) { $env:COZE_WORKSPACE_PATH } else { (Get-Location).Path }
3
+ $projectRoot = (Resolve-Path (Join-Path $PSScriptRoot "../..")).Path
4
+ $workspace = if ($env:COZE_WORKSPACE_PATH) { $env:COZE_WORKSPACE_PATH } else { $projectRoot }
5
+ $env:COZE_WORKSPACE_PATH = $workspace
4
6
  Set-Location $workspace
5
7
 
6
8
  & pnpm validate
@@ -1,6 +1,10 @@
1
1
  #!/bin/bash
2
2
  set -Eeuo pipefail
3
3
 
4
+ ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
5
+ COZE_WORKSPACE_PATH="${COZE_WORKSPACE_PATH:-${ROOT_DIR}}"
6
+ export COZE_WORKSPACE_PATH
7
+
4
8
  cd "${COZE_WORKSPACE_PATH}"
5
9
 
6
10
  echo "🔍 Running validate..."
@@ -17,6 +17,7 @@ dist-*/
17
17
  .env.production.local
18
18
 
19
19
  # Logs
20
+ /logs
20
21
  npm-debug.log*
21
22
  yarn-debug.log*
22
23
  yarn-error.log*
@@ -45,11 +45,15 @@ LOG_FILE="${LOG_DIR}/server.log"
45
45
  PID_FILE="${LOG_DIR}/server.pid"
46
46
 
47
47
  # detached 出去的进程没人负责回收,超过这个时长就自己退出,避免端口与内存长期泄露。
48
- MAX_RUNTIME_SECONDS=1200
48
+ MAX_RUNTIME_SECONDS=3600
49
+
50
+ timeout_watchdog_enabled() {
51
+ [[ -z "${COZE_EVAL:-}" && -z "${COZE_PROJECT_TYPE:-}" ]]
52
+ }
49
53
 
50
54
  # 真正被 detach 的是这层 bash wrapper:它是进程组 leader,组内 watchdog 到点回收整组
51
55
  # (wrapper -> pnpm -> tsx -> node);被包的进程自己先退出时也顺手清空进程组,不留残余。
52
- RUN_WITH_TIMEOUT='
56
+ RUN_WITH_TIMEOUT="$(declare -f timeout_watchdog_enabled)"'
53
57
  timeout_seconds=$1
54
58
  shift
55
59
 
@@ -57,7 +61,7 @@ shift
57
61
  child_pid=$!
58
62
 
59
63
  # 先忽略 TERM,才能在向整组发 TERM(自己也在组里)之后存活下来补一发 KILL。
60
- if [[ -z "${COZE_EVAL:-}" && -z "${COZE_PROJECT_TYPE:-}" ]]; then
64
+ if timeout_watchdog_enabled; then
61
65
  ( trap "" TERM
62
66
  sleep "${timeout_seconds}"
63
67
  echo "[dev] 后台进程运行超过 ${timeout_seconds}s,回收进程组 $$。"
@@ -144,7 +148,9 @@ if [[ -z "${server_pid}" ]] || ! kill -0 "${server_pid}" 2>/dev/null; then
144
148
  fi
145
149
 
146
150
  echo "Dev server started (PID: ${server_pid})."
147
- echo "Auto stop after ${MAX_RUNTIME_SECONDS}s."
151
+ if timeout_watchdog_enabled; then
152
+ echo "Auto stop after ${MAX_RUNTIME_SECONDS}s."
153
+ fi
148
154
  echo "Log file: ${LOG_FILE}"
149
155
  echo "PID file: ${PID_FILE}"
150
156
  <% } %>
package/lib/cli.js CHANGED
@@ -2114,7 +2114,7 @@ const EventBuilder = {
2114
2114
  };
2115
2115
 
2116
2116
  var name = "@coze-arch/cli";
2117
- var version = "0.1.4-alpha.d384e3";
2117
+ var version = "0.1.4-alpha.e5481b";
2118
2118
  var description = "coze coding devtools cli";
2119
2119
  var license = "MIT";
2120
2120
  var author = "fanwenjie.fe@bytedance.com";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coze-arch/cli",
3
- "version": "0.1.4-alpha.d384e3",
3
+ "version": "0.1.4-alpha.e5481b",
4
4
  "private": false,
5
5
  "description": "coze coding devtools cli",
6
6
  "license": "MIT",