@coze-arch/cli 0.0.36-alpha.3ab612 → 0.0.36-alpha.4e6503

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.
Files changed (151) hide show
  1. package/README.md +104 -68
  2. package/lib/__templates__/expo/.cozeproj/scripts/dev_run.sh +19 -80
  3. package/lib/__templates__/expo/.cozeproj/scripts/prod_run.sh +1 -1
  4. package/lib/__templates__/expo/.cozeproj/scripts/server_dev_run.sh +1 -1
  5. package/lib/__templates__/expo/client/metro.config.js +1 -3
  6. package/lib/__templates__/expo/pnpm-lock.yaml +5 -5
  7. package/lib/__templates__/expo/server/package.json +2 -2
  8. package/lib/__templates__/expo/server/src/index.ts +1 -1
  9. package/lib/__templates__/expo/template.config.js +2 -11
  10. package/lib/__templates__/native-static/.coze +0 -2
  11. package/lib/__templates__/nextjs/.coze +0 -5
  12. package/lib/__templates__/nextjs/package.json +1 -1
  13. package/lib/__templates__/nextjs/pnpm-lock.yaml +5 -5
  14. package/lib/__templates__/nextjs/scripts/dev.sh +7 -205
  15. package/lib/__templates__/nextjs/template.config.js +2 -4
  16. package/lib/__templates__/nuxt-vue/.coze +0 -5
  17. package/lib/__templates__/nuxt-vue/package.json +1 -1
  18. package/lib/__templates__/nuxt-vue/pnpm-lock.yaml +5 -5
  19. package/lib/__templates__/nuxt-vue/scripts/dev.sh +1 -82
  20. package/lib/__templates__/pi-agent/package.json +1 -1
  21. package/lib/__templates__/pi-agent/pnpm-lock.yaml +5 -5
  22. package/lib/__templates__/taro/.cozeproj/scripts/deploy_run.sh +1 -1
  23. package/lib/__templates__/taro/.cozeproj/scripts/dev_run.sh +68 -150
  24. package/lib/__templates__/taro/AGENTS.md +7 -11
  25. package/lib/__templates__/taro/README.md +4 -4
  26. package/lib/__templates__/taro/config/index.ts +2 -10
  27. package/lib/__templates__/taro/pnpm-lock.yaml +5 -5
  28. package/lib/__templates__/taro/server/package.json +1 -1
  29. package/lib/__templates__/taro/server/src/main.ts +2 -8
  30. package/lib/__templates__/templates.json +1 -51
  31. package/lib/__templates__/vite/package.json +1 -1
  32. package/lib/__templates__/vite/pnpm-lock.yaml +5 -5
  33. package/lib/__templates__/vite/scripts/build.ps1 +1 -1
  34. package/lib/__templates__/vite/scripts/dev.ps1 +65 -9
  35. package/lib/__templates__/vite/scripts/dev.sh +1 -82
  36. package/lib/__templates__/vite/scripts/start.ps1 +8 -2
  37. package/lib/__templates__/vite/template.config.js +2 -4
  38. package/lib/cli.js +204 -3590
  39. package/package.json +3 -5
  40. package/docs/deploy.md +0 -179
  41. package/lib/__templates__/native-static/scripts/serve.ps1 +0 -7
  42. package/lib/__templates__/nextjs/scripts/build.ps1 +0 -16
  43. package/lib/__templates__/nextjs/scripts/dev.ps1 +0 -63
  44. package/lib/__templates__/nextjs/scripts/prepare.ps1 +0 -18
  45. package/lib/__templates__/nextjs/scripts/start.ps1 +0 -11
  46. package/lib/__templates__/nextjs/scripts/validate.ps1 +0 -8
  47. package/lib/__templates__/nuxt-vue/scripts/build.ps1 +0 -12
  48. package/lib/__templates__/nuxt-vue/scripts/dev.ps1 +0 -63
  49. package/lib/__templates__/nuxt-vue/scripts/prepare.ps1 +0 -12
  50. package/lib/__templates__/nuxt-vue/scripts/start.ps1 +0 -11
  51. package/lib/__templates__/nuxt-vue/scripts/validate.ps1 +0 -8
  52. package/lib/__templates__/phaser/.coze +0 -18
  53. package/lib/__templates__/phaser/README.md +0 -45
  54. package/lib/__templates__/phaser/_gitignore +0 -23
  55. package/lib/__templates__/phaser/_npmrc +0 -14
  56. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0001.png +0 -0
  57. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0002.png +0 -0
  58. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0003.png +0 -0
  59. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0004.png +0 -0
  60. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0005.png +0 -0
  61. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0006.png +0 -0
  62. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0007.png +0 -0
  63. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0008.png +0 -0
  64. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0009.png +0 -0
  65. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0010.png +0 -0
  66. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0011.png +0 -0
  67. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0012.png +0 -0
  68. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0013.png +0 -0
  69. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0014.png +0 -0
  70. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0015.png +0 -0
  71. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0016.png +0 -0
  72. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0017.png +0 -0
  73. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0018.png +0 -0
  74. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0019.png +0 -0
  75. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0020.png +0 -0
  76. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0021.png +0 -0
  77. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0022.png +0 -0
  78. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0023.png +0 -0
  79. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0024.png +0 -0
  80. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/manifest.json +0 -11
  81. package/lib/__templates__/phaser/debug-runtime/flow-graph.json +0 -20
  82. package/lib/__templates__/phaser/index.html +0 -12
  83. package/lib/__templates__/phaser/package.json +0 -31
  84. package/lib/__templates__/phaser/pnpm-lock.yaml +0 -661
  85. package/lib/__templates__/phaser/scripts/build.ps1 +0 -12
  86. package/lib/__templates__/phaser/scripts/build.sh +0 -8
  87. package/lib/__templates__/phaser/scripts/dev.ps1 +0 -49
  88. package/lib/__templates__/phaser/scripts/dev.sh +0 -82
  89. package/lib/__templates__/phaser/scripts/prepare.ps1 +0 -8
  90. package/lib/__templates__/phaser/scripts/prepare.sh +0 -7
  91. package/lib/__templates__/phaser/scripts/spawn-detached.cjs +0 -29
  92. package/lib/__templates__/phaser/scripts/start.ps1 +0 -49
  93. package/lib/__templates__/phaser/scripts/start.sh +0 -82
  94. package/lib/__templates__/phaser/scripts/validate.ps1 +0 -7
  95. package/lib/__templates__/phaser/scripts/validate.sh +0 -7
  96. package/lib/__templates__/phaser/src/assets.ts +0 -15
  97. package/lib/__templates__/phaser/src/global.d.ts +0 -39
  98. package/lib/__templates__/phaser/src/main.ts +0 -28
  99. package/lib/__templates__/phaser/src/scene/BootScene.ts +0 -213
  100. package/lib/__templates__/phaser/src/scene/DevLoadingScene.ts +0 -69
  101. package/lib/__templates__/phaser/src/style.css +0 -28
  102. package/lib/__templates__/phaser/src/types.ts +0 -32
  103. package/lib/__templates__/phaser/src/utils/asset-loader.ts +0 -319
  104. package/lib/__templates__/phaser/src/utils/index.ts +0 -2
  105. package/lib/__templates__/phaser/src/utils/mark-editable.ts +0 -13
  106. package/lib/__templates__/phaser/template.config.js +0 -43
  107. package/lib/__templates__/phaser/tsconfig.json +0 -23
  108. package/lib/__templates__/phaser/vite.config.ts +0 -96
  109. package/lib/__templates__/phaser-static/.coze +0 -15
  110. package/lib/__templates__/phaser-static/README.md +0 -40
  111. package/lib/__templates__/phaser-static/_gitignore +0 -6
  112. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0001.png +0 -0
  113. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0002.png +0 -0
  114. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0003.png +0 -0
  115. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0004.png +0 -0
  116. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0005.png +0 -0
  117. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0006.png +0 -0
  118. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0007.png +0 -0
  119. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0008.png +0 -0
  120. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0009.png +0 -0
  121. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0010.png +0 -0
  122. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0011.png +0 -0
  123. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0012.png +0 -0
  124. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0013.png +0 -0
  125. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0014.png +0 -0
  126. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0015.png +0 -0
  127. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0016.png +0 -0
  128. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0017.png +0 -0
  129. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0018.png +0 -0
  130. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0019.png +0 -0
  131. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0020.png +0 -0
  132. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0021.png +0 -0
  133. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0022.png +0 -0
  134. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0023.png +0 -0
  135. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0024.png +0 -0
  136. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/manifest.json +0 -11
  137. package/lib/__templates__/phaser-static/debug-runtime/flow-graph.json +0 -20
  138. package/lib/__templates__/phaser-static/index.html +0 -17
  139. package/lib/__templates__/phaser-static/scripts/serve.ps1 +0 -7
  140. package/lib/__templates__/phaser-static/src/assets.js +0 -15
  141. package/lib/__templates__/phaser-static/src/main.js +0 -26
  142. package/lib/__templates__/phaser-static/src/phaser.js +0 -7
  143. package/lib/__templates__/phaser-static/src/scene/BootScene.js +0 -205
  144. package/lib/__templates__/phaser-static/src/scene/DevLoadingScene.js +0 -67
  145. package/lib/__templates__/phaser-static/src/style.css +0 -28
  146. package/lib/__templates__/phaser-static/src/utils/asset-loader.js +0 -267
  147. package/lib/__templates__/phaser-static/src/utils/index.js +0 -2
  148. package/lib/__templates__/phaser-static/src/utils/mark-editable.js +0 -3
  149. package/lib/__templates__/phaser-static/template.config.js +0 -35
  150. package/lib/deploy/package-project.js +0 -244
  151. package/lib/deploy/package-project.py +0 -183
@@ -7,231 +7,33 @@ PORT="${PORT:-<%= port %>}"
7
7
  COZE_WORKSPACE_PATH="${COZE_WORKSPACE_PATH:-$(pwd)}"
8
8
  DEPLOY_RUN_PORT="${DEPLOY_RUN_PORT:-${PORT}}"
9
9
  <% } else { %>
10
- PORT="${DEPLOY_RUN_PORT:-${PORT:-<%= port %>}}"
10
+ PORT=<%= port %>
11
11
  COZE_WORKSPACE_PATH="${COZE_WORKSPACE_PATH:-$(pwd)}"
12
12
  DEPLOY_RUN_PORT="${DEPLOY_RUN_PORT:-${PORT}}"
13
13
  <% } %>
14
14
 
15
15
  cd "${COZE_WORKSPACE_PATH}"
16
16
 
17
- list_port_pids() {
18
- local port=$1
19
- local pids=""
20
- local has_tool=0
21
-
22
- if command -v ss >/dev/null 2>&1; then
23
- has_tool=1
24
- pids=$(ss -H -lntp 2>/dev/null | awk -v port="${port}" '$4 ~ ":"port"$"' | grep -o 'pid=[0-9]*' | cut -d= -f2 | sort -u | paste -sd' ' - || true)
25
- fi
26
- if [[ -z "${pids}" ]] && command -v lsof >/dev/null 2>&1; then
27
- has_tool=1
28
- pids=$(lsof -t -iTCP:"${port}" -sTCP:LISTEN 2>/dev/null | sort -u | paste -sd' ' - || true)
29
- fi
30
- if [[ "${has_tool}" -eq 0 ]]; then
31
- echo "Warning: neither ss nor lsof available, cannot inspect port ${port}." >&2
32
- fi
33
-
34
- echo "${pids}"
35
- }
36
-
37
17
  kill_port_if_listening() {
38
18
  local pids
39
- pids=$(list_port_pids "${DEPLOY_RUN_PORT}")
19
+ pids=$(ss -H -lntp 2>/dev/null | awk -v port="${DEPLOY_RUN_PORT}" '$4 ~ ":"port"$"' | grep -o 'pid=[0-9]*' | cut -d= -f2 | paste -sd' ' - || true)
40
20
  if [[ -z "${pids}" ]]; then
41
21
  echo "Port ${DEPLOY_RUN_PORT} is free."
42
22
  return
43
23
  fi
44
24
  echo "Port ${DEPLOY_RUN_PORT} in use by PIDs: ${pids} (SIGKILL)"
45
- echo "${pids}" | xargs -I {} kill -9 {} || true
25
+ echo "${pids}" | xargs -I {} kill -9 {}
46
26
  sleep 1
47
- pids=$(list_port_pids "${DEPLOY_RUN_PORT}")
27
+ pids=$(ss -H -lntp 2>/dev/null | awk -v port="${DEPLOY_RUN_PORT}" '$4 ~ ":"port"$"' | grep -o 'pid=[0-9]*' | cut -d= -f2 | paste -sd' ' - || true)
48
28
  if [[ -n "${pids}" ]]; then
49
- echo "端口 ${DEPLOY_RUN_PORT} PID ${pids} 占用且无法清理(SIGKILL 后仍在监听),dev server 无法启动。" >&2
50
- exit 1
51
- fi
52
- echo "Port ${DEPLOY_RUN_PORT} cleared."
53
- }
54
-
55
- <% if (process.env.NODE_ENV === 'test') { %>
56
- echo "Clearing port ${DEPLOY_RUN_PORT} before start."
57
- kill_port_if_listening
58
- echo "Starting HTTP service on port ${DEPLOY_RUN_PORT} for dev..."
59
-
60
- # 测试环境保持服务为前台进程,便于 e2e 收集输出并停止进程。
61
- exec env PORT="${DEPLOY_RUN_PORT}" pnpm tsx watch src/server.ts
62
- <% } else { %>
63
- LOG_DIR="${COZE_LOG_DIR:-${COZE_WORKSPACE_PATH}/logs}"
64
- LOG_FILE="${LOG_DIR}/server.log"
65
- PID_FILE="${LOG_DIR}/server.pid"
66
-
67
- spawn_detached() {
68
- local cwd="$1"
69
- local log_file="$2"
70
- shift 2
71
-
72
- node - "$cwd" "$log_file" "$@" <<'NODE'
73
- const fs = require('node:fs');
74
- const { spawn } = require('node:child_process');
75
-
76
- const [cwd, logFile, command, ...args] = process.argv.slice(2);
77
- if (!cwd || !logFile || !command) {
78
- throw new Error('spawn_detached 缺少 cwd、log_file 或 command');
79
- }
80
-
81
- const logFd = fs.openSync(logFile, 'a');
82
- try {
83
- const child = spawn(command, args, {
84
- cwd,
85
- detached: true,
86
- env: process.env,
87
- stdio: ['ignore', logFd, logFd],
88
- });
89
- child.unref();
90
- process.stdout.write(String(child.pid));
91
- } finally {
92
- fs.closeSync(logFd);
93
- }
94
- NODE
95
- }
96
-
97
- stop_detached() {
98
- local pid="${1:-}"
99
- if [[ -z "${pid}" ]]; then
100
- return
101
- fi
102
-
103
- kill -TERM -- "-${pid}" 2>/dev/null || kill -TERM "${pid}" 2>/dev/null || true
104
- sleep 1
105
- kill -KILL -- "-${pid}" 2>/dev/null || true
106
- }
107
-
108
- READY_RETRIES=10
109
- READY_PROBE_HOSTS=("127.0.0.1" "::1")
110
- LOG_TAIL_LINES=40
111
-
112
- dump_log() {
113
- echo "---- tail -n ${LOG_TAIL_LINES} ${LOG_FILE} ----" >&2
114
- tail -n "${LOG_TAIL_LINES}" "${LOG_FILE}" >&2 || true
115
- echo "---- end of ${LOG_FILE} ----" >&2
116
- }
117
-
118
- # 仅用于无 ss/lsof 时的兜底探测。服务可能只 bind IPv4 loopback、只 bind IPv6 loopback
119
- # (server.listen(port, 'localhost') 会变成 ::1 独占),或 bind 双栈通配地址,
120
- port_connectable() {
121
- local port=$1
122
- local host
123
- for host in "${READY_PROBE_HOSTS[@]}"; do
124
- if command -v nc >/dev/null 2>&1; then
125
- if nc -z -w 1 "${host}" "${port}" >/dev/null 2>&1; then
126
- return 0
127
- fi
128
- elif (exec 3<>"/dev/tcp/${host}/${port}") >/dev/null 2>&1; then
129
- return 0
130
- fi
131
- done
132
- return 1
133
- }
134
-
135
- port_probe_available() {
136
- command -v ss >/dev/null 2>&1 || command -v lsof >/dev/null 2>&1
137
- }
138
-
139
- # 端口监听者是否属于本进程组:spawn detached 后 PID == PGID,子孙进程继承该 PGID。
140
- # 0 = 是;1 = 不是(无人监听,或监听者不属于本进程组);2 = 无探测工具,无法判断
141
- port_listened_by_pgid() {
142
- local port=$1 pgid=$2
143
- local listener owner
144
-
145
- if ! port_probe_available; then
146
- return 2
147
- fi
148
-
149
- for listener in $(list_port_pids "${port}" 2>/dev/null); do
150
- owner=$(ps -o pgid= -p "${listener}" 2>/dev/null | tr -d ' ')
151
- if [[ "${owner}" == "${pgid}" ]]; then
152
- return 0
153
- fi
154
- done
155
- return 1
156
- }
157
-
158
- wait_for_ready() {
159
- local pid=$1 port=$2
160
- local attempt=0 owned
161
-
162
- if ! port_probe_available; then
163
- echo "Warning: 缺少 ss 与 lsof,无法确认端口监听者归属,仅按 loopback 可连接性判断就绪。" >&2
164
- fi
165
-
166
- while [[ "${attempt}" -lt "${READY_RETRIES}" ]]; do
167
- if ! kill -0 "${pid}" 2>/dev/null; then
168
- echo "Dev server 进程在启动过程中退出。" >&2
169
- return 1
170
- fi
171
-
172
- if port_listened_by_pgid "${port}" "${pid}"; then
173
- owned=0
29
+ echo "Warning: port ${DEPLOY_RUN_PORT} still busy after SIGKILL, PIDs: ${pids}"
174
30
  else
175
- owned=$?
176
- fi
177
- if [[ "${owned}" -eq 0 ]]; then
178
- return 0
179
- fi
180
- if [[ "${owned}" -eq 2 ]] && port_connectable "${port}"; then
181
- return 0
31
+ echo "Port ${DEPLOY_RUN_PORT} cleared."
182
32
  fi
183
-
184
- sleep 1
185
- attempt=$((attempt + 1))
186
- done
187
-
188
- return 2
189
33
  }
190
34
 
191
- # 监听端口的是孙进程(pnpm -> tsx -> node),只清端口会漏掉上层 pnpm/tsx,
192
- # 所以先按上次记录的 PID 把整个进程组回收掉。
193
- if [[ -f "${PID_FILE}" ]]; then
194
- stop_detached "$(cat "${PID_FILE}" 2>/dev/null || true)"
195
- rm -f "${PID_FILE}"
196
- fi
197
-
198
35
  echo "Clearing port ${DEPLOY_RUN_PORT} before start."
199
36
  kill_port_if_listening
200
37
  echo "Starting HTTP service on port ${DEPLOY_RUN_PORT} for dev..."
201
38
 
202
- mkdir -p "${LOG_DIR}"
203
- : > "${LOG_FILE}"
204
-
205
- export PORT="${DEPLOY_RUN_PORT}"
206
- server_pid="$(spawn_detached "${COZE_WORKSPACE_PATH}" "${LOG_FILE}" \
207
- "$(command -v pnpm)" tsx watch src/server.ts)"
208
- if [[ -z "${server_pid}" ]]; then
209
- echo "Dev server failed to start: 未获取到后台进程 PID。" >&2
210
- dump_log
211
- exit 1
212
- fi
213
- echo "${server_pid}" > "${PID_FILE}"
214
-
215
- if wait_for_ready "${server_pid}" "${DEPLOY_RUN_PORT}"; then
216
- ready_status=0
217
- else
218
- ready_status=$?
219
- fi
220
-
221
- if [[ "${ready_status}" -eq 2 ]]; then
222
- # 进程还活着但迟迟没监听端口:多半是编译/运行时报错后 tsx watch 驻留,日志里有真正原因。
223
- echo "Dev server 在 ${READY_RETRIES} 次探测(每次 1s)内未就绪于端口 ${DEPLOY_RUN_PORT}(进程 ${server_pid} 仍在运行)。" >&2
224
- dump_log
225
- exit 1
226
- elif [[ "${ready_status}" -ne 0 ]]; then
227
- echo "Dev server failed to start. See ${LOG_FILE}." >&2
228
- dump_log
229
- stop_detached "${server_pid}"
230
- rm -f "${PID_FILE}"
231
- exit 1
232
- fi
233
-
234
- echo "Dev server started (PID: ${server_pid}), listening on port ${DEPLOY_RUN_PORT}."
235
- echo "Log file: ${LOG_FILE}"
236
- echo "PID file: ${PID_FILE}"
237
- <% } %>
39
+ PORT=${DEPLOY_RUN_PORT} pnpm tsx watch src/server.ts
@@ -3,7 +3,6 @@
3
3
  import { spawn } from 'child_process';
4
4
  import { resolve, join, basename } from 'path';
5
5
  import { appendFileSync, openSync, closeSync, mkdirSync } from 'fs';
6
- import { homedir } from 'os';
7
6
 
8
7
 
9
8
 
@@ -66,7 +65,7 @@ const config = {
66
65
  }
67
66
 
68
67
  const cmd = 'pnpm';
69
- const args = ['update', 'coze-coding-dev-sdk@^0.7.25-beta.8'];
68
+ const args = ['update', 'coze-coding-dev-sdk@^0.7.0'];
70
69
  console.log(
71
70
  `\nTriggering: ${cmd} ${args.join(' ')} (running in background)`,
72
71
  );
@@ -75,8 +74,7 @@ const config = {
75
74
  const projectRoot = resolve(outputPath);
76
75
 
77
76
  // Determine log directory
78
- const cozeHome = process.env.COZE_HOME || join(homedir(), '.coze');
79
- const logDir = process.env.COZE_LOG_DIR || join(cozeHome, 'logs');
77
+ const logDir = process.env.COZE_LOG_DIR || resolve(__dirname, '../.log');
80
78
  mkdirSync(logDir, { recursive: true });
81
79
 
82
80
  // Use project name in log file to avoid conflicts
@@ -4,16 +4,11 @@ project_type = "web"
4
4
 
5
5
  [dev]
6
6
  build = ["bash", "./scripts/prepare.sh"]
7
- build_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "./scripts/prepare.ps1"]
8
7
  run = ["bash", "./scripts/dev.sh"]
9
- run_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "./scripts/dev.ps1"]
10
8
  validate = ["bash", "./scripts/validate.sh"]
11
- validate_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "./scripts/validate.ps1"]
12
9
  deps = ["git"] # -> apt install git
13
10
 
14
11
  [deploy]
15
12
  build = ["bash","./scripts/build.sh"]
16
- build_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "./scripts/build.ps1"]
17
13
  run = ["bash","./scripts/start.sh"]
18
- run_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "./scripts/start.ps1"]
19
14
  deps = ["git"] # -> apt install git
@@ -27,7 +27,7 @@
27
27
  "@nuxtjs/tailwindcss": "^6.14.0",
28
28
  "@types/node": "^20",
29
29
  "autoprefixer": "^10.4.20",
30
- "coze-coding-dev-sdk": "^0.7.25-beta.8",
30
+ "coze-coding-dev-sdk": "^0.7.16",
31
31
  "eslint": "^9",
32
32
  "eslint-plugin-import": "^2.32.0",
33
33
  "eslint-plugin-vue": "^10",
@@ -34,8 +34,8 @@ importers:
34
34
  specifier: ^10.4.20
35
35
  version: 10.4.27(postcss@8.5.8)
36
36
  coze-coding-dev-sdk:
37
- specifier: ^0.7.25-beta.8
38
- version: 0.7.25-beta.8(openai@6.27.0(ws@8.21.3)(zod@4.3.6))(ws@8.21.3)
37
+ specifier: ^0.7.16
38
+ version: 0.7.17(openai@6.27.0(ws@8.21.3)(zod@4.3.6))(ws@8.21.3)
39
39
  eslint:
40
40
  specifier: ^9
41
41
  version: 9.39.4(jiti@2.7.0)
@@ -2498,8 +2498,8 @@ packages:
2498
2498
  typescript:
2499
2499
  optional: true
2500
2500
 
2501
- coze-coding-dev-sdk@0.7.25-beta.8:
2502
- resolution: {integrity: sha512-RSKlXCO0W/OPDjx9D9JICn2cGeOJw3iG+y0Pr1AhAf7YdAjjNbBZoG7qfg0Zg2SqgaVN2qSLQFmKPbhNq9ZWSg==}
2501
+ coze-coding-dev-sdk@0.7.17:
2502
+ resolution: {integrity: sha512-ABq84CkmEtvIAat9QGnfY+b1na5Z7XGyAJP/N2XzqFkVfEF268EwFZLpDOQsBBoYWT+6fmpKLZzBoJDVkQU47w==}
2503
2503
  engines: {node: '>=18.0.0'}
2504
2504
  hasBin: true
2505
2505
 
@@ -8526,7 +8526,7 @@ snapshots:
8526
8526
  optionalDependencies:
8527
8527
  typescript: 5.9.3
8528
8528
 
8529
- coze-coding-dev-sdk@0.7.25-beta.8(openai@6.27.0(ws@8.21.3)(zod@4.3.6))(ws@8.21.3):
8529
+ coze-coding-dev-sdk@0.7.17(openai@6.27.0(ws@8.21.3)(zod@4.3.6))(ws@8.21.3):
8530
8530
  dependencies:
8531
8531
  '@langchain/core': 1.1.31(openai@6.27.0(ws@8.21.3)(zod@4.3.6))
8532
8532
  '@langchain/openai': 1.2.12(@langchain/core@1.1.31(openai@6.27.0(ws@8.21.3)(zod@4.3.6)))(ws@8.21.3)
@@ -32,89 +32,8 @@ kill_port_if_listening() {
32
32
  fi
33
33
  }
34
34
 
35
- <% if (process.env.NODE_ENV === 'test') { %>
36
- echo "Clearing port ${DEPLOY_RUN_PORT} before start."
37
- kill_port_if_listening
38
- echo "Starting Nuxt dev server on port ${DEPLOY_RUN_PORT}..."
39
-
40
- # 测试环境保持服务为前台进程,便于 e2e 收集输出并停止进程。
41
- exec env PORT="${DEPLOY_RUN_PORT}" pnpm nuxt dev
42
- <% } else { %>
43
- LOG_DIR="${COZE_LOG_DIR:-${COZE_WORKSPACE_PATH}/logs}"
44
- LOG_FILE="${LOG_DIR}/server.log"
45
- PID_FILE="${LOG_DIR}/server.pid"
46
-
47
- # coze-daemon 会在 runtime shell 退出时清理原进程组。
48
- # 通过 Node detached spawn 创建独立 session/进程组,并将 stdio 直接写入日志。
49
- spawn_detached() {
50
- local cwd="$1"
51
- local log_file="$2"
52
- shift 2
53
-
54
- node - "$cwd" "$log_file" "$@" <<'NODE'
55
- const fs = require('node:fs');
56
- const { spawn } = require('node:child_process');
57
-
58
- const [cwd, logFile, command, ...args] = process.argv.slice(2);
59
- if (!cwd || !logFile || !command) {
60
- throw new Error('spawn_detached 缺少 cwd、log_file 或 command');
61
- }
62
-
63
- const logFd = fs.openSync(logFile, 'a');
64
- try {
65
- const child = spawn(command, args, {
66
- cwd,
67
- detached: true,
68
- env: process.env,
69
- stdio: ['ignore', logFd, logFd],
70
- });
71
- child.unref();
72
- process.stdout.write(String(child.pid));
73
- } finally {
74
- fs.closeSync(logFd);
75
- }
76
- NODE
77
- }
78
-
79
- stop_detached() {
80
- local pid="${1:-}"
81
- if [[ -z "${pid}" ]]; then
82
- return
83
- fi
84
-
85
- kill -TERM -- "-${pid}" 2>/dev/null || kill -TERM "${pid}" 2>/dev/null || true
86
- sleep 1
87
- kill -KILL -- "-${pid}" 2>/dev/null || true
88
- }
89
-
90
- # 监听端口的是孙进程(pnpm -> nuxt -> node),只清端口会漏掉上层 pnpm/nuxt,
91
- # 所以先按上次记录的 PID 把整个进程组回收掉。
92
- if [[ -f "${PID_FILE}" ]]; then
93
- stop_detached "$(cat "${PID_FILE}" 2>/dev/null || true)"
94
- rm -f "${PID_FILE}"
95
- fi
96
-
97
35
  echo "Clearing port ${DEPLOY_RUN_PORT} before start."
98
36
  kill_port_if_listening
99
37
  echo "Starting Nuxt dev server on port ${DEPLOY_RUN_PORT}..."
100
38
 
101
- mkdir -p "${LOG_DIR}"
102
- : > "${LOG_FILE}"
103
-
104
- export PORT="${DEPLOY_RUN_PORT}"
105
- server_pid="$(spawn_detached "${COZE_WORKSPACE_PATH}" "${LOG_FILE}" \
106
- "$(command -v pnpm)" nuxt dev)"
107
- echo "${server_pid}" > "${PID_FILE}"
108
-
109
- sleep 1
110
- if [[ -z "${server_pid}" ]] || ! kill -0 "${server_pid}" 2>/dev/null; then
111
- echo "Dev server failed to start. See ${LOG_FILE}." >&2
112
- tail -n 20 "${LOG_FILE}" >&2 || true
113
- rm -f "${PID_FILE}"
114
- exit 1
115
- fi
116
-
117
- echo "Dev server started (PID: ${server_pid})."
118
- echo "Log file: ${LOG_FILE}"
119
- echo "PID file: ${PID_FILE}"
120
- <% } %>
39
+ PORT=${DEPLOY_RUN_PORT} pnpm nuxt dev
@@ -22,7 +22,7 @@
22
22
  "@mariozechner/pi-ai": "^0.63.2",
23
23
  "@mariozechner/pi-coding-agent": "^0.63.2",
24
24
  "@sinclair/typebox": "^0.34.48",
25
- "coze-coding-dev-sdk": "^0.7.25-beta.8",
25
+ "coze-coding-dev-sdk": "^0.7.17",
26
26
  "@radix-ui/react-select": "^2.2.6",
27
27
  "@radix-ui/react-slot": "^1.2.4",
28
28
  "@streamdown/code": "^1.1.1",
@@ -36,8 +36,8 @@ importers:
36
36
  specifier: ^2.1.1
37
37
  version: 2.1.1
38
38
  coze-coding-dev-sdk:
39
- specifier: ^0.7.25-beta.8
40
- version: 0.7.25-beta.8(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0)
39
+ specifier: ^0.7.17
40
+ version: 0.7.20(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0)
41
41
  express:
42
42
  specifier: ^4.21.2
43
43
  version: 4.22.1
@@ -2085,8 +2085,8 @@ packages:
2085
2085
  cose-base@2.2.0:
2086
2086
  resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==}
2087
2087
 
2088
- coze-coding-dev-sdk@0.7.25-beta.8:
2089
- resolution: {integrity: sha512-RSKlXCO0W/OPDjx9D9JICn2cGeOJw3iG+y0Pr1AhAf7YdAjjNbBZoG7qfg0Zg2SqgaVN2qSLQFmKPbhNq9ZWSg==}
2088
+ coze-coding-dev-sdk@0.7.20:
2089
+ resolution: {integrity: sha512-f3UeZcYB/udyWrlFrsOViM47PCW+Nk0I4FcXEGzcjEfaQsa1CPBpf/y5UbBM6GIZ1v+lnuh/MiBlAaALFeMTqw==}
2090
2090
  engines: {node: '>=18.0.0'}
2091
2091
  hasBin: true
2092
2092
 
@@ -6120,7 +6120,7 @@ snapshots:
6120
6120
  dependencies:
6121
6121
  layout-base: 2.0.1
6122
6122
 
6123
- coze-coding-dev-sdk@0.7.25-beta.8(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0):
6123
+ coze-coding-dev-sdk@0.7.20(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0):
6124
6124
  dependencies:
6125
6125
  '@langchain/core': 1.1.40(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0)
6126
6126
  '@langchain/openai': 1.4.3(@langchain/core@1.1.40(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0))(ws@8.20.0)
@@ -4,7 +4,7 @@ set -Eeuo pipefail
4
4
  start_service() {
5
5
  cd "${COZE_WORKSPACE_PATH}/server/dist"
6
6
 
7
- local port="${DEPLOY_RUN_PORT:-<%= serverPort %>}"
7
+ local port="${DEPLOY_RUN_PORT:-3000}"
8
8
  echo "Starting Static File Server on port ${port} for deploy..."
9
9
 
10
10
  node ./main.js -p "${port}"