@coze-arch/cli 0.0.36-alpha.1b252b → 0.0.36-alpha.2c0689
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 +65 -114
- package/docs/deploy.md +10 -2
- package/lib/__templates__/expo/.cozeproj/scripts/dev_run.sh +74 -18
- 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 +2 -0
- package/lib/__templates__/native-static/scripts/serve.ps1 +7 -0
- package/lib/__templates__/nextjs/.coze +5 -0
- package/lib/__templates__/nextjs/package.json +1 -1
- 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 +83 -2
- 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 +1 -1
- 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 +82 -1
- 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 +5 -0
- package/lib/__templates__/phaser/README.md +8 -0
- package/lib/__templates__/phaser/scripts/build.ps1 +12 -0
- package/lib/__templates__/phaser/scripts/dev.ps1 +49 -0
- package/lib/__templates__/phaser/scripts/prepare.ps1 +8 -0
- package/lib/__templates__/phaser/scripts/start.ps1 +49 -0
- package/lib/__templates__/phaser/scripts/validate.ps1 +7 -0
- package/lib/__templates__/phaser/src/global.d.ts +3 -0
- package/lib/__templates__/phaser/src/scene/BootScene.ts +4 -0
- package/lib/__templates__/phaser/src/scene/DevLoadingScene.ts +3 -0
- package/lib/__templates__/phaser/src/utils/mark-editable.ts +8 -1
- package/lib/__templates__/phaser/vite.config.ts +1 -1
- 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 +150 -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 +26 -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 +82 -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 +1 -1
- package/lib/cli.js +647 -358
- package/lib/deploy/package-project.js +28 -4
- package/lib/deploy/package-project.py +21 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,154 +1,105 @@
|
|
|
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-
|
|
26
|
-
coze-dev deploy code deploy --source-root . --yes --wait
|
|
16
|
+
npx @coze-arch/cli --help
|
|
27
17
|
```
|
|
28
18
|
|
|
29
|
-
|
|
30
|
-
`coze-dev` 能力共享 `~/.coze/cli/config.json` 登录态,也支持通过
|
|
31
|
-
`COZE_API_TOKEN` 提供固定运行时凭证。
|
|
32
|
-
|
|
33
|
-
### 初始化项目
|
|
19
|
+
## 初始化项目
|
|
34
20
|
|
|
35
21
|
```bash
|
|
36
|
-
coze-
|
|
22
|
+
coze-dev init my-app --template <template> --app-name my-app
|
|
23
|
+
coze-dev init --help
|
|
37
24
|
```
|
|
38
25
|
|
|
39
|
-
|
|
26
|
+
`init` 默认会渲染模板、安装依赖、初始化 Git、创建初始提交并启动开发服务。按需使用
|
|
27
|
+
`--skip-install`、`--skip-git`、`--skip-commit`、`--skip-dev` 跳过这些步骤。模板名称和
|
|
28
|
+
参数以 `coze-dev init --help` 的实时输出为准;未声明的参数会以 kebab-case 转为
|
|
29
|
+
camelCase 后传给模板。
|
|
40
30
|
|
|
41
|
-
|
|
42
|
-
coze-coding init --help
|
|
43
|
-
```
|
|
31
|
+
## 在项目中运行
|
|
44
32
|
|
|
45
|
-
|
|
33
|
+
初始化产物根目录的 `.coze` 是统一命令契约:
|
|
46
34
|
|
|
47
35
|
```bash
|
|
48
|
-
#
|
|
49
|
-
coze-
|
|
50
|
-
|
|
51
|
-
#
|
|
52
|
-
coze-coding build
|
|
53
|
-
|
|
54
|
-
# 启动生产服务器
|
|
55
|
-
coze-coding start
|
|
36
|
+
coze-dev dev # 读取 dev.run
|
|
37
|
+
coze-dev build # 读取 deploy.build
|
|
38
|
+
coze-dev start # 读取 deploy.run
|
|
39
|
+
coze-dev validate # 读取 dev.validate
|
|
56
40
|
```
|
|
57
41
|
|
|
58
|
-
|
|
42
|
+
`dev` 和 `build` 在执行前会尝试应用模板补丁;补丁失败会记录调试信息,但不会阻止主命令。
|
|
43
|
+
子进程日志默认写入 `~/.coze-logs/dev.log`,可用 `--log-file <path>` 覆盖。
|
|
59
44
|
|
|
60
|
-
|
|
45
|
+
## Windows 与 WSL
|
|
61
46
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
- `--use-typescript` → `useTypeScript`
|
|
65
|
-
- `--port` → `port`
|
|
47
|
+
原生 Windows(`process.platform === "win32"`)优先使用 `.coze` 中非空的 Windows
|
|
48
|
+
覆盖命令;未配置时回退默认命令。WSL 被识别为 Linux,始终执行默认命令。
|
|
66
49
|
|
|
67
|
-
|
|
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` |
|
|
68
57
|
|
|
69
|
-
|
|
58
|
+
已支持 Windows 的内置 Web 与 Phaser 模板将覆盖命令映射到 PowerShell 脚本,例如:
|
|
70
59
|
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
├── .coze # 项目配置文件
|
|
76
|
-
└── src/ # 源代码(支持 EJS 模板)
|
|
77
|
-
```
|
|
60
|
+
```toml
|
|
61
|
+
[dev]
|
|
62
|
+
run = ["bash", "./scripts/dev.sh"]
|
|
63
|
+
run_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "./scripts/dev.ps1"]
|
|
78
64
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
```typescript
|
|
84
|
-
import type { JSONSchemaType } from 'ajv';
|
|
85
|
-
|
|
86
|
-
export interface TemplateParams {
|
|
87
|
-
appName: string;
|
|
88
|
-
useTypeScript: boolean;
|
|
89
|
-
port: number;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
export const paramsSchema: JSONSchemaType<TemplateParams> = {
|
|
93
|
-
type: 'object',
|
|
94
|
-
properties: {
|
|
95
|
-
appName: {
|
|
96
|
-
type: 'string',
|
|
97
|
-
minLength: 1,
|
|
98
|
-
pattern: '^[a-z0-9-]+$',
|
|
99
|
-
cliParam: '--app-name',
|
|
100
|
-
description: 'Application name'
|
|
101
|
-
},
|
|
102
|
-
useTypeScript: {
|
|
103
|
-
type: 'boolean',
|
|
104
|
-
default: true,
|
|
105
|
-
cliParam: '--use-typescript',
|
|
106
|
-
description: 'Enable TypeScript'
|
|
107
|
-
},
|
|
108
|
-
port: {
|
|
109
|
-
type: 'number',
|
|
110
|
-
default: 3000,
|
|
111
|
-
minimum: 1024,
|
|
112
|
-
maximum: 65535,
|
|
113
|
-
cliParam: '--port',
|
|
114
|
-
description: 'Development server port'
|
|
115
|
-
}
|
|
116
|
-
},
|
|
117
|
-
required: ['appName'],
|
|
118
|
-
additionalProperties: false
|
|
119
|
-
};
|
|
65
|
+
[deploy]
|
|
66
|
+
build = ["bash", "./scripts/build.sh"]
|
|
67
|
+
build_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "./scripts/build.ps1"]
|
|
120
68
|
```
|
|
121
69
|
|
|
122
|
-
|
|
70
|
+
## 部署
|
|
123
71
|
|
|
124
|
-
|
|
125
|
-
export const onBeforeRender = (context) => {
|
|
126
|
-
// 渲染前处理
|
|
127
|
-
return context;
|
|
128
|
-
};
|
|
72
|
+
`coze-dev deploy` 内置于同一 CLI,登录态默认保存在 `~/.coze/cli/config.json`:
|
|
129
73
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
74
|
+
```bash
|
|
75
|
+
coze-dev deploy auth login
|
|
76
|
+
coze-dev deploy doctor
|
|
77
|
+
coze-dev deploy code deploy --source-root . --yes --wait
|
|
133
78
|
```
|
|
134
79
|
|
|
135
|
-
|
|
80
|
+
完整的应用、环境变量、Pages 和小程序命令说明见 [部署文档](./docs/deploy.md)。
|
|
81
|
+
`dev.pack_win` 是自定义模板可选的 Windows 打包覆盖;当前 Expo、Taro 和 Pi Agent 模板
|
|
82
|
+
不承诺 Windows 支持。
|
|
136
83
|
|
|
137
|
-
|
|
84
|
+
## 模板开发
|
|
138
85
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
- ✅ 使用工厂函数和闭包
|
|
142
|
-
- ❌ 禁止使用 class
|
|
143
|
-
- ❌ 避免副作用和可变状态
|
|
86
|
+
模板位于 `src/__templates__/`,每个模板通过 `template.config.ts` 定义参数和渲染钩子,
|
|
87
|
+
`.coze` 定义生成项目的运行命令。新增模板或修改模板目录后执行:
|
|
144
88
|
|
|
145
|
-
|
|
89
|
+
```bash
|
|
90
|
+
npm run prebuild
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
模板开发细节见 [模板开发指南](./docs/how-to-dev.md)。仓库开发依赖由 Rush 管理,不要在本包目录单独执行 `npm install` 或 `pnpm install`。
|
|
146
94
|
|
|
147
|
-
##
|
|
95
|
+
## 本地开发与验证
|
|
148
96
|
|
|
149
|
-
|
|
150
|
-
- [技术设计](./docs/technical-design.md)
|
|
97
|
+
源码入口支持直接运行,无需先构建:
|
|
151
98
|
|
|
152
|
-
|
|
99
|
+
```bash
|
|
100
|
+
node src/cli.js --help
|
|
101
|
+
npm run test
|
|
102
|
+
npm run build
|
|
103
|
+
```
|
|
153
104
|
|
|
154
|
-
|
|
105
|
+
端到端模板验证使用 `npm run test:e2e`,会真实安装模板依赖并启动服务。发布前需完成该验证。
|
package/docs/deploy.md
CHANGED
|
@@ -54,7 +54,7 @@ coze-dev deploy code deploy logs|log-count|count|build-log|config
|
|
|
54
54
|
coze-dev deploy code domain list [--unit-type dev|prod]
|
|
55
55
|
coze-dev deploy code domain add <domain>
|
|
56
56
|
coze-dev deploy code domain set-prefix <prefix> --app-id <app_id> --yes
|
|
57
|
-
coze-dev deploy code mini-program status|bind|submit-code|unbind
|
|
57
|
+
coze-dev deploy code mini-program status|bind|submit-code|unbind|auth|preview
|
|
58
58
|
```
|
|
59
59
|
|
|
60
60
|
`code app list` 是真分页:一次只返回一页(`--page-size` 默认 20、上限 100),`has_more` 为真时用返回的 `next_page_token` 取下一页;要一次拿到名下全部应用用 `--all`,它会自己翻到底。
|
|
@@ -93,7 +93,8 @@ coze-dev deploy code deploy --source-root . --application-type pages --yes --wai
|
|
|
93
93
|
`--application-type pages` 自动复用,或显式传 `--app-id`。
|
|
94
94
|
|
|
95
95
|
V2 接口的所有参数均通过 POST JSON body 发送,不会放入 URL。确认非 Pages 部署后,CLI
|
|
96
|
-
会执行 `.coze` 中可选的 `dev.pack`
|
|
96
|
+
会执行 `.coze` 中可选的 `dev.pack` 命令;原生 Windows 优先执行非空的
|
|
97
|
+
`dev.pack_win`,未配置时回退 `dev.pack`。该步骤将
|
|
97
98
|
本地部署内容打成无根目录的 `tar.gz`,再通过 `source_package_base64` 上传。Pages 部署
|
|
98
99
|
统一上传源码根目录:已有 `index.html` 时服务端跳过构建,没有时由服务端按 Snapshot 中的
|
|
99
100
|
`.coze deploy.build` 构建。打包由 CLI 自带的 Node.js 脚本执行,并排除 `.coze`、`.env`、
|
|
@@ -119,6 +120,13 @@ coze-dev deploy code deploy --source-root . --application-type mini_program \
|
|
|
119
120
|
--connector-id 10000127 --yes --wait
|
|
120
121
|
```
|
|
121
122
|
|
|
123
|
+
小程序预览先完成授权,再执行 preview。preview 会打包微信的 dist/ 或抖音的 dist-tt/ 并上传。Project ID 可通过参数传入或从 .coze 自动读取。
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
coze-dev deploy code mini-program auth --platform wechat --mini-app-id wx123 --source-root .
|
|
127
|
+
coze-dev deploy code mini-program preview --platform wechat --mini-app-id wx123 --source-root .
|
|
128
|
+
```
|
|
129
|
+
|
|
122
130
|
绑定小程序 AppID 时,默认从源码目录 `.coze [project]` 读取该目录的 `project_id`:
|
|
123
131
|
|
|
124
132
|
```bash
|
|
@@ -1,17 +1,21 @@
|
|
|
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
|
|
17
|
+
# DEPLOY_RUN_PORT 是平台注入的对外端口,EXPO_PORT 保留为本地覆盖项。
|
|
18
|
+
EXPO_PORT="${DEPLOY_RUN_PORT:-${EXPO_PORT:-<%= port %>}}"
|
|
15
19
|
WEB_URL="${COZE_PROJECT_DOMAIN_DEFAULT:-http://127.0.0.1:${SERVER_PORT}}"
|
|
16
20
|
ASSUME_YES="1"
|
|
17
21
|
EXPO_PUBLIC_BACKEND_BASE_URL="${EXPO_PUBLIC_BACKEND_BASE_URL:-$WEB_URL}"
|
|
@@ -22,6 +26,7 @@ export EXPO_PUBLIC_BACKEND_BASE_URL EXPO_PACKAGER_PROXY_URL EXPO_PUBLIC_COZE_PRO
|
|
|
22
26
|
# 运行时变量(为避免 set -u 的未绑定错误,预置为空)
|
|
23
27
|
SERVER_PID=""
|
|
24
28
|
EXPO_PID=""
|
|
29
|
+
PNPM_BIN=""
|
|
25
30
|
|
|
26
31
|
# ==================== 工具函数 ====================
|
|
27
32
|
check_command() {
|
|
@@ -112,22 +117,67 @@ wait_port_connectable() {
|
|
|
112
117
|
return 1
|
|
113
118
|
}
|
|
114
119
|
|
|
115
|
-
|
|
116
|
-
|
|
120
|
+
# coze-daemon 会在 runtime shell 退出时清理原进程组。
|
|
121
|
+
# 通过 Node detached spawn 创建独立 session/进程组,并将 stdio 直接写入日志。
|
|
122
|
+
spawn_detached() {
|
|
123
|
+
local cwd="$1"
|
|
124
|
+
local log_file="$2"
|
|
125
|
+
shift 2
|
|
126
|
+
|
|
127
|
+
node - "$cwd" "$log_file" "$@" <<'NODE'
|
|
128
|
+
const fs = require('node:fs');
|
|
129
|
+
const { spawn } = require('node:child_process');
|
|
117
130
|
|
|
118
|
-
|
|
131
|
+
const [cwd, logFile, command, ...args] = process.argv.slice(2);
|
|
132
|
+
if (!cwd || !logFile || !command) {
|
|
133
|
+
throw new Error('spawn_detached 缺少 cwd、log_file 或 command');
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const logFd = fs.openSync(logFile, 'a');
|
|
137
|
+
try {
|
|
138
|
+
const child = spawn(command, args, {
|
|
139
|
+
cwd,
|
|
140
|
+
detached: true,
|
|
141
|
+
env: process.env,
|
|
142
|
+
stdio: ['ignore', logFd, logFd],
|
|
143
|
+
});
|
|
144
|
+
child.unref();
|
|
145
|
+
process.stdout.write(String(child.pid));
|
|
146
|
+
} finally {
|
|
147
|
+
fs.closeSync(logFd);
|
|
148
|
+
}
|
|
149
|
+
NODE
|
|
150
|
+
}
|
|
119
151
|
|
|
152
|
+
stop_detached() {
|
|
153
|
+
local pid="${1:-}"
|
|
154
|
+
if [ -z "$pid" ]; then
|
|
155
|
+
return
|
|
156
|
+
fi
|
|
157
|
+
|
|
158
|
+
kill -TERM -- "-$pid" 2>/dev/null || kill -TERM "$pid" 2>/dev/null || true
|
|
159
|
+
sleep 1
|
|
160
|
+
kill -KILL -- "-$pid" 2>/dev/null || true
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
start_expo() {
|
|
164
|
+
local offline="${1:-0}"
|
|
165
|
+
local -a expo_env
|
|
166
|
+
expo_env=(
|
|
167
|
+
"EXPO_NO_DEPENDENCY_VALIDATION=1"
|
|
168
|
+
"EXPO_PUBLIC_BACKEND_BASE_URL=$EXPO_PUBLIC_BACKEND_BASE_URL"
|
|
169
|
+
"EXPO_PACKAGER_PROXY_URL=$EXPO_PACKAGER_PROXY_URL"
|
|
170
|
+
"EXPO_PUBLIC_COZE_PROJECT_ID=$EXPO_PUBLIC_COZE_PROJECT_ID"
|
|
171
|
+
)
|
|
120
172
|
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" ) &
|
|
173
|
+
expo_env+=("EXPO_OFFLINE=1")
|
|
126
174
|
fi
|
|
127
|
-
EXPO_PID=$!
|
|
128
|
-
disown $EXPO_PID 2>/dev/null || true
|
|
129
175
|
|
|
130
|
-
|
|
176
|
+
EXPO_PID="$(spawn_detached \
|
|
177
|
+
"$ROOT_DIR/client" \
|
|
178
|
+
"$LOG_CLIENT_FILE" \
|
|
179
|
+
/usr/bin/env "${expo_env[@]}" \
|
|
180
|
+
"$PNPM_BIN" exec expo start --clear --port "$EXPO_PORT")"
|
|
131
181
|
}
|
|
132
182
|
|
|
133
183
|
detect_expo_fetch_failed() {
|
|
@@ -168,6 +218,8 @@ check_command "npm"
|
|
|
168
218
|
check_command "pnpm"
|
|
169
219
|
check_command "lsof"
|
|
170
220
|
check_command "bash"
|
|
221
|
+
check_command "node"
|
|
222
|
+
PNPM_BIN="$(command -v pnpm)"
|
|
171
223
|
|
|
172
224
|
# 端口占用预检查与处理
|
|
173
225
|
ensure_port SERVER_PORT "$SERVER_PORT"
|
|
@@ -175,9 +227,12 @@ ensure_port EXPO_PORT "$EXPO_PORT"
|
|
|
175
227
|
|
|
176
228
|
echo "==================== 启动 server 服务 ===================="
|
|
177
229
|
echo "正在执行:pnpm run dev (server)"
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
230
|
+
: > "$LOG_SERVER_FILE"
|
|
231
|
+
export SERVER_PORT
|
|
232
|
+
SERVER_PID="$(spawn_detached \
|
|
233
|
+
"$ROOT_DIR/server" \
|
|
234
|
+
/dev/null \
|
|
235
|
+
"$PNPM_BIN" run dev)"
|
|
181
236
|
if [ -z "${SERVER_PID}" ]; then
|
|
182
237
|
echo "无法获取 server 后台进程 PID"
|
|
183
238
|
fi
|
|
@@ -185,11 +240,12 @@ echo "server 服务已启动,进程 ID:${SERVER_PID:-unknown}"
|
|
|
185
240
|
|
|
186
241
|
echo "==================== 启动 Expo 项目 ===================="
|
|
187
242
|
echo "开始启动 Expo 服务,端口 ${EXPO_PORT}"
|
|
243
|
+
: > "$LOG_CLIENT_FILE"
|
|
188
244
|
start_expo 0
|
|
189
245
|
if detect_expo_fetch_failed 8; then
|
|
190
246
|
echo "Expo 启动检测到网络错误:TypeError: fetch failed,启用离线模式重试"
|
|
191
|
-
|
|
192
|
-
: > "$
|
|
247
|
+
stop_detached "$EXPO_PID"
|
|
248
|
+
: > "$LOG_CLIENT_FILE"
|
|
193
249
|
start_expo 1
|
|
194
250
|
fi
|
|
195
251
|
# 输出以下环境变量,确保 Expo 项目能正确连接到 Server 服务
|
|
@@ -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-beta.8
|
|
273
|
+
version: 0.7.25-beta.8(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-beta.8:
|
|
2647
|
+
resolution: {integrity: sha512-RSKlXCO0W/OPDjx9D9JICn2cGeOJw3iG+y0Pr1AhAf7YdAjjNbBZoG7qfg0Zg2SqgaVN2qSLQFmKPbhNq9ZWSg==}
|
|
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-beta.8(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-beta.8",
|
|
16
16
|
"dayjs": "^1.11.20",
|
|
17
17
|
"dotenv": "^17.2.3",
|
|
18
18
|
"drizzle-orm": "^0.45.1",
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
|
+
|
|
9
10
|
export const paramsSchema = {
|
|
10
11
|
type: 'object',
|
|
11
12
|
properties: {
|
|
@@ -18,11 +19,18 @@ export const paramsSchema = {
|
|
|
18
19
|
},
|
|
19
20
|
port: {
|
|
20
21
|
type: 'number',
|
|
21
|
-
default:
|
|
22
|
+
default: 5000,
|
|
22
23
|
minimum: 1024,
|
|
23
24
|
maximum: 65535,
|
|
24
25
|
description: 'Metro bundler port',
|
|
25
26
|
},
|
|
27
|
+
serverPort: {
|
|
28
|
+
type: 'number',
|
|
29
|
+
default: 9091,
|
|
30
|
+
minimum: 1024,
|
|
31
|
+
maximum: 65535,
|
|
32
|
+
description: 'Express backend server port',
|
|
33
|
+
},
|
|
26
34
|
},
|
|
27
35
|
required: [],
|
|
28
36
|
additionalProperties: false,
|
|
@@ -32,7 +40,8 @@ const config = {
|
|
|
32
40
|
description: 'Expo template for React Native applications',
|
|
33
41
|
paramsSchema,
|
|
34
42
|
defaultParams: {
|
|
35
|
-
port:
|
|
43
|
+
port: 5000,
|
|
44
|
+
serverPort: 9091,
|
|
36
45
|
appName: 'my-expo-app',
|
|
37
46
|
},
|
|
38
47
|
onBeforeRender: async context => {
|
|
@@ -6,7 +6,9 @@ project_type = "web"
|
|
|
6
6
|
[dev]
|
|
7
7
|
build = []
|
|
8
8
|
run = [ "sh", "-c", "python -m http.server ${DEPLOY_RUN_PORT} --bind 0.0.0.0" ]
|
|
9
|
+
run_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "./scripts/serve.ps1"]
|
|
9
10
|
|
|
10
11
|
[deploy]
|
|
11
12
|
build = []
|
|
12
13
|
run = [ "sh", "-c", "python -m http.server ${DEPLOY_RUN_PORT} --bind 0.0.0.0" ]
|
|
14
|
+
run_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "./scripts/serve.ps1"]
|
|
@@ -4,11 +4,16 @@ 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"]
|
|
7
8
|
run = ["bash", "./scripts/dev.sh"]
|
|
9
|
+
run_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "./scripts/dev.ps1"]
|
|
8
10
|
validate = ["bash", "./scripts/validate.sh"]
|
|
11
|
+
validate_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "./scripts/validate.ps1"]
|
|
9
12
|
deps = ["git"] # -> apt install git
|
|
10
13
|
|
|
11
14
|
[deploy]
|
|
12
15
|
build = ["bash","./scripts/build.sh"]
|
|
16
|
+
build_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "./scripts/build.ps1"]
|
|
13
17
|
run = ["bash","./scripts/start.sh"]
|
|
18
|
+
run_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "./scripts/start.ps1"]
|
|
14
19
|
deps = ["git"] # -> apt install git
|
|
@@ -108,8 +108,8 @@ importers:
|
|
|
108
108
|
specifier: ^1.1.1
|
|
109
109
|
version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
|
|
110
110
|
coze-coding-dev-sdk:
|
|
111
|
-
specifier: ^0.7.
|
|
112
|
-
version: 0.7.
|
|
111
|
+
specifier: ^0.7.25-beta.8
|
|
112
|
+
version: 0.7.25-beta.8(openai@6.16.0(ws@8.19.0)(zod@4.3.6))(ws@8.19.0)
|
|
113
113
|
date-fns:
|
|
114
114
|
specifier: ^4.1.0
|
|
115
115
|
version: 4.1.0
|
|
@@ -3363,8 +3363,8 @@ packages:
|
|
|
3363
3363
|
typescript:
|
|
3364
3364
|
optional: true
|
|
3365
3365
|
|
|
3366
|
-
coze-coding-dev-sdk@0.7.
|
|
3367
|
-
resolution: {integrity: sha512-
|
|
3366
|
+
coze-coding-dev-sdk@0.7.25-beta.8:
|
|
3367
|
+
resolution: {integrity: sha512-RSKlXCO0W/OPDjx9D9JICn2cGeOJw3iG+y0Pr1AhAf7YdAjjNbBZoG7qfg0Zg2SqgaVN2qSLQFmKPbhNq9ZWSg==}
|
|
3368
3368
|
engines: {node: '>=18.0.0'}
|
|
3369
3369
|
hasBin: true
|
|
3370
3370
|
|
|
@@ -9627,7 +9627,7 @@ snapshots:
|
|
|
9627
9627
|
optionalDependencies:
|
|
9628
9628
|
typescript: 5.9.3
|
|
9629
9629
|
|
|
9630
|
-
coze-coding-dev-sdk@0.7.
|
|
9630
|
+
coze-coding-dev-sdk@0.7.25-beta.8(openai@6.16.0(ws@8.19.0)(zod@4.3.6))(ws@8.19.0):
|
|
9631
9631
|
dependencies:
|
|
9632
9632
|
'@langchain/core': 1.1.17(openai@6.16.0(ws@8.19.0)(zod@4.3.6))
|
|
9633
9633
|
'@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)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
$ErrorActionPreference = "Stop"
|
|
2
|
+
|
|
3
|
+
$workspace = if ($env:COZE_WORKSPACE_PATH) { $env:COZE_WORKSPACE_PATH } else { (Get-Location).Path }
|
|
4
|
+
Set-Location $workspace
|
|
5
|
+
|
|
6
|
+
Write-Host "Installing dependencies..."
|
|
7
|
+
& pnpm install --prefer-frozen-lockfile --prefer-offline --loglevel debug --reporter=append-only
|
|
8
|
+
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
9
|
+
|
|
10
|
+
Write-Host "Building the Next.js project..."
|
|
11
|
+
& pnpm next build
|
|
12
|
+
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
13
|
+
|
|
14
|
+
Write-Host "Bundling server with tsup..."
|
|
15
|
+
& pnpm tsup src/server.ts --format cjs --platform node --target node20 --outDir dist --no-splitting --no-minify
|
|
16
|
+
exit $LASTEXITCODE
|