@coze-arch/cli 0.0.37 → 0.1.3-alpha.8d71d5
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/README.md +69 -104
- package/docs/deploy.md +181 -0
- package/lib/__templates__/expo/.cozeproj/scripts/dev_run.sh +108 -19
- package/lib/__templates__/expo/.cozeproj/scripts/prod_run.sh +1 -1
- package/lib/__templates__/expo/.cozeproj/scripts/server_dev_run.sh +1 -1
- package/lib/__templates__/expo/client/metro.config.js +3 -1
- package/lib/__templates__/expo/pnpm-lock.yaml +5 -5
- package/lib/__templates__/expo/server/package.json +2 -2
- package/lib/__templates__/expo/server/src/index.ts +1 -1
- package/lib/__templates__/expo/template.config.js +11 -2
- package/lib/__templates__/native-static/.coze +4 -2
- package/lib/__templates__/native-static/scripts/serve.ps1 +7 -0
- package/lib/__templates__/nextjs/.coze +5 -0
- package/lib/__templates__/nextjs/package.json +2 -2
- package/lib/__templates__/nextjs/pnpm-lock.yaml +5 -5
- package/lib/__templates__/nextjs/scripts/build.ps1 +16 -0
- package/lib/__templates__/nextjs/scripts/dev.ps1 +63 -0
- package/lib/__templates__/nextjs/scripts/dev.sh +234 -7
- package/lib/__templates__/nextjs/scripts/prepare.ps1 +18 -0
- package/lib/__templates__/nextjs/scripts/start.ps1 +11 -0
- package/lib/__templates__/nextjs/scripts/validate.ps1 +8 -0
- package/lib/__templates__/nextjs/template.config.js +4 -2
- package/lib/__templates__/nuxt-vue/.coze +5 -0
- package/lib/__templates__/nuxt-vue/package.json +1 -1
- package/lib/__templates__/nuxt-vue/pnpm-lock.yaml +5 -5
- package/lib/__templates__/nuxt-vue/scripts/build.ps1 +12 -0
- package/lib/__templates__/nuxt-vue/scripts/dev.ps1 +63 -0
- package/lib/__templates__/nuxt-vue/scripts/dev.sh +232 -3
- package/lib/__templates__/nuxt-vue/scripts/prepare.ps1 +12 -0
- package/lib/__templates__/nuxt-vue/scripts/start.ps1 +11 -0
- package/lib/__templates__/nuxt-vue/scripts/validate.ps1 +8 -0
- package/lib/__templates__/phaser/.coze +18 -0
- package/lib/__templates__/phaser/README.md +45 -0
- package/lib/__templates__/phaser/_gitignore +23 -0
- package/lib/__templates__/phaser/_npmrc +14 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0001.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0002.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0003.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0004.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0005.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0006.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0007.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0008.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0009.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0010.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0011.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0012.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0013.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0014.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0015.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0016.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0017.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0018.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0019.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0020.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0021.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0022.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0023.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0024.png +0 -0
- package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/manifest.json +11 -0
- package/lib/__templates__/phaser/debug-runtime/flow-graph.json +20 -0
- package/lib/__templates__/phaser/index.html +12 -0
- package/lib/__templates__/phaser/package.json +31 -0
- package/lib/__templates__/phaser/pnpm-lock.yaml +661 -0
- package/lib/__templates__/phaser/scripts/build.ps1 +12 -0
- package/lib/__templates__/phaser/scripts/build.sh +8 -0
- package/lib/__templates__/phaser/scripts/dev.ps1 +49 -0
- package/lib/__templates__/phaser/scripts/dev.sh +82 -0
- package/lib/__templates__/phaser/scripts/prepare.ps1 +8 -0
- package/lib/__templates__/phaser/scripts/prepare.sh +7 -0
- package/lib/__templates__/phaser/scripts/spawn-detached.cjs +29 -0
- package/lib/__templates__/phaser/scripts/start.ps1 +49 -0
- package/lib/__templates__/phaser/scripts/start.sh +82 -0
- package/lib/__templates__/phaser/scripts/validate.ps1 +7 -0
- package/lib/__templates__/phaser/scripts/validate.sh +7 -0
- package/lib/__templates__/phaser/src/assets.ts +15 -0
- package/lib/__templates__/phaser/src/global.d.ts +39 -0
- package/lib/__templates__/phaser/src/main.ts +28 -0
- package/lib/__templates__/phaser/src/scene/BootScene.ts +213 -0
- package/lib/__templates__/phaser/src/scene/DevLoadingScene.ts +69 -0
- package/lib/__templates__/phaser/src/style.css +28 -0
- package/lib/__templates__/phaser/src/types.ts +32 -0
- package/lib/__templates__/phaser/src/utils/asset-loader.ts +319 -0
- package/lib/__templates__/phaser/src/utils/index.ts +2 -0
- package/lib/__templates__/phaser/src/utils/mark-editable.ts +13 -0
- package/lib/__templates__/phaser/template.config.js +43 -0
- package/lib/__templates__/phaser/tsconfig.json +23 -0
- package/lib/__templates__/phaser/vite.config.ts +96 -0
- package/lib/__templates__/phaser-static/.coze +15 -0
- package/lib/__templates__/phaser-static/README.md +40 -0
- package/lib/__templates__/phaser-static/_gitignore +6 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0001.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0002.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0003.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0004.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0005.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0006.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0007.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0008.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0009.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0010.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0011.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0012.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0013.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0014.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0015.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0016.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0017.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0018.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0019.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0020.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0021.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0022.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0023.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0024.png +0 -0
- package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/manifest.json +11 -0
- package/lib/__templates__/phaser-static/debug-runtime/flow-graph.json +20 -0
- package/lib/__templates__/phaser-static/index.html +17 -0
- package/lib/__templates__/phaser-static/scripts/serve.ps1 +7 -0
- package/lib/__templates__/phaser-static/src/assets.js +15 -0
- package/lib/__templates__/phaser-static/src/main.js +26 -0
- package/lib/__templates__/phaser-static/src/phaser.js +7 -0
- package/lib/__templates__/phaser-static/src/scene/BootScene.js +205 -0
- package/lib/__templates__/phaser-static/src/scene/DevLoadingScene.js +67 -0
- package/lib/__templates__/phaser-static/src/style.css +28 -0
- package/lib/__templates__/phaser-static/src/utils/asset-loader.js +267 -0
- package/lib/__templates__/phaser-static/src/utils/index.js +2 -0
- package/lib/__templates__/phaser-static/src/utils/mark-editable.js +3 -0
- package/lib/__templates__/phaser-static/template.config.js +35 -0
- package/lib/__templates__/pi-agent/package.json +1 -1
- package/lib/__templates__/pi-agent/pnpm-lock.yaml +5 -5
- package/lib/__templates__/taro/.cozeproj/scripts/deploy_run.sh +1 -1
- package/lib/__templates__/taro/.cozeproj/scripts/dev_run.sh +178 -68
- package/lib/__templates__/taro/AGENTS.md +11 -7
- package/lib/__templates__/taro/README.md +4 -4
- package/lib/__templates__/taro/config/index.ts +10 -2
- package/lib/__templates__/taro/pnpm-lock.yaml +5 -5
- package/lib/__templates__/taro/server/package.json +1 -1
- package/lib/__templates__/taro/server/src/main.ts +8 -2
- package/lib/__templates__/templates.json +51 -1
- package/lib/__templates__/vite/.coze +5 -0
- package/lib/__templates__/vite/package.json +1 -1
- package/lib/__templates__/vite/pnpm-lock.yaml +5 -5
- package/lib/__templates__/vite/scripts/build.ps1 +16 -0
- package/lib/__templates__/vite/scripts/dev.ps1 +63 -0
- package/lib/__templates__/vite/scripts/dev.sh +110 -1
- package/lib/__templates__/vite/scripts/prepare.ps1 +18 -0
- package/lib/__templates__/vite/scripts/start.ps1 +11 -0
- package/lib/__templates__/vite/scripts/validate.ps1 +8 -0
- package/lib/__templates__/vite/template.config.js +4 -2
- package/lib/cli.js +3718 -211
- package/lib/deploy/package-project.js +244 -0
- package/lib/deploy/package-project.py +183 -0
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -1,143 +1,108 @@
|
|
|
1
|
-
# @coze-
|
|
1
|
+
# @coze-arch/cli
|
|
2
2
|
|
|
3
|
-
Coze Coding
|
|
4
|
-
|
|
5
|
-
## 特性
|
|
6
|
-
|
|
7
|
-
- 🚀 **快速初始化**: 一键创建预配置的项目模板
|
|
8
|
-
- 🤖 **AI 优先设计**: 专为 AI Agent 消费设计,提供清晰的错误信息和自描述能力
|
|
9
|
-
- 📦 **多模板支持**: 支持 React、Next.js、HTML 等多种技术栈
|
|
10
|
-
- 🔧 **类型安全**: 基于 JSON Schema 的参数校验和 TypeScript 类型生成
|
|
11
|
-
- ⚡ **命令代理**: 统一的 dev/build/start 命令,抹平不同技术栈差异
|
|
3
|
+
Coze Coding 的项目模板与本地运行 CLI。发布包名为 `@coze-arch/cli`,命令为
|
|
4
|
+
`coze-dev`。
|
|
12
5
|
|
|
13
6
|
## 安装
|
|
14
7
|
|
|
15
8
|
```bash
|
|
16
|
-
|
|
17
|
-
|
|
9
|
+
npm install -g @coze-arch/cli
|
|
10
|
+
coze-dev --help
|
|
18
11
|
```
|
|
19
12
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
### 初始化项目
|
|
13
|
+
也可以不全局安装:
|
|
23
14
|
|
|
24
15
|
```bash
|
|
25
|
-
coze-
|
|
16
|
+
npx @coze-arch/cli --help
|
|
26
17
|
```
|
|
27
18
|
|
|
28
|
-
|
|
19
|
+
## 初始化项目
|
|
29
20
|
|
|
30
21
|
```bash
|
|
31
|
-
coze-
|
|
22
|
+
coze-dev init my-app --template <template> --app-name my-app
|
|
23
|
+
coze-dev init --help
|
|
32
24
|
```
|
|
33
25
|
|
|
34
|
-
|
|
26
|
+
`init` 默认会渲染模板、安装依赖、初始化 Git、创建初始提交并启动开发服务。按需使用
|
|
27
|
+
`--skip-install`、`--skip-git`、`--skip-commit`、`--skip-dev` 跳过这些步骤。模板名称和
|
|
28
|
+
参数以 `coze-dev init --help` 的实时输出为准;未声明的参数会以 kebab-case 转为
|
|
29
|
+
camelCase 后传给模板。
|
|
35
30
|
|
|
36
|
-
|
|
37
|
-
# 启动开发服务器
|
|
38
|
-
coze-coding dev
|
|
31
|
+
## 在项目中运行
|
|
39
32
|
|
|
40
|
-
|
|
41
|
-
coze-coding build
|
|
33
|
+
初始化产物根目录的 `.coze` 是统一命令契约:
|
|
42
34
|
|
|
43
|
-
|
|
44
|
-
coze-
|
|
35
|
+
```bash
|
|
36
|
+
coze-dev dev # 读取 dev.run
|
|
37
|
+
coze-dev build # 读取 deploy.build
|
|
38
|
+
coze-dev start # 读取 deploy.run
|
|
39
|
+
coze-dev validate # 读取 dev.validate
|
|
45
40
|
```
|
|
46
41
|
|
|
47
|
-
|
|
42
|
+
`dev` 和 `build` 在执行前会尝试应用模板补丁;补丁失败会记录调试信息,但不会阻止主命令。
|
|
43
|
+
子进程日志默认写入 `~/.coze-logs/dev.log`,可用 `--log-file <path>` 覆盖。
|
|
48
44
|
|
|
49
|
-
|
|
45
|
+
## Windows 与 WSL
|
|
50
46
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
- `--use-typescript` → `useTypeScript`
|
|
54
|
-
- `--port` → `port`
|
|
47
|
+
原生 Windows(`process.platform === "win32"`)优先使用 `.coze` 中非空的 Windows
|
|
48
|
+
覆盖命令;未配置时回退默认命令。WSL 被识别为 Linux,始终执行默认命令。
|
|
55
49
|
|
|
56
|
-
|
|
50
|
+
| CLI 命令或场景 | 默认字段 | Windows 覆盖字段 |
|
|
51
|
+
| --- | --- | --- |
|
|
52
|
+
| `coze-dev dev` | `dev.run` | `dev.run_win` |
|
|
53
|
+
| `coze-dev build` | `deploy.build` | `deploy.build_win` |
|
|
54
|
+
| `coze-dev start` | `deploy.run` | `deploy.run_win` |
|
|
55
|
+
| `coze-dev validate` | `dev.validate` | `dev.validate_win` |
|
|
56
|
+
| `coze-dev deploy` 的本地打包 | `dev.pack` | `dev.pack_win` |
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
已支持 Windows 的内置 Web 与 Phaser 模板将覆盖命令映射到 PowerShell 脚本,例如:
|
|
59
59
|
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
├── .coze # 项目配置文件
|
|
65
|
-
└── src/ # 源代码(支持 EJS 模板)
|
|
66
|
-
```
|
|
60
|
+
```toml
|
|
61
|
+
[dev]
|
|
62
|
+
run = ["bash", "./scripts/dev.sh"]
|
|
63
|
+
run_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "./scripts/dev.ps1"]
|
|
67
64
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
```typescript
|
|
73
|
-
import type { JSONSchemaType } from 'ajv';
|
|
74
|
-
|
|
75
|
-
export interface TemplateParams {
|
|
76
|
-
appName: string;
|
|
77
|
-
useTypeScript: boolean;
|
|
78
|
-
port: number;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export const paramsSchema: JSONSchemaType<TemplateParams> = {
|
|
82
|
-
type: 'object',
|
|
83
|
-
properties: {
|
|
84
|
-
appName: {
|
|
85
|
-
type: 'string',
|
|
86
|
-
minLength: 1,
|
|
87
|
-
pattern: '^[a-z0-9-]+$',
|
|
88
|
-
cliParam: '--app-name',
|
|
89
|
-
description: 'Application name'
|
|
90
|
-
},
|
|
91
|
-
useTypeScript: {
|
|
92
|
-
type: 'boolean',
|
|
93
|
-
default: true,
|
|
94
|
-
cliParam: '--use-typescript',
|
|
95
|
-
description: 'Enable TypeScript'
|
|
96
|
-
},
|
|
97
|
-
port: {
|
|
98
|
-
type: 'number',
|
|
99
|
-
default: 3000,
|
|
100
|
-
minimum: 1024,
|
|
101
|
-
maximum: 65535,
|
|
102
|
-
cliParam: '--port',
|
|
103
|
-
description: 'Development server port'
|
|
104
|
-
}
|
|
105
|
-
},
|
|
106
|
-
required: ['appName'],
|
|
107
|
-
additionalProperties: false
|
|
108
|
-
};
|
|
65
|
+
[deploy]
|
|
66
|
+
build = ["bash", "./scripts/build.sh"]
|
|
67
|
+
build_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "./scripts/build.ps1"]
|
|
109
68
|
```
|
|
110
69
|
|
|
111
|
-
|
|
70
|
+
## 部署
|
|
112
71
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
};
|
|
72
|
+
`coze-dev deploy` 内置于同一 CLI。认证优先读取
|
|
73
|
+
`~/.coze/desktop/runtime.beta.json`,其次读取 `~/.coze/desktop/runtime.json`;
|
|
74
|
+
CLI 会依次验证候选 Token,收到 401 时继续尝试下一项,再回退到
|
|
75
|
+
`COZE_API_TOKEN` 和 `~/.coze/cli/config.json` 登录态:
|
|
118
76
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
77
|
+
```bash
|
|
78
|
+
coze-dev deploy auth login
|
|
79
|
+
coze-dev deploy doctor
|
|
80
|
+
coze-dev deploy --source-root . --yes --wait
|
|
122
81
|
```
|
|
123
82
|
|
|
124
|
-
|
|
83
|
+
完整的应用、环境变量、Pages 和小程序命令说明见 [部署文档](./docs/deploy.md)。
|
|
84
|
+
`dev.pack_win` 是自定义模板可选的 Windows 打包覆盖;当前 Expo、Taro 和 Pi Agent 模板
|
|
85
|
+
不承诺 Windows 支持。
|
|
125
86
|
|
|
126
|
-
|
|
87
|
+
## 模板开发
|
|
127
88
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
- ✅ 使用工厂函数和闭包
|
|
131
|
-
- ❌ 禁止使用 class
|
|
132
|
-
- ❌ 避免副作用和可变状态
|
|
89
|
+
模板位于 `src/__templates__/`,每个模板通过 `template.config.ts` 定义参数和渲染钩子,
|
|
90
|
+
`.coze` 定义生成项目的运行命令。新增模板或修改模板目录后执行:
|
|
133
91
|
|
|
134
|
-
|
|
92
|
+
```bash
|
|
93
|
+
npm run prebuild
|
|
94
|
+
```
|
|
135
95
|
|
|
136
|
-
|
|
96
|
+
模板开发细节见 [模板开发指南](./docs/how-to-dev.md)。仓库开发依赖由 Rush 管理,不要在本包目录单独执行 `npm install` 或 `pnpm install`。
|
|
137
97
|
|
|
138
|
-
|
|
139
|
-
- [技术设计](./docs/technical-design.md)
|
|
98
|
+
## 本地开发与验证
|
|
140
99
|
|
|
141
|
-
|
|
100
|
+
源码入口支持直接运行,无需先构建:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
node src/cli.js --help
|
|
104
|
+
npm run test
|
|
105
|
+
npm run build
|
|
106
|
+
```
|
|
142
107
|
|
|
143
|
-
|
|
108
|
+
端到端模板验证使用 `npm run test:e2e`,会真实安装模板依赖并启动服务。发布前需完成该验证。
|
package/docs/deploy.md
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# coze-dev deploy
|
|
2
|
+
|
|
3
|
+
`coze-dev` 内置的部署命令。认证凭据按以下优先级读取:
|
|
4
|
+
|
|
5
|
+
1. `~/.coze/desktop/runtime.beta.json` 的 `patToken.accessToken`
|
|
6
|
+
2. `~/.coze/desktop/runtime.json` 的 `patToken.accessToken`
|
|
7
|
+
3. 非空环境变量 `COZE_API_TOKEN`
|
|
8
|
+
4. 主 Coze CLI 保存在 `~/.coze/cli/config.json` 中的登录状态
|
|
9
|
+
|
|
10
|
+
桌面运行时文件不存在、不可读、JSON 无效或 Token 字段缺失、为空时,CLI
|
|
11
|
+
静默尝试下一来源。固定 Token 会在单次 CLI 进程首次使用时依次验证;候选返回
|
|
12
|
+
401 时继续尝试下一来源,其他网络或服务端错误不会被误判成 Token 无效。选中的
|
|
13
|
+
Token 在本次进程内复用,不输出或持久化。
|
|
14
|
+
|
|
15
|
+
## 安装与运行
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install -g @coze-arch/cli
|
|
19
|
+
coze-dev deploy auth login
|
|
20
|
+
coze-dev deploy auth status
|
|
21
|
+
coze-dev deploy doctor
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
默认输出 JSON,可通过 `--format text` 切换为文本输出。
|
|
25
|
+
|
|
26
|
+
首次部署不需要手动查找 `space_id` 或 `project_id`。当 `.coze [project]` 没有
|
|
27
|
+
`project_id` 时,CLI 会复用已配置的 Space;如果尚未配置,会查询当前账号
|
|
28
|
+
可用的 Space、自动选择第一个并保存,然后根据 `.coze` 的
|
|
29
|
+
`[project].project_type` 创建当前源码目录专属的普通编程 Project。
|
|
30
|
+
映射与部署服务端对 `.coze` 的解析保持一致:`agent`→Agent、`workflow`/`automation`→Automation、
|
|
31
|
+
`app`→App、`skill`→Skill、`web`/`backend`→GeneralWeb、`miniapp`/`miniprogram`→WechatMiniProgram;
|
|
32
|
+
其他值或未声明 `project_type` 时创建通用 General Project。不会复用共享的 CLIBilling Project。
|
|
33
|
+
|
|
34
|
+
> Project 类型不只是元信息:它决定注入运行时的 `COZE_PROJECT_TYPE`、是否为该 Project 开通
|
|
35
|
+
> Postgres、以及流量网关是否强制入站鉴权。类型建错时部署照样成功,但服务可能起不来 —— 例如
|
|
36
|
+
> agent 模板靠 `COZE_PROJECT_TYPE` 选择要加载的图,并在启动时读取 `PGDATABASE_URL`。
|
|
37
|
+
> 类型在创建 Project 时一次性确定,之后再改 `.coze project_type` 不会改变已有 Project 的类型。
|
|
38
|
+
|
|
39
|
+
指定 PPE 泳道时,增加全局参数 `--lane`。CLI 会为所有部署 API 请求发送
|
|
40
|
+
`x-tt-env` 和 `x-use-ppe: 1`,该参数只对当前命令生效:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
coze-dev deploy --lane ppe_deploy app list
|
|
44
|
+
coze-dev deploy --lane ppe_deploy --source-root .
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 命令
|
|
48
|
+
|
|
49
|
+
```text
|
|
50
|
+
coze-dev deploy context show
|
|
51
|
+
coze-dev deploy auth login|status|logout
|
|
52
|
+
coze-dev deploy context use --space-id <space_id>
|
|
53
|
+
coze-dev deploy doctor
|
|
54
|
+
coze-dev deploy app list [--page-size <n>] [--page-token <token>] [--all]
|
|
55
|
+
coze-dev deploy app show --app-id <app_id>
|
|
56
|
+
coze-dev deploy app rename <name> --app-id <app_id> --yes
|
|
57
|
+
coze-dev deploy app delete --app-id <app_id> --yes
|
|
58
|
+
coze-dev deploy app analytics|metrics --app-id <app_id> [--time-range <range>]
|
|
59
|
+
coze-dev deploy app usage --app-id <app_id> --bill-month <YYYY-MM>
|
|
60
|
+
coze-dev deploy [--lane <ppe_lane>] [--source-root <directory>] [--app-id <app_id>] [--application-type <type>] [--name <name>] [--connector-id <id>]
|
|
61
|
+
coze-dev deploy status|list|online|rollback-check|cancel|rollback|stop|resume|pause
|
|
62
|
+
coze-dev deploy logs|log-count|count|build-log|config
|
|
63
|
+
coze-dev deploy domain list [--unit-type dev|prod]
|
|
64
|
+
coze-dev deploy domain add <domain>
|
|
65
|
+
coze-dev deploy domain set-prefix <prefix> --app-id <app_id> --yes
|
|
66
|
+
coze-dev deploy mini-program status|bind|submit-code|unbind|auth|preview
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
`app list` 是真分页:一次只返回一页(`--page-size` 默认 20、上限 100),`has_more` 为真时用返回的 `next_page_token` 取下一页;要一次拿到名下全部应用用 `--all`,它会自己翻到底。
|
|
70
|
+
|
|
71
|
+
部署确认阶段不传 `--yes`;确认后使用相同参数增加 `--yes`,需要等待终态时再增加
|
|
72
|
+
`--wait`。CLI 会为每次请求自动生成一个 40 位十六进制源码快照 ID,用于兼容 V2 接口的
|
|
73
|
+
`commit_hash` 字段,用户无需指定。该 ID 不代表 Git commit;源码目录无需由 Git 管理,
|
|
74
|
+
打包时始终读取目录的最新内容。CLI 会把当前源码目录专属的 `project_id` 和唯一 `app_id`
|
|
75
|
+
写入 `.coze [project]`,ID 使用引号包裹的十进制字符串。后续类型一致时自动复用该
|
|
76
|
+
Application;类型不一致时创建新 Application、覆盖 `app_id` 并提示。也可用 `--project-id`
|
|
77
|
+
或 `--app-id` 显式指定已有资源,显式指定时不会额外创建 Project。
|
|
78
|
+
|
|
79
|
+
首次部署的应用名称可通过 `--name` 指定;显式参数优先于 `.coze` 的
|
|
80
|
+
`[project].name`。Pages 部署没有 `.coze` 时,CLI 会先生成最小配置再写入绑定。
|
|
81
|
+
|
|
82
|
+
```toml
|
|
83
|
+
[project]
|
|
84
|
+
name = "Phaser 游戏"
|
|
85
|
+
project_type = "web"
|
|
86
|
+
project_id = "987654321"
|
|
87
|
+
app_id = "123456789"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Pages 首次部署没有 `app_id`,必须显式指定交付类型。Pages 将
|
|
91
|
+
`--source-root` 视为项目根目录:根目录已有 `index.html` 时直接打包;否则读取 `.coze`,
|
|
92
|
+
要求 `project.template = "nextjs"` 且 `deploy.build` 为非空命令数组。CLI 不在本地安装
|
|
93
|
+
依赖或执行 Pages 构建,只上传源码;Deploy 服务在 Sandbox 中注入 Next.js 静态导出配置,
|
|
94
|
+
执行 `deploy.build`,并要求最终产出 `out/index.html`:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
coze-dev deploy --source-root . --application-type pages
|
|
98
|
+
coze-dev deploy --source-root . --application-type pages --yes --wait
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
创建成功后 CLI 会把 Pages Application 写入 `.coze`;后续可继续传
|
|
102
|
+
`--application-type pages` 自动复用,或显式传 `--app-id`。
|
|
103
|
+
|
|
104
|
+
V2 接口的所有参数均通过 POST JSON body 发送,不会放入 URL。确认非 Pages 部署后,CLI
|
|
105
|
+
会执行 `.coze` 中可选的 `dev.pack` 命令;原生 Windows 优先执行非空的
|
|
106
|
+
`dev.pack_win`,未配置时回退 `dev.pack`。该步骤将
|
|
107
|
+
本地部署内容打成无根目录的 `tar.gz`,再通过 `source_package_base64` 上传。Pages 部署
|
|
108
|
+
统一上传源码根目录:已有 `index.html` 时服务端跳过构建,没有时由服务端按 Snapshot 中的
|
|
109
|
+
`.coze deploy.build` 构建。打包由 CLI 自带的 Node.js 脚本执行,并排除 `.coze`、`.env`、
|
|
110
|
+
`.git`、`.venv`、`.codegraph`、`node_modules`、`.next`、`site-packages` 和 `__pycache__`。
|
|
111
|
+
`scripts/package-project.py` 仍随源码和 npm 包保留,仅作为 Python 参考备份与行为对照,
|
|
112
|
+
生产打包链路不会调用 Python。
|
|
113
|
+
|
|
114
|
+
环境变量以当前线上成功版本的 Secret 快照为准,CLI 不再读取源码根目录的 `.env`。
|
|
115
|
+
更新服务或小程序时,CLI 会读取线上快照中的用户变量并重新加密上传;首次部署没有线上
|
|
116
|
+
快照,因此使用空的用户变量集合。平台系统变量由 Secret 服务管理,不作为用户变量上传。
|
|
117
|
+
|
|
118
|
+
通过 `app_id` 查看当前线上版本的环境变量及快照状态:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
coze-dev deploy env list
|
|
122
|
+
coze-dev deploy env list --app-id 7672644451805691910
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
小程序部署可重复指定渠道:微信为 `10000127`,抖音为 `10000126`:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
coze-dev deploy --source-root . --application-type mini_program \
|
|
129
|
+
--connector-id 10000127 --yes --wait
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
小程序预览先完成授权,再执行 preview。preview 会打包微信的 dist/ 或抖音的 dist-tt/ 并上传。Project ID 可通过参数传入或从 .coze 自动读取。
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
coze-dev deploy mini-program auth --platform wechat --mini-app-id wx123 --source-root .
|
|
136
|
+
coze-dev deploy mini-program preview --platform wechat --mini-app-id wx123 --source-root .
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
绑定小程序 AppID 时,默认从源码目录 `.coze [project]` 读取该目录的 `project_id`:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
coze-dev deploy mini-program bind \
|
|
143
|
+
--platform wechat \
|
|
144
|
+
--mini-app-id wx123 \
|
|
145
|
+
--redirect-url https://code.coze.cn/coding/auth/callback/miniprogram
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
返回 `bind_status=1` 时,打开 `need_authorize_data.auth_url` 完成授权。回调页会自动
|
|
149
|
+
提交授权码;无回调页的调用方也可使用 `mini-program submit-code` 手动提交。
|
|
150
|
+
|
|
151
|
+
`deploy status` 和 `list` 会返回 `deploy_detail[].deploy_log_key`。只有一个日志
|
|
152
|
+
key 时,`deploy build-log --deploy-id <id>` 会自动解析;存在多个 key 时按错误
|
|
153
|
+
详情中的 `available_keys` 选择一个并传 `--key`。
|
|
154
|
+
|
|
155
|
+
应用维度的管理和观测命令均支持 `--app-id`;省略时从当前目录的 `.coze [project]` 读取:
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
coze-dev deploy app rename "新应用名称" --app-id <app_id> --yes
|
|
159
|
+
coze-dev deploy online --app-id <app_id>
|
|
160
|
+
coze-dev deploy rollback-check --app-id <app_id> --deploy-id <history_id>
|
|
161
|
+
coze-dev deploy log-count --app-id <app_id>
|
|
162
|
+
coze-dev deploy count --app-id <app_id>
|
|
163
|
+
coze-dev deploy app metrics --app-id <app_id> --time-range week
|
|
164
|
+
coze-dev deploy app usage --app-id <app_id> --bill-month 2026-08
|
|
165
|
+
coze-dev deploy domain list --app-id <app_id> --unit-type dev
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
`domain list` 默认查询 Prod 域名;传 `--unit-type dev` 查询开发态预览域名。
|
|
169
|
+
审核 Unit 是内部流水线槽位,不支持从 CLI 查询。
|
|
170
|
+
|
|
171
|
+
`domain set-prefix` 改的是**系统分配的默认域名**(`<prefix>.coze.site`)里的 prefix,
|
|
172
|
+
后缀不变;`domain add` 加进来的自定义域名不受影响 —— 那类域名服务端只有 create/delete,
|
|
173
|
+
域名串本身改不了。改完旧默认域名立刻不再指向本应用,已经发出去的链接会失效,所以必须传 `--yes`。
|
|
174
|
+
前缀的长度、保留词、是否被占用由服务端判定,CLI 只拦形态明显不合法的值(大写、首尾连字符等)。
|
|
175
|
+
这是**权益能力**:账号没有对应权益时服务端会直接拒绝。
|
|
176
|
+
|
|
177
|
+
`app delete` 删除应用,终态不可撤销,必须传 `--yes`。服务端**只接受已停服的应用**:
|
|
178
|
+
仍在服务时会返回一条带当前状态的错误,先跑 `deploy stop --yes` 再删。CLI 不会替你先停 ——
|
|
179
|
+
停服会真的把线上服务摘掉,那一步要由你自己确认。删除会一并停掉该应用名下的部署单元、
|
|
180
|
+
软删它的域名并清理残留的函数;已删除的应用再删一次是幂等成功。删完记得把 `.coze [project]`
|
|
181
|
+
里的 `app_id` 去掉,否则同目录下一次 `deploy` 会打到这个已删除的应用上被服务端拒。
|
|
@@ -1,18 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
1
3
|
ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
2
4
|
PREVIEW_DIR="/source/preview"
|
|
3
5
|
LOG_DIR="${COZE_LOG_DIR:-$ROOT_DIR/logs}"
|
|
4
6
|
LOG_CLIENT_FILE="$LOG_DIR/client.log"
|
|
7
|
+
LOG_SERVER_FILE="$LOG_DIR/server.log"
|
|
5
8
|
mkdir -p "$LOG_DIR"
|
|
6
9
|
|
|
7
10
|
# ==================== 配置项 ====================
|
|
8
11
|
# Server 服务配置
|
|
9
12
|
SERVER_HOST="0.0.0.0"
|
|
10
|
-
SERVER_PORT="
|
|
13
|
+
SERVER_PORT="${SERVER_PORT:-<%= serverPort %>}"
|
|
11
14
|
# Expo 项目配置
|
|
12
15
|
EXPO_HOST="0.0.0.0"
|
|
13
16
|
EXPO_DIR="expo"
|
|
14
|
-
EXPO_PORT
|
|
15
|
-
|
|
17
|
+
# DEPLOY_RUN_PORT 是平台注入的对外端口,EXPO_PORT 保留为本地覆盖项。
|
|
18
|
+
EXPO_PORT="${DEPLOY_RUN_PORT:-${EXPO_PORT:-<%= port %>}}"
|
|
19
|
+
COZE_HARDWARE_DID="${COZE_HARDWARE_DID:-}"
|
|
20
|
+
if [ -n "${EXPO_PORT:-}" ] && [ -n "${COZE_HARDWARE_DID}" ]; then
|
|
21
|
+
WEB_URL="${COZE_PROJECT_DOMAIN_DEFAULT:-https://cozedaemon-${COZE_HARDWARE_DID}-${EXPO_PORT}.dev.coze.site}"
|
|
22
|
+
else
|
|
23
|
+
WEB_URL="${COZE_PROJECT_DOMAIN_DEFAULT:-http://127.0.0.1:${SERVER_PORT}}"
|
|
24
|
+
fi
|
|
16
25
|
ASSUME_YES="1"
|
|
17
26
|
EXPO_PUBLIC_BACKEND_BASE_URL="${EXPO_PUBLIC_BACKEND_BASE_URL:-$WEB_URL}"
|
|
18
27
|
EXPO_PUBLIC_COZE_PROJECT_ID="${COZE_PROJECT_ID:-}"
|
|
@@ -22,6 +31,7 @@ export EXPO_PUBLIC_BACKEND_BASE_URL EXPO_PACKAGER_PROXY_URL EXPO_PUBLIC_COZE_PRO
|
|
|
22
31
|
# 运行时变量(为避免 set -u 的未绑定错误,预置为空)
|
|
23
32
|
SERVER_PID=""
|
|
24
33
|
EXPO_PID=""
|
|
34
|
+
PNPM_BIN=""
|
|
25
35
|
|
|
26
36
|
# ==================== 工具函数 ====================
|
|
27
37
|
check_command() {
|
|
@@ -112,22 +122,94 @@ wait_port_connectable() {
|
|
|
112
122
|
return 1
|
|
113
123
|
}
|
|
114
124
|
|
|
115
|
-
|
|
116
|
-
|
|
125
|
+
# detached 出去的进程没人负责回收,超过这个时长就自己退出,避免端口与内存长期泄露。
|
|
126
|
+
MAX_RUNTIME_SECONDS=1200
|
|
127
|
+
|
|
128
|
+
# 真正被 detach 的是这层 bash wrapper:它是进程组 leader,组内 watchdog 到点回收整组
|
|
129
|
+
# (wrapper -> pnpm -> expo/node);被包的进程自己先退出时也顺手清空进程组,不留残余。
|
|
130
|
+
RUN_WITH_TIMEOUT='
|
|
131
|
+
timeout_seconds=$1
|
|
132
|
+
shift
|
|
133
|
+
|
|
134
|
+
"$@" &
|
|
135
|
+
child_pid=$!
|
|
136
|
+
|
|
137
|
+
# 先忽略 TERM,才能在向整组发 TERM(自己也在组里)之后存活下来补一发 KILL。
|
|
138
|
+
( trap "" TERM
|
|
139
|
+
sleep "${timeout_seconds}"
|
|
140
|
+
echo "[dev] 后台进程运行超过 ${timeout_seconds}s,回收进程组 $$。"
|
|
141
|
+
kill -TERM -- "-$$" 2>/dev/null || true
|
|
142
|
+
sleep 5
|
|
143
|
+
kill -KILL -- "-$$" 2>/dev/null || true
|
|
144
|
+
) &
|
|
145
|
+
|
|
146
|
+
wait "${child_pid}"
|
|
147
|
+
kill -KILL -- "-$$" 2>/dev/null || true
|
|
148
|
+
'
|
|
149
|
+
|
|
150
|
+
# coze-daemon 会在 runtime shell 退出时清理原进程组。
|
|
151
|
+
# 通过 Node detached spawn 创建独立 session/进程组,并将 stdio 直接写入日志。
|
|
152
|
+
# 返回的 PID 是 wrapper 的,同时也是整个进程组的 PGID,后续按组回收。
|
|
153
|
+
spawn_detached() {
|
|
154
|
+
local cwd="$1"
|
|
155
|
+
local log_file="$2"
|
|
156
|
+
shift 2
|
|
157
|
+
|
|
158
|
+
node - "$cwd" "$log_file" \
|
|
159
|
+
/bin/bash -c "${RUN_WITH_TIMEOUT}" detached-runner "${MAX_RUNTIME_SECONDS}" "$@" <<'NODE'
|
|
160
|
+
const fs = require('node:fs');
|
|
161
|
+
const { spawn } = require('node:child_process');
|
|
117
162
|
|
|
118
|
-
|
|
163
|
+
const [cwd, logFile, command, ...args] = process.argv.slice(2);
|
|
164
|
+
if (!cwd || !logFile || !command) {
|
|
165
|
+
throw new Error('spawn_detached 缺少 cwd、log_file 或 command');
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const logFd = fs.openSync(logFile, 'a');
|
|
169
|
+
try {
|
|
170
|
+
const child = spawn(command, args, {
|
|
171
|
+
cwd,
|
|
172
|
+
detached: true,
|
|
173
|
+
env: process.env,
|
|
174
|
+
stdio: ['ignore', logFd, logFd],
|
|
175
|
+
});
|
|
176
|
+
child.unref();
|
|
177
|
+
process.stdout.write(String(child.pid));
|
|
178
|
+
} finally {
|
|
179
|
+
fs.closeSync(logFd);
|
|
180
|
+
}
|
|
181
|
+
NODE
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
stop_detached() {
|
|
185
|
+
local pid="${1:-}"
|
|
186
|
+
if [ -z "$pid" ]; then
|
|
187
|
+
return
|
|
188
|
+
fi
|
|
119
189
|
|
|
190
|
+
kill -TERM -- "-$pid" 2>/dev/null || kill -TERM "$pid" 2>/dev/null || true
|
|
191
|
+
sleep 1
|
|
192
|
+
kill -KILL -- "-$pid" 2>/dev/null || true
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
start_expo() {
|
|
196
|
+
local offline="${1:-0}"
|
|
197
|
+
local -a expo_env
|
|
198
|
+
expo_env=(
|
|
199
|
+
"EXPO_NO_DEPENDENCY_VALIDATION=1"
|
|
200
|
+
"EXPO_PUBLIC_BACKEND_BASE_URL=$EXPO_PUBLIC_BACKEND_BASE_URL"
|
|
201
|
+
"EXPO_PACKAGER_PROXY_URL=$EXPO_PACKAGER_PROXY_URL"
|
|
202
|
+
"EXPO_PUBLIC_COZE_PROJECT_ID=$EXPO_PUBLIC_COZE_PROJECT_ID"
|
|
203
|
+
)
|
|
120
204
|
if [ "$offline" = "1" ]; then
|
|
121
|
-
(
|
|
122
|
-
nohup npx expo start --clear --port "$EXPO_PORT" 2>&1 | pipe_to_log "CLIENT" "$LOG_CLIENT_FILE" ) &
|
|
123
|
-
else
|
|
124
|
-
( EXPO_NO_DEPENDENCY_VALIDATION=1 EXPO_PUBLIC_BACKEND_BASE_URL="$EXPO_PUBLIC_BACKEND_BASE_URL" EXPO_PACKAGER_PROXY_URL="$EXPO_PACKAGER_PROXY_URL" EXPO_PUBLIC_COZE_PROJECT_ID="$EXPO_PUBLIC_COZE_PROJECT_ID" \
|
|
125
|
-
nohup npx expo start --clear --port "$EXPO_PORT" 2>&1 | pipe_to_log "CLIENT" "$LOG_CLIENT_FILE" ) &
|
|
205
|
+
expo_env+=("EXPO_OFFLINE=1")
|
|
126
206
|
fi
|
|
127
|
-
EXPO_PID=$!
|
|
128
|
-
disown $EXPO_PID 2>/dev/null || true
|
|
129
207
|
|
|
130
|
-
|
|
208
|
+
EXPO_PID="$(spawn_detached \
|
|
209
|
+
"$ROOT_DIR/client" \
|
|
210
|
+
"$LOG_CLIENT_FILE" \
|
|
211
|
+
/usr/bin/env "${expo_env[@]}" \
|
|
212
|
+
"$PNPM_BIN" exec expo start --clear --port "$EXPO_PORT")"
|
|
131
213
|
}
|
|
132
214
|
|
|
133
215
|
detect_expo_fetch_failed() {
|
|
@@ -168,6 +250,8 @@ check_command "npm"
|
|
|
168
250
|
check_command "pnpm"
|
|
169
251
|
check_command "lsof"
|
|
170
252
|
check_command "bash"
|
|
253
|
+
check_command "node"
|
|
254
|
+
PNPM_BIN="$(command -v pnpm)"
|
|
171
255
|
|
|
172
256
|
# 端口占用预检查与处理
|
|
173
257
|
ensure_port SERVER_PORT "$SERVER_PORT"
|
|
@@ -175,9 +259,12 @@ ensure_port EXPO_PORT "$EXPO_PORT"
|
|
|
175
259
|
|
|
176
260
|
echo "==================== 启动 server 服务 ===================="
|
|
177
261
|
echo "正在执行:pnpm run dev (server)"
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
262
|
+
: > "$LOG_SERVER_FILE"
|
|
263
|
+
export SERVER_PORT
|
|
264
|
+
SERVER_PID="$(spawn_detached \
|
|
265
|
+
"$ROOT_DIR/server" \
|
|
266
|
+
/dev/null \
|
|
267
|
+
"$PNPM_BIN" run dev)"
|
|
181
268
|
if [ -z "${SERVER_PID}" ]; then
|
|
182
269
|
echo "无法获取 server 后台进程 PID"
|
|
183
270
|
fi
|
|
@@ -185,11 +272,12 @@ echo "server 服务已启动,进程 ID:${SERVER_PID:-unknown}"
|
|
|
185
272
|
|
|
186
273
|
echo "==================== 启动 Expo 项目 ===================="
|
|
187
274
|
echo "开始启动 Expo 服务,端口 ${EXPO_PORT}"
|
|
275
|
+
: > "$LOG_CLIENT_FILE"
|
|
188
276
|
start_expo 0
|
|
189
277
|
if detect_expo_fetch_failed 8; then
|
|
190
278
|
echo "Expo 启动检测到网络错误:TypeError: fetch failed,启用离线模式重试"
|
|
191
|
-
|
|
192
|
-
: > "$
|
|
279
|
+
stop_detached "$EXPO_PID"
|
|
280
|
+
: > "$LOG_CLIENT_FILE"
|
|
193
281
|
start_expo 1
|
|
194
282
|
fi
|
|
195
283
|
# 输出以下环境变量,确保 Expo 项目能正确连接到 Server 服务
|
|
@@ -202,6 +290,7 @@ if [ -z "${EXPO_PID}" ]; then
|
|
|
202
290
|
fi
|
|
203
291
|
|
|
204
292
|
echo "所有服务已启动。Server PID: ${SERVER_PID}, Expo PID: ${EXPO_PID}"
|
|
293
|
+
echo "两个服务均在 ${MAX_RUNTIME_SECONDS}s 后自动退出。"
|
|
205
294
|
|
|
206
295
|
echo "检查 Server 服务端口:$SERVER_HOST:$SERVER_PORT"
|
|
207
296
|
if wait_port_connectable "$SERVER_HOST" "$SERVER_PORT" 10 2; then
|
|
@@ -4,7 +4,7 @@ ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
|
4
4
|
SERVER_DIR="$ROOT_DIR/server"
|
|
5
5
|
LOG_DIR="${COZE_LOG_DIR:-$ROOT_DIR/logs}"
|
|
6
6
|
LOG_SERVER_FILE="$LOG_DIR/server.log"
|
|
7
|
-
SERVER_PORT="${SERVER_PORT
|
|
7
|
+
SERVER_PORT="${SERVER_PORT:-<%= serverPort %>}"
|
|
8
8
|
|
|
9
9
|
mkdir -p "$LOG_DIR"
|
|
10
10
|
|
|
@@ -32,7 +32,9 @@ config.resolver.blockList = [
|
|
|
32
32
|
/.*node_modules\/\.pnpm\/.*_tmp_\d+.*/,
|
|
33
33
|
];
|
|
34
34
|
|
|
35
|
-
const
|
|
35
|
+
const DEFAULT_BACKEND_PORT = '<%= serverPort %>';
|
|
36
|
+
const BACKEND_PORT = process.env.SERVER_PORT || DEFAULT_BACKEND_PORT;
|
|
37
|
+
const BACKEND_TARGET = `http://localhost:${BACKEND_PORT}`;
|
|
36
38
|
|
|
37
39
|
const apiProxy = createProxyMiddleware({
|
|
38
40
|
target: BACKEND_TARGET,
|
|
@@ -269,8 +269,8 @@ importers:
|
|
|
269
269
|
specifier: ^2.8.5
|
|
270
270
|
version: 2.8.6
|
|
271
271
|
coze-coding-dev-sdk:
|
|
272
|
-
specifier: ^0.7.
|
|
273
|
-
version: 0.7.
|
|
272
|
+
specifier: ^0.7.25
|
|
273
|
+
version: 0.7.25(openai@6.16.0(ws@8.19.0)(zod@4.3.6))(ws@8.19.0)
|
|
274
274
|
dayjs:
|
|
275
275
|
specifier: ^1.11.20
|
|
276
276
|
version: 1.11.20
|
|
@@ -2643,8 +2643,8 @@ packages:
|
|
|
2643
2643
|
resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
|
|
2644
2644
|
engines: {node: '>=10'}
|
|
2645
2645
|
|
|
2646
|
-
coze-coding-dev-sdk@0.7.
|
|
2647
|
-
resolution: {integrity: sha512-
|
|
2646
|
+
coze-coding-dev-sdk@0.7.25:
|
|
2647
|
+
resolution: {integrity: sha512-5683ngikMdsRW0slGTE2OAZ1Fyj0lhkC4fGNOwsqKc35e68/gtg9KmmtK9CK9SZ+5/oIn/4wLoHXFB0gHJtO2A==}
|
|
2648
2648
|
engines: {node: '>=18.0.0'}
|
|
2649
2649
|
hasBin: true
|
|
2650
2650
|
|
|
@@ -9088,7 +9088,7 @@ snapshots:
|
|
|
9088
9088
|
path-type: 4.0.0
|
|
9089
9089
|
yaml: 1.10.2
|
|
9090
9090
|
|
|
9091
|
-
coze-coding-dev-sdk@0.7.
|
|
9091
|
+
coze-coding-dev-sdk@0.7.25(openai@6.16.0(ws@8.19.0)(zod@4.3.6))(ws@8.19.0):
|
|
9092
9092
|
dependencies:
|
|
9093
9093
|
'@langchain/core': 1.1.17(openai@6.16.0(ws@8.19.0)(zod@4.3.6))
|
|
9094
9094
|
'@langchain/openai': 1.2.3(@langchain/core@1.1.17(openai@6.16.0(ws@8.19.0)(zod@4.3.6)))(ws@8.19.0)
|
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
"build": "node build.js",
|
|
7
7
|
"dev": "bash ../.cozeproj/scripts/server_dev_run.sh",
|
|
8
8
|
"preinstall": "npx only-allow pnpm",
|
|
9
|
-
"start": "NODE_ENV=production PORT=${PORT
|
|
9
|
+
"start": "NODE_ENV=production PORT=${PORT:-<%= port %>} node dist/index.js",
|
|
10
10
|
"lint": "tsc --noEmit"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"@supabase/supabase-js": "2.95.3",
|
|
14
14
|
"cors": "^2.8.5",
|
|
15
|
-
"coze-coding-dev-sdk": "^0.7.
|
|
15
|
+
"coze-coding-dev-sdk": "^0.7.25",
|
|
16
16
|
"dayjs": "^1.11.20",
|
|
17
17
|
"dotenv": "^17.2.3",
|
|
18
18
|
"drizzle-orm": "^0.45.1",
|