@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.
- package/lib/__templates__/expo/.cozeproj/scripts/dev_run.sh +10 -4
- package/lib/__templates__/nextjs/scripts/dev.sh +10 -4
- package/lib/__templates__/nuxt-vue/scripts/dev.sh +10 -4
- package/lib/__templates__/taro/.cozeproj/scripts/deploy_build.sh +4 -1
- package/lib/__templates__/taro/.cozeproj/scripts/deploy_run.sh +4 -0
- package/lib/__templates__/taro/.cozeproj/scripts/dev_run.ps1 +4 -2
- package/lib/__templates__/taro/.cozeproj/scripts/dev_run.sh +27 -7
- package/lib/__templates__/taro/.cozeproj/scripts/init_env.sh +4 -0
- package/lib/__templates__/taro/.cozeproj/scripts/pack.ps1 +3 -1
- package/lib/__templates__/taro/.cozeproj/scripts/pack.sh +8 -0
- package/lib/__templates__/taro/.cozeproj/scripts/validate.ps1 +3 -1
- package/lib/__templates__/taro/.cozeproj/scripts/validate.sh +4 -0
- package/lib/__templates__/taro/_gitignore +1 -0
- package/lib/__templates__/vite/scripts/dev.sh +10 -4
- package/lib/cli.js +1 -1
- package/package.json +1 -1
|
@@ -123,11 +123,15 @@ wait_port_connectable() {
|
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
# detached 出去的进程没人负责回收,超过这个时长就自己退出,避免端口与内存长期泄露。
|
|
126
|
-
MAX_RUNTIME_SECONDS=
|
|
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
|
|
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
|
-
|
|
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=
|
|
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
|
|
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
|
-
|
|
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=
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 权限也能跑
|
|
@@ -28,7 +28,9 @@ function Start-DevProcess([string] $workingDirectory, [string] $logFile, [hashta
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
$
|
|
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=
|
|
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
|
|
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 "
|
|
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
|
-
|
|
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,6 +1,8 @@
|
|
|
1
1
|
$ErrorActionPreference = "Stop"
|
|
2
2
|
|
|
3
|
-
$
|
|
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
|
-
$
|
|
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
|
|
@@ -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=
|
|
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
|
|
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
|
-
|
|
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.
|
|
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";
|