@coze-arch/cli 0.0.36-alpha.0a210b → 0.0.36-alpha.15544e

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 (109) hide show
  1. package/README.md +68 -114
  2. package/docs/deploy.md +57 -40
  3. package/lib/__templates__/expo/.cozeproj/scripts/dev_run.sh +38 -4
  4. package/lib/__templates__/expo/.cozeproj/scripts/prod_run.sh +1 -1
  5. package/lib/__templates__/expo/.cozeproj/scripts/server_dev_run.sh +1 -1
  6. package/lib/__templates__/expo/client/metro.config.js +3 -1
  7. package/lib/__templates__/expo/pnpm-lock.yaml +5 -5
  8. package/lib/__templates__/expo/server/package.json +2 -2
  9. package/lib/__templates__/expo/server/src/index.ts +1 -1
  10. package/lib/__templates__/expo/template.config.js +11 -2
  11. package/lib/__templates__/native-static/.coze +2 -0
  12. package/lib/__templates__/native-static/scripts/serve.ps1 +7 -0
  13. package/lib/__templates__/nextjs/.coze +5 -0
  14. package/lib/__templates__/nextjs/package.json +3 -3
  15. package/lib/__templates__/nextjs/pnpm-lock.yaml +513 -9
  16. package/lib/__templates__/nextjs/scripts/build.ps1 +16 -0
  17. package/lib/__templates__/nextjs/scripts/dev.ps1 +63 -0
  18. package/lib/__templates__/nextjs/scripts/dev.sh +230 -13
  19. package/lib/__templates__/nextjs/scripts/prepare.ps1 +18 -0
  20. package/lib/__templates__/nextjs/scripts/start.ps1 +11 -0
  21. package/lib/__templates__/nextjs/scripts/validate.ps1 +8 -0
  22. package/lib/__templates__/nextjs/template.config.js +1 -1
  23. package/lib/__templates__/nuxt-vue/.coze +5 -0
  24. package/lib/__templates__/nuxt-vue/package.json +1 -1
  25. package/lib/__templates__/nuxt-vue/pnpm-lock.yaml +5 -5
  26. package/lib/__templates__/nuxt-vue/scripts/build.ps1 +12 -0
  27. package/lib/__templates__/nuxt-vue/scripts/dev.ps1 +63 -0
  28. package/lib/__templates__/nuxt-vue/scripts/dev.sh +110 -1
  29. package/lib/__templates__/nuxt-vue/scripts/prepare.ps1 +12 -0
  30. package/lib/__templates__/nuxt-vue/scripts/start.ps1 +11 -0
  31. package/lib/__templates__/nuxt-vue/scripts/validate.ps1 +8 -0
  32. package/lib/__templates__/phaser/.coze +5 -0
  33. package/lib/__templates__/phaser/README.md +8 -0
  34. package/lib/__templates__/phaser/scripts/build.ps1 +12 -0
  35. package/lib/__templates__/phaser/scripts/dev.ps1 +49 -0
  36. package/lib/__templates__/phaser/scripts/prepare.ps1 +8 -0
  37. package/lib/__templates__/phaser/scripts/start.ps1 +49 -0
  38. package/lib/__templates__/phaser/scripts/validate.ps1 +7 -0
  39. package/lib/__templates__/phaser/src/global.d.ts +3 -0
  40. package/lib/__templates__/phaser/src/scene/BootScene.ts +4 -0
  41. package/lib/__templates__/phaser/src/scene/DevLoadingScene.ts +3 -0
  42. package/lib/__templates__/phaser/src/utils/mark-editable.ts +8 -1
  43. package/lib/__templates__/phaser/vite.config.ts +1 -1
  44. package/lib/__templates__/phaser-static/.coze +15 -0
  45. package/lib/__templates__/phaser-static/README.md +40 -0
  46. package/lib/__templates__/phaser-static/_gitignore +6 -0
  47. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0001.png +0 -0
  48. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0002.png +0 -0
  49. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0003.png +0 -0
  50. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0004.png +0 -0
  51. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0005.png +0 -0
  52. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0006.png +0 -0
  53. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0007.png +0 -0
  54. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0008.png +0 -0
  55. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0009.png +0 -0
  56. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0010.png +0 -0
  57. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0011.png +0 -0
  58. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0012.png +0 -0
  59. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0013.png +0 -0
  60. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0014.png +0 -0
  61. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0015.png +0 -0
  62. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0016.png +0 -0
  63. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0017.png +0 -0
  64. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0018.png +0 -0
  65. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0019.png +0 -0
  66. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0020.png +0 -0
  67. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0021.png +0 -0
  68. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0022.png +0 -0
  69. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0023.png +0 -0
  70. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0024.png +0 -0
  71. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/manifest.json +11 -0
  72. package/lib/__templates__/phaser-static/debug-runtime/flow-graph.json +20 -0
  73. package/lib/__templates__/phaser-static/index.html +17 -0
  74. package/lib/__templates__/phaser-static/scripts/serve.ps1 +7 -0
  75. package/lib/__templates__/phaser-static/src/assets.js +15 -0
  76. package/lib/__templates__/phaser-static/src/main.js +26 -0
  77. package/lib/__templates__/phaser-static/src/phaser.js +7 -0
  78. package/lib/__templates__/phaser-static/src/scene/BootScene.js +205 -0
  79. package/lib/__templates__/phaser-static/src/scene/DevLoadingScene.js +67 -0
  80. package/lib/__templates__/phaser-static/src/style.css +28 -0
  81. package/lib/__templates__/phaser-static/src/utils/asset-loader.js +267 -0
  82. package/lib/__templates__/phaser-static/src/utils/index.js +2 -0
  83. package/lib/__templates__/phaser-static/src/utils/mark-editable.js +3 -0
  84. package/lib/__templates__/phaser-static/template.config.js +35 -0
  85. package/lib/__templates__/pi-agent/package.json +1 -1
  86. package/lib/__templates__/pi-agent/pnpm-lock.yaml +5 -5
  87. package/lib/__templates__/taro/.cozeproj/scripts/deploy_run.sh +1 -1
  88. package/lib/__templates__/taro/.cozeproj/scripts/dev_run.sh +172 -68
  89. package/lib/__templates__/taro/AGENTS.md +11 -7
  90. package/lib/__templates__/taro/README.md +4 -4
  91. package/lib/__templates__/taro/config/index.ts +10 -2
  92. package/lib/__templates__/taro/pnpm-lock.yaml +5 -5
  93. package/lib/__templates__/taro/server/package.json +1 -1
  94. package/lib/__templates__/taro/server/src/main.ts +8 -2
  95. package/lib/__templates__/templates.json +26 -1
  96. package/lib/__templates__/vite/.coze +5 -0
  97. package/lib/__templates__/vite/package.json +1 -1
  98. package/lib/__templates__/vite/pnpm-lock.yaml +5 -5
  99. package/lib/__templates__/vite/scripts/build.ps1 +16 -0
  100. package/lib/__templates__/vite/scripts/dev.ps1 +63 -0
  101. package/lib/__templates__/vite/scripts/dev.sh +110 -1
  102. package/lib/__templates__/vite/scripts/prepare.ps1 +18 -0
  103. package/lib/__templates__/vite/scripts/start.ps1 +11 -0
  104. package/lib/__templates__/vite/scripts/validate.ps1 +8 -0
  105. package/lib/__templates__/vite/template.config.js +1 -1
  106. package/lib/cli.js +746 -217
  107. package/lib/deploy/package-project.js +22 -4
  108. package/lib/deploy/package-project.py +18 -3
  109. package/package.json +1 -1
package/README.md CHANGED
@@ -1,154 +1,108 @@
1
- # @coze-coding/cli
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
- rush update
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-dev deploy auth login
26
- coze-dev deploy code deploy --source-root . --yes --wait
16
+ npx @coze-arch/cli --help
27
17
  ```
28
18
 
29
- 完整命令、参数和示例见 [部署命令文档](./docs/deploy.md)。部署命令与其它
30
- `coze-dev` 能力共享 `~/.coze/cli/config.json` 登录态,也支持通过
31
- `COZE_API_TOKEN` 提供固定运行时凭证。
32
-
33
- ### 初始化项目
19
+ ## 初始化项目
34
20
 
35
21
  ```bash
36
- coze-coding init --template react --app-name my-app --use-typescript --use-tailwind
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
- ```bash
42
- coze-coding init --help
43
- ```
31
+ ## 在项目中运行
44
32
 
45
- ### 开发命令
33
+ 初始化产物根目录的 `.coze` 是统一命令契约:
46
34
 
47
35
  ```bash
48
- # 启动开发服务器
49
- coze-coding dev
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
- 每个模板都有自己的参数配置,通过 CLI 参数透传。参数名使用 kebab-case 格式,会自动转换为 camelCase 传入模板配置。
45
+ ## Windows WSL
61
46
 
62
- 例如:
63
- - `--app-name` → `appName`
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
- template-name/
73
- ├── template.config.ts # 模板配置(开发时)
74
- ├── template.config.js # 模板配置(生产时)
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
- 使用 JSON Schema 定义模板参数:
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
- ```typescript
125
- export const onBeforeRender = (context) => {
126
- // 渲染前处理
127
- return context;
128
- };
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` 登录态:
129
76
 
130
- export const onAfterRender = (context, outputPath) => {
131
- // 渲染后处理
132
- };
77
+ ```bash
78
+ coze-dev deploy auth login
79
+ coze-dev deploy doctor
80
+ coze-dev deploy --source-root . --yes --wait
133
81
  ```
134
82
 
135
- ## 编码规范
83
+ 完整的应用、环境变量、Pages 和小程序命令说明见 [部署文档](./docs/deploy.md)。
84
+ `dev.pack_win` 是自定义模板可选的 Windows 打包覆盖;当前 Expo、Taro 和 Pi Agent 模板
85
+ 不承诺 Windows 支持。
136
86
 
137
- 本项目严格遵循函数式编程风格:
87
+ ## 模板开发
138
88
 
139
- - 使用纯函数和不可变数据
140
- - ✅ 函数组合和高阶函数
141
- - ✅ 使用工厂函数和闭包
142
- - ❌ 禁止使用 class
143
- - ❌ 避免副作用和可变状态
89
+ 模板位于 `src/__templates__/`,每个模板通过 `template.config.ts` 定义参数和渲染钩子,
90
+ `.coze` 定义生成项目的运行命令。新增模板或修改模板目录后执行:
144
91
 
145
- 详见 [技术设计文档](./docs/technical-design.md#7-编码规范)
92
+ ```bash
93
+ npm run prebuild
94
+ ```
95
+
96
+ 模板开发细节见 [模板开发指南](./docs/how-to-dev.md)。仓库开发依赖由 Rush 管理,不要在本包目录单独执行 `npm install` 或 `pnpm install`。
146
97
 
147
- ## 文档
98
+ ## 本地开发与验证
148
99
 
149
- - [需求文档](./docs/requirement.md)
150
- - [技术设计](./docs/technical-design.md)
100
+ 源码入口支持直接运行,无需先构建:
151
101
 
152
- ## 许可证
102
+ ```bash
103
+ node src/cli.js --help
104
+ npm run test
105
+ npm run build
106
+ ```
153
107
 
154
- 内部项目
108
+ 端到端模板验证使用 `npm run test:e2e`,会真实安装模板依赖并启动服务。发布前需完成该验证。
package/docs/deploy.md CHANGED
@@ -1,7 +1,16 @@
1
1
  # coze-dev deploy
2
2
 
3
- `coze-dev` 内置的部署命令,复用主 Coze CLI 保存在
4
- `~/.coze/cli/config.json` 中的登录状态。
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 在本次进程内复用,不输出或持久化。
5
14
 
6
15
  ## 安装与运行
7
16
 
@@ -31,8 +40,8 @@ coze-dev deploy doctor
31
40
  `x-tt-env` 和 `x-use-ppe: 1`,该参数只对当前命令生效:
32
41
 
33
42
  ```bash
34
- coze-dev deploy --lane ppe_deploy code app list
35
- coze-dev deploy --lane ppe_deploy code deploy --source-root .
43
+ coze-dev deploy --lane ppe_deploy app list
44
+ coze-dev deploy --lane ppe_deploy --source-root .
36
45
  ```
37
46
 
38
47
  ## 命令
@@ -42,22 +51,22 @@ coze-dev deploy context show
42
51
  coze-dev deploy auth login|status|logout
43
52
  coze-dev deploy context use --space-id <space_id>
44
53
  coze-dev deploy doctor
45
- coze-dev deploy code app list [--page-size <n>] [--page-token <token>] [--all]
46
- coze-dev deploy code app show --app-id <app_id>
47
- coze-dev deploy code app rename <name> --app-id <app_id> --yes
48
- coze-dev deploy code app delete --app-id <app_id> --yes
49
- coze-dev deploy code app analytics|metrics --app-id <app_id> [--time-range <range>]
50
- coze-dev deploy code app usage --app-id <app_id> --bill-month <YYYY-MM>
51
- coze-dev deploy [--lane <ppe_lane>] code deploy [--source-root <directory>] [--app-id <app_id>] [--application-type <type>] [--name <name>] [--connector-id <id>]
52
- coze-dev deploy code deploy status|list|online|rollback-check|cancel|rollback|stop|resume|pause
53
- coze-dev deploy code deploy logs|log-count|count|build-log|config
54
- coze-dev deploy code domain list [--unit-type dev|prod]
55
- coze-dev deploy code domain add <domain>
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
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
58
67
  ```
59
68
 
60
- `code app list` 是真分页:一次只返回一页(`--page-size` 默认 20、上限 100),`has_more` 为真时用返回的 `next_page_token` 取下一页;要一次拿到名下全部应用用 `--all`,它会自己翻到底。
69
+ `app list` 是真分页:一次只返回一页(`--page-size` 默认 20、上限 100),`has_more` 为真时用返回的 `next_page_token` 取下一页;要一次拿到名下全部应用用 `--all`,它会自己翻到底。
61
70
 
62
71
  部署确认阶段不传 `--yes`;确认后使用相同参数增加 `--yes`,需要等待终态时再增加
63
72
  `--wait`。CLI 会为每次请求自动生成一个 40 位十六进制源码快照 ID,用于兼容 V2 接口的
@@ -85,15 +94,16 @@ Pages 首次部署没有 `app_id`,必须显式指定交付类型。Pages 将
85
94
  执行 `deploy.build`,并要求最终产出 `out/index.html`:
86
95
 
87
96
  ```bash
88
- coze-dev deploy code deploy --source-root . --application-type pages
89
- coze-dev deploy code deploy --source-root . --application-type pages --yes --wait
97
+ coze-dev deploy --source-root . --application-type pages
98
+ coze-dev deploy --source-root . --application-type pages --yes --wait
90
99
  ```
91
100
 
92
101
  创建成功后 CLI 会把 Pages Application 写入 `.coze`;后续可继续传
93
102
  `--application-type pages` 自动复用,或显式传 `--app-id`。
94
103
 
95
104
  V2 接口的所有参数均通过 POST JSON body 发送,不会放入 URL。确认非 Pages 部署后,CLI
96
- 会执行 `.coze` 中可选的 `dev.pack` 命令,将
105
+ 会执行 `.coze` 中可选的 `dev.pack` 命令;原生 Windows 优先执行非空的
106
+ `dev.pack_win`,未配置时回退 `dev.pack`。该步骤将
97
107
  本地部署内容打成无根目录的 `tar.gz`,再通过 `source_package_base64` 上传。Pages 部署
98
108
  统一上传源码根目录:已有 `index.html` 时服务端跳过构建,没有时由服务端按 Snapshot 中的
99
109
  `.coze deploy.build` 构建。打包由 CLI 自带的 Node.js 脚本执行,并排除 `.coze`、`.env`、
@@ -108,21 +118,28 @@ V2 接口的所有参数均通过 POST JSON body 发送,不会放入 URL。确
108
118
  通过 `app_id` 查看当前线上版本的环境变量及快照状态:
109
119
 
110
120
  ```bash
111
- coze-dev deploy code env list
112
- coze-dev deploy code env list --app-id 7672644451805691910
121
+ coze-dev deploy env list
122
+ coze-dev deploy env list --app-id 7672644451805691910
113
123
  ```
114
124
 
115
125
  小程序部署可重复指定渠道:微信为 `10000127`,抖音为 `10000126`:
116
126
 
117
127
  ```bash
118
- coze-dev deploy code deploy --source-root . --application-type mini_program \
128
+ coze-dev deploy --source-root . --application-type mini_program \
119
129
  --connector-id 10000127 --yes --wait
120
130
  ```
121
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
+
122
139
  绑定小程序 AppID 时,默认从源码目录 `.coze [project]` 读取该目录的 `project_id`:
123
140
 
124
141
  ```bash
125
- coze-dev deploy code mini-program bind \
142
+ coze-dev deploy mini-program bind \
126
143
  --platform wechat \
127
144
  --mini-app-id wx123 \
128
145
  --redirect-url https://code.coze.cn/coding/auth/callback/miniprogram
@@ -131,34 +148,34 @@ coze-dev deploy code mini-program bind \
131
148
  返回 `bind_status=1` 时,打开 `need_authorize_data.auth_url` 完成授权。回调页会自动
132
149
  提交授权码;无回调页的调用方也可使用 `mini-program submit-code` 手动提交。
133
150
 
134
- `code deploy status` 和 `list` 会返回 `deploy_detail[].deploy_log_key`。只有一个日志
135
- key 时,`code deploy build-log --deploy-id <id>` 会自动解析;存在多个 key 时按错误
151
+ `deploy status` 和 `list` 会返回 `deploy_detail[].deploy_log_key`。只有一个日志
152
+ key 时,`deploy build-log --deploy-id <id>` 会自动解析;存在多个 key 时按错误
136
153
  详情中的 `available_keys` 选择一个并传 `--key`。
137
154
 
138
155
  应用维度的管理和观测命令均支持 `--app-id`;省略时从当前目录的 `.coze [project]` 读取:
139
156
 
140
157
  ```bash
141
- coze-dev deploy code app rename "新应用名称" --app-id <app_id> --yes
142
- coze-dev deploy code deploy online --app-id <app_id>
143
- coze-dev deploy code deploy rollback-check --app-id <app_id> --deploy-id <history_id>
144
- coze-dev deploy code deploy log-count --app-id <app_id>
145
- coze-dev deploy code deploy count --app-id <app_id>
146
- coze-dev deploy code app metrics --app-id <app_id> --time-range week
147
- coze-dev deploy code app usage --app-id <app_id> --bill-month 2026-08
148
- coze-dev deploy code domain list --app-id <app_id> --unit-type dev
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
149
166
  ```
150
167
 
151
168
  `domain list` 默认查询 Prod 域名;传 `--unit-type dev` 查询开发态预览域名。
152
169
  审核 Unit 是内部流水线槽位,不支持从 CLI 查询。
153
170
 
154
- `code domain set-prefix` 改的是**系统分配的默认域名**(`<prefix>.coze.site`)里的 prefix,
155
- 后缀不变;`code domain add` 加进来的自定义域名不受影响 —— 那类域名服务端只有 create/delete,
171
+ `domain set-prefix` 改的是**系统分配的默认域名**(`<prefix>.coze.site`)里的 prefix,
172
+ 后缀不变;`domain add` 加进来的自定义域名不受影响 —— 那类域名服务端只有 create/delete,
156
173
  域名串本身改不了。改完旧默认域名立刻不再指向本应用,已经发出去的链接会失效,所以必须传 `--yes`。
157
174
  前缀的长度、保留词、是否被占用由服务端判定,CLI 只拦形态明显不合法的值(大写、首尾连字符等)。
158
175
  这是**权益能力**:账号没有对应权益时服务端会直接拒绝。
159
176
 
160
- `code app delete` 删除应用,终态不可撤销,必须传 `--yes`。服务端**只接受已停服的应用**:
161
- 仍在服务时会返回一条带当前状态的错误,先跑 `code deploy stop --yes` 再删。CLI 不会替你先停 ——
177
+ `app delete` 删除应用,终态不可撤销,必须传 `--yes`。服务端**只接受已停服的应用**:
178
+ 仍在服务时会返回一条带当前状态的错误,先跑 `deploy stop --yes` 再删。CLI 不会替你先停 ——
162
179
  停服会真的把线上服务摘掉,那一步要由你自己确认。删除会一并停掉该应用名下的部署单元、
163
180
  软删它的域名并清理残留的函数;已删除的应用再删一次是幂等成功。删完记得把 `.coze [project]`
164
- 里的 `app_id` 去掉,否则同目录下一次 `code deploy` 会打到这个已删除的应用上被服务端拒。
181
+ 里的 `app_id` 去掉,否则同目录下一次 `deploy` 会打到这个已删除的应用上被服务端拒。
@@ -10,12 +10,18 @@ mkdir -p "$LOG_DIR"
10
10
  # ==================== 配置项 ====================
11
11
  # Server 服务配置
12
12
  SERVER_HOST="0.0.0.0"
13
- SERVER_PORT="${SERVER_PORT:-9091}"
13
+ SERVER_PORT="${SERVER_PORT:-<%= serverPort %>}"
14
14
  # Expo 项目配置
15
15
  EXPO_HOST="0.0.0.0"
16
16
  EXPO_DIR="expo"
17
- EXPO_PORT="${EXPO_PORT:-5000}"
18
- WEB_URL="${COZE_PROJECT_DOMAIN_DEFAULT:-http://127.0.0.1:${SERVER_PORT}}"
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
19
25
  ASSUME_YES="1"
20
26
  EXPO_PUBLIC_BACKEND_BASE_URL="${EXPO_PUBLIC_BACKEND_BASE_URL:-$WEB_URL}"
21
27
  EXPO_PUBLIC_COZE_PROJECT_ID="${COZE_PROJECT_ID:-}"
@@ -116,14 +122,41 @@ wait_port_connectable() {
116
122
  return 1
117
123
  }
118
124
 
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
+
119
150
  # coze-daemon 会在 runtime shell 退出时清理原进程组。
120
151
  # 通过 Node detached spawn 创建独立 session/进程组,并将 stdio 直接写入日志。
152
+ # 返回的 PID 是 wrapper 的,同时也是整个进程组的 PGID,后续按组回收。
121
153
  spawn_detached() {
122
154
  local cwd="$1"
123
155
  local log_file="$2"
124
156
  shift 2
125
157
 
126
- node - "$cwd" "$log_file" "$@" <<'NODE'
158
+ node - "$cwd" "$log_file" \
159
+ /bin/bash -c "${RUN_WITH_TIMEOUT}" detached-runner "${MAX_RUNTIME_SECONDS}" "$@" <<'NODE'
127
160
  const fs = require('node:fs');
128
161
  const { spawn } = require('node:child_process');
129
162
 
@@ -257,6 +290,7 @@ if [ -z "${EXPO_PID}" ]; then
257
290
  fi
258
291
 
259
292
  echo "所有服务已启动。Server PID: ${SERVER_PID}, Expo PID: ${EXPO_PID}"
293
+ echo "两个服务均在 ${MAX_RUNTIME_SECONDS}s 后自动退出。"
260
294
 
261
295
  echo "检查 Server 服务端口:$SERVER_HOST:$SERVER_PORT"
262
296
  if wait_port_connectable "$SERVER_HOST" "$SERVER_PORT" 10 2; then
@@ -5,7 +5,7 @@ set -euo pipefail
5
5
  ROOT_DIR="$(pwd)"
6
6
 
7
7
  HOST="${HOST:-0.0.0.0}"
8
- PORT="${PORT:-5000}"
8
+ PORT="${DEPLOY_RUN_PORT:-${PORT:-<%= port %>}}"
9
9
 
10
10
  # ==================== 工具函数 ====================
11
11
  info() {
@@ -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:-9091}"
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 BACKEND_TARGET = 'http://localhost:9091';
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.24
273
- version: 0.7.24(openai@6.16.0(ws@8.19.0)(zod@4.3.6))(ws@8.19.0)
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.24:
2647
- resolution: {integrity: sha512-oL9Tg5PwxP6iMixonzzMO4aBjOKWcFUMVM+iz5dPyaqQkG84HP1y9DqK5DJVmtdfJuYdAW7pzOatDqLvgvZiXg==}
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.24(openai@6.16.0(ws@8.19.0)(zod@4.3.6))(ws@8.19.0):
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:-5000} node dist/index.js",
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.24",
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",
@@ -2,7 +2,7 @@ import express from "express";
2
2
  import cors from "cors";
3
3
 
4
4
  const app = express();
5
- const port = process.env.PORT || 9091;
5
+ const port = process.env.PORT || <%= serverPort %>;
6
6
 
7
7
  // Middleware
8
8
  app.use(cors());
@@ -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: 8081,
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: 9090,
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"]
@@ -0,0 +1,7 @@
1
+ $ErrorActionPreference = "Stop"
2
+
3
+ $port = if ($env:DEPLOY_RUN_PORT) { $env:DEPLOY_RUN_PORT } else { "8000" }
4
+
5
+ Write-Host "Starting static server on port $port..."
6
+ & python -m http.server $port --bind 0.0.0.0
7
+ exit $LASTEXITCODE
@@ -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
@@ -47,7 +47,7 @@
47
47
  "class-variance-authority": "^0.7.1",
48
48
  "clsx": "^2.1.1",
49
49
  "cmdk": "^1.1.1",
50
- "coze-coding-dev-sdk": "^0.7.16",
50
+ "coze-coding-dev-sdk": "^0.7.25-beta.8",
51
51
  "date-fns": "^4.1.0",
52
52
  "dotenv": "^17.2.3",
53
53
  "drizzle-kit": "^0.31.8",
@@ -56,7 +56,7 @@
56
56
  "embla-carousel-react": "^8.6.0",
57
57
  "input-otp": "^1.4.2",
58
58
  "lucide-react": "^0.468.0",
59
- "next": "16.1.1",
59
+ "next": "16.3.3",
60
60
  "next-themes": "^0.4.6",
61
61
  "pg": "^8.16.3",
62
62
  "react": "19.2.3",
@@ -80,7 +80,7 @@
80
80
  "@types/react": "^19",
81
81
  "@types/react-dom": "^19",
82
82
  "eslint": "^9",
83
- "eslint-config-next": "16.1.1",
83
+ "eslint-config-next": "16.3.3",
84
84
  "only-allow": "^1.2.2",
85
85
  "react-dev-inspector": "^2.0.1",
86
86
  "shadcn": "latest",