@coze-arch/cli 0.0.38-alpha.da33e3 → 0.0.39-alpha.bdff32

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 (168) hide show
  1. package/README.md +69 -104
  2. package/docs/deploy.md +181 -0
  3. package/lib/__templates__/expo/.coze +5 -0
  4. package/lib/__templates__/expo/.cozeproj/scripts/dev_build.ps1 +10 -0
  5. package/lib/__templates__/expo/.cozeproj/scripts/dev_build.sh +4 -0
  6. package/lib/__templates__/expo/.cozeproj/scripts/dev_run.ps1 +74 -0
  7. package/lib/__templates__/expo/.cozeproj/scripts/dev_run.sh +108 -19
  8. package/lib/__templates__/expo/.cozeproj/scripts/prod_build.ps1 +15 -0
  9. package/lib/__templates__/expo/.cozeproj/scripts/prod_run.ps1 +10 -0
  10. package/lib/__templates__/expo/.cozeproj/scripts/prod_run.sh +1 -1
  11. package/lib/__templates__/expo/.cozeproj/scripts/server_dev_run.sh +1 -1
  12. package/lib/__templates__/expo/.cozeproj/scripts/validate.ps1 +7 -0
  13. package/lib/__templates__/expo/client/metro.config.js +3 -1
  14. package/lib/__templates__/expo/pnpm-lock.yaml +5 -5
  15. package/lib/__templates__/expo/server/package.json +2 -2
  16. package/lib/__templates__/expo/server/src/index.ts +1 -1
  17. package/lib/__templates__/expo/template.config.js +11 -2
  18. package/lib/__templates__/native-static/.coze +4 -2
  19. package/lib/__templates__/native-static/scripts/serve.ps1 +7 -0
  20. package/lib/__templates__/nextjs/.coze +5 -0
  21. package/lib/__templates__/nextjs/package.json +2 -2
  22. package/lib/__templates__/nextjs/pnpm-lock.yaml +54 -54
  23. package/lib/__templates__/nextjs/scripts/build.ps1 +16 -0
  24. package/lib/__templates__/nextjs/scripts/dev.ps1 +63 -0
  25. package/lib/__templates__/nextjs/scripts/dev.sh +234 -7
  26. package/lib/__templates__/nextjs/scripts/prepare.ps1 +18 -0
  27. package/lib/__templates__/nextjs/scripts/start.ps1 +11 -0
  28. package/lib/__templates__/nextjs/scripts/validate.ps1 +8 -0
  29. package/lib/__templates__/nextjs/template.config.js +4 -2
  30. package/lib/__templates__/nuxt-vue/.coze +5 -0
  31. package/lib/__templates__/nuxt-vue/package.json +1 -1
  32. package/lib/__templates__/nuxt-vue/pnpm-lock.yaml +5 -5
  33. package/lib/__templates__/nuxt-vue/scripts/build.ps1 +12 -0
  34. package/lib/__templates__/nuxt-vue/scripts/dev.ps1 +63 -0
  35. package/lib/__templates__/nuxt-vue/scripts/dev.sh +232 -3
  36. package/lib/__templates__/nuxt-vue/scripts/prepare.ps1 +12 -0
  37. package/lib/__templates__/nuxt-vue/scripts/start.ps1 +11 -0
  38. package/lib/__templates__/nuxt-vue/scripts/validate.ps1 +8 -0
  39. package/lib/__templates__/phaser/.coze +18 -0
  40. package/lib/__templates__/phaser/README.md +45 -0
  41. package/lib/__templates__/phaser/_gitignore +23 -0
  42. package/lib/__templates__/phaser/_npmrc +14 -0
  43. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0001.png +0 -0
  44. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0002.png +0 -0
  45. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0003.png +0 -0
  46. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0004.png +0 -0
  47. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0005.png +0 -0
  48. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0006.png +0 -0
  49. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0007.png +0 -0
  50. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0008.png +0 -0
  51. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0009.png +0 -0
  52. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0010.png +0 -0
  53. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0011.png +0 -0
  54. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0012.png +0 -0
  55. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0013.png +0 -0
  56. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0014.png +0 -0
  57. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0015.png +0 -0
  58. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0016.png +0 -0
  59. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0017.png +0 -0
  60. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0018.png +0 -0
  61. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0019.png +0 -0
  62. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0020.png +0 -0
  63. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0021.png +0 -0
  64. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0022.png +0 -0
  65. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0023.png +0 -0
  66. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/frame_0024.png +0 -0
  67. package/lib/__templates__/phaser/assets/image_sequence/coze-game-loading/manifest.json +11 -0
  68. package/lib/__templates__/phaser/debug-runtime/flow-graph.json +20 -0
  69. package/lib/__templates__/phaser/index.html +12 -0
  70. package/lib/__templates__/phaser/package.json +31 -0
  71. package/lib/__templates__/phaser/pnpm-lock.yaml +661 -0
  72. package/lib/__templates__/phaser/scripts/build.ps1 +12 -0
  73. package/lib/__templates__/phaser/scripts/build.sh +8 -0
  74. package/lib/__templates__/phaser/scripts/dev.ps1 +49 -0
  75. package/lib/__templates__/phaser/scripts/dev.sh +82 -0
  76. package/lib/__templates__/phaser/scripts/prepare.ps1 +8 -0
  77. package/lib/__templates__/phaser/scripts/prepare.sh +7 -0
  78. package/lib/__templates__/phaser/scripts/spawn-detached.cjs +29 -0
  79. package/lib/__templates__/phaser/scripts/start.ps1 +49 -0
  80. package/lib/__templates__/phaser/scripts/start.sh +82 -0
  81. package/lib/__templates__/phaser/scripts/validate.ps1 +7 -0
  82. package/lib/__templates__/phaser/scripts/validate.sh +7 -0
  83. package/lib/__templates__/phaser/src/assets.ts +15 -0
  84. package/lib/__templates__/phaser/src/global.d.ts +39 -0
  85. package/lib/__templates__/phaser/src/main.ts +28 -0
  86. package/lib/__templates__/phaser/src/scene/BootScene.ts +213 -0
  87. package/lib/__templates__/phaser/src/scene/DevLoadingScene.ts +69 -0
  88. package/lib/__templates__/phaser/src/style.css +28 -0
  89. package/lib/__templates__/phaser/src/types.ts +32 -0
  90. package/lib/__templates__/phaser/src/utils/asset-loader.ts +319 -0
  91. package/lib/__templates__/phaser/src/utils/index.ts +2 -0
  92. package/lib/__templates__/phaser/src/utils/mark-editable.ts +13 -0
  93. package/lib/__templates__/phaser/template.config.js +43 -0
  94. package/lib/__templates__/phaser/tsconfig.json +23 -0
  95. package/lib/__templates__/phaser/vite.config.ts +96 -0
  96. package/lib/__templates__/phaser-static/.coze +15 -0
  97. package/lib/__templates__/phaser-static/README.md +40 -0
  98. package/lib/__templates__/phaser-static/_gitignore +6 -0
  99. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0001.png +0 -0
  100. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0002.png +0 -0
  101. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0003.png +0 -0
  102. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0004.png +0 -0
  103. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0005.png +0 -0
  104. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0006.png +0 -0
  105. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0007.png +0 -0
  106. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0008.png +0 -0
  107. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0009.png +0 -0
  108. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0010.png +0 -0
  109. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0011.png +0 -0
  110. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0012.png +0 -0
  111. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0013.png +0 -0
  112. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0014.png +0 -0
  113. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0015.png +0 -0
  114. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0016.png +0 -0
  115. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0017.png +0 -0
  116. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0018.png +0 -0
  117. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0019.png +0 -0
  118. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0020.png +0 -0
  119. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0021.png +0 -0
  120. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0022.png +0 -0
  121. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0023.png +0 -0
  122. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/frame_0024.png +0 -0
  123. package/lib/__templates__/phaser-static/assets/image_sequence/coze-game-loading/manifest.json +11 -0
  124. package/lib/__templates__/phaser-static/debug-runtime/flow-graph.json +20 -0
  125. package/lib/__templates__/phaser-static/index.html +17 -0
  126. package/lib/__templates__/phaser-static/scripts/serve.ps1 +7 -0
  127. package/lib/__templates__/phaser-static/src/assets.js +15 -0
  128. package/lib/__templates__/phaser-static/src/main.js +26 -0
  129. package/lib/__templates__/phaser-static/src/phaser.js +7 -0
  130. package/lib/__templates__/phaser-static/src/scene/BootScene.js +205 -0
  131. package/lib/__templates__/phaser-static/src/scene/DevLoadingScene.js +67 -0
  132. package/lib/__templates__/phaser-static/src/style.css +28 -0
  133. package/lib/__templates__/phaser-static/src/utils/asset-loader.js +267 -0
  134. package/lib/__templates__/phaser-static/src/utils/index.js +2 -0
  135. package/lib/__templates__/phaser-static/src/utils/mark-editable.js +3 -0
  136. package/lib/__templates__/phaser-static/template.config.js +35 -0
  137. package/lib/__templates__/pi-agent/package.json +1 -1
  138. package/lib/__templates__/pi-agent/pnpm-lock.yaml +5 -5
  139. package/lib/__templates__/taro/.coze +6 -0
  140. package/lib/__templates__/taro/.cozeproj/scripts/deploy_build.ps1 +10 -0
  141. package/lib/__templates__/taro/.cozeproj/scripts/deploy_run.ps1 +8 -0
  142. package/lib/__templates__/taro/.cozeproj/scripts/deploy_run.sh +1 -1
  143. package/lib/__templates__/taro/.cozeproj/scripts/dev_build.ps1 +3 -0
  144. package/lib/__templates__/taro/.cozeproj/scripts/dev_run.ps1 +62 -0
  145. package/lib/__templates__/taro/.cozeproj/scripts/dev_run.sh +178 -68
  146. package/lib/__templates__/taro/.cozeproj/scripts/pack.ps1 +7 -0
  147. package/lib/__templates__/taro/.cozeproj/scripts/validate.ps1 +7 -0
  148. package/lib/__templates__/taro/AGENTS.md +11 -7
  149. package/lib/__templates__/taro/README.md +4 -4
  150. package/lib/__templates__/taro/config/index.ts +10 -2
  151. package/lib/__templates__/taro/pnpm-lock.yaml +5 -5
  152. package/lib/__templates__/taro/server/package.json +1 -1
  153. package/lib/__templates__/taro/server/src/main.ts +8 -2
  154. package/lib/__templates__/templates.json +51 -1
  155. package/lib/__templates__/vite/.coze +5 -0
  156. package/lib/__templates__/vite/package.json +1 -1
  157. package/lib/__templates__/vite/pnpm-lock.yaml +5 -5
  158. package/lib/__templates__/vite/scripts/build.ps1 +16 -0
  159. package/lib/__templates__/vite/scripts/dev.ps1 +63 -0
  160. package/lib/__templates__/vite/scripts/dev.sh +110 -1
  161. package/lib/__templates__/vite/scripts/prepare.ps1 +18 -0
  162. package/lib/__templates__/vite/scripts/start.ps1 +11 -0
  163. package/lib/__templates__/vite/scripts/validate.ps1 +8 -0
  164. package/lib/__templates__/vite/template.config.js +4 -2
  165. package/lib/cli.js +3719 -211
  166. package/lib/deploy/package-project.js +244 -0
  167. package/lib/deploy/package-project.py +183 -0
  168. package/package.json +5 -2
@@ -0,0 +1,267 @@
1
+ import { AUDIOS, IMAGES, IMAGE_SEQUENCES, VIDEOS } from '../assets.js';
2
+
3
+ const FRAME_KEY_MARKER = ':frame:';
4
+ const MANIFEST_KEY_SUFFIX = ':manifest';
5
+
6
+ const getFrameKey = (assetKey, frameIndex) =>
7
+ assetKey +
8
+ FRAME_KEY_MARKER +
9
+ String(frameIndex + 1).padStart(4, '0');
10
+
11
+ const getManifestKey = assetKey => assetKey + MANIFEST_KEY_SUFFIX;
12
+
13
+ const getFrameSource = (directory, frameIndex) =>
14
+ directory + '/frame_' + String(frameIndex + 1).padStart(4, '0') + '.png';
15
+
16
+ export const resolveAssetUrl = source => new URL(source, document.baseURI).href;
17
+
18
+ const isImageSequenceManifest = value => {
19
+ if (!value || typeof value !== 'object') {
20
+ return false;
21
+ }
22
+
23
+ return (
24
+ value.type === 'image_sequence' &&
25
+ typeof value.name === 'string' &&
26
+ typeof value.properties?.fps === 'number' &&
27
+ typeof value.properties.frame_count === 'number' &&
28
+ value.properties.frame_count > 0
29
+ );
30
+ };
31
+
32
+ const getImageSequenceManifest = (scene, assetKey) => {
33
+ const manifest = scene.cache.json.get(getManifestKey(assetKey));
34
+ if (!isImageSequenceManifest(manifest)) {
35
+ throw new Error('Invalid image sequence manifest: ' + assetKey);
36
+ }
37
+
38
+ return manifest;
39
+ };
40
+
41
+ const queueImageSequenceFrames = (scene, assetKey, directory, manifest) => {
42
+ Array.from(
43
+ { length: manifest.properties.frame_count },
44
+ (_value, frameIndex) => {
45
+ scene.load.image(
46
+ getFrameKey(assetKey, frameIndex),
47
+ resolveAssetUrl(getFrameSource(directory, frameIndex)),
48
+ );
49
+ },
50
+ );
51
+ };
52
+
53
+ const queueImages = (scene, images) => {
54
+ Object.entries(images).forEach(([assetKey, source]) => {
55
+ scene.load.image(assetKey, resolveAssetUrl(source));
56
+ });
57
+ return Object.keys(images).length;
58
+ };
59
+
60
+ const queueVideos = (scene, videos) => {
61
+ Object.entries(videos).forEach(([assetKey, source]) => {
62
+ scene.load.video(assetKey, resolveAssetUrl(source));
63
+ });
64
+ return Object.keys(videos).length;
65
+ };
66
+
67
+ const queueAudios = (scene, audios) => {
68
+ Object.entries(audios).forEach(([assetKey, source]) => {
69
+ scene.load.audio(assetKey, resolveAssetUrl(source));
70
+ });
71
+ return Object.keys(audios).length;
72
+ };
73
+
74
+ const queueImageSequences = (scene, imageSequences) =>
75
+ Object.entries(imageSequences).reduce(
76
+ (fileCount, [assetKey, directory]) => {
77
+ const manifestKey = getManifestKey(assetKey);
78
+ const cachedManifest = scene.cache.json.get(manifestKey);
79
+
80
+ if (isImageSequenceManifest(cachedManifest)) {
81
+ queueImageSequenceFrames(scene, assetKey, directory, cachedManifest);
82
+ return fileCount + cachedManifest.properties.frame_count;
83
+ }
84
+
85
+ scene.load.once(
86
+ 'filecomplete-json-' + manifestKey,
87
+ (_key, _type, data) => {
88
+ if (!isImageSequenceManifest(data)) {
89
+ throw new Error('Invalid image sequence manifest: ' + assetKey);
90
+ }
91
+
92
+ queueImageSequenceFrames(scene, assetKey, directory, data);
93
+ },
94
+ );
95
+
96
+ scene.load.json(
97
+ manifestKey,
98
+ resolveAssetUrl(directory + '/manifest.json'),
99
+ );
100
+ return fileCount + 1;
101
+ },
102
+ 0,
103
+ );
104
+
105
+ export const loadAssets = (scene, collections) =>
106
+ queueImages(scene, collections.images ?? {}) +
107
+ queueImageSequences(scene, collections.imageSequences ?? {}) +
108
+ queueVideos(scene, collections.videos ?? {}) +
109
+ queueAudios(scene, collections.audios ?? {});
110
+
111
+ export const getImageSequenceRuntimeKeys = assetKey => ({
112
+ texture: getFrameKey(assetKey, 0),
113
+ animation: assetKey + ':animation',
114
+ });
115
+
116
+ export const getAssetKeyFromFileKey = fileKey =>
117
+ fileKey.split(FRAME_KEY_MARKER)[0]?.replace(MANIFEST_KEY_SUFFIX, '') ??
118
+ fileKey;
119
+
120
+ export const getAssetLabelFromFileKey = (fileKey, collections) => {
121
+ const assetKey = getAssetKeyFromFileKey(fileKey);
122
+
123
+ if (assetKey in (collections.images ?? {})) {
124
+ return '图片 ' + assetKey;
125
+ }
126
+ if (assetKey in (collections.imageSequences ?? {})) {
127
+ return '帧动画 ' + assetKey;
128
+ }
129
+ if (assetKey in (collections.videos ?? {})) {
130
+ return '视频 ' + assetKey;
131
+ }
132
+ if (assetKey in (collections.audios ?? {})) {
133
+ return '音频 ' + assetKey;
134
+ }
135
+
136
+ return assetKey;
137
+ };
138
+
139
+ export const registerImageSequenceAnimations = (scene, imageSequences) => {
140
+ Object.keys(imageSequences).forEach(assetKey => {
141
+ const manifest = getImageSequenceManifest(scene, assetKey);
142
+ const animationKey = getImageSequenceRuntimeKeys(assetKey).animation;
143
+ if (scene.anims.exists(animationKey)) {
144
+ return;
145
+ }
146
+
147
+ scene.anims.create({
148
+ key: animationKey,
149
+ frames: Array.from(
150
+ { length: manifest.properties.frame_count },
151
+ (_value, frameIndex) => ({ key: getFrameKey(assetKey, frameIndex) }),
152
+ ),
153
+ frameRate: manifest.properties.fps,
154
+ repeat: -1,
155
+ });
156
+ });
157
+ };
158
+
159
+ const findAsset = assetKey => {
160
+ const matches = [];
161
+
162
+ if (Object.hasOwn(IMAGES, assetKey)) {
163
+ matches.push({
164
+ collections: { images: { [assetKey]: IMAGES[assetKey] } },
165
+ loadedAsset: { kind: 'image', key: assetKey },
166
+ });
167
+ }
168
+ if (Object.hasOwn(IMAGE_SEQUENCES, assetKey)) {
169
+ matches.push({
170
+ collections: {
171
+ imageSequences: { [assetKey]: IMAGE_SEQUENCES[assetKey] },
172
+ },
173
+ loadedAsset: {
174
+ kind: 'image-sequence',
175
+ key: assetKey,
176
+ ...getImageSequenceRuntimeKeys(assetKey),
177
+ },
178
+ });
179
+ }
180
+ if (Object.hasOwn(VIDEOS, assetKey)) {
181
+ matches.push({
182
+ collections: { videos: { [assetKey]: VIDEOS[assetKey] } },
183
+ loadedAsset: { kind: 'video', key: assetKey },
184
+ });
185
+ }
186
+ if (Object.hasOwn(AUDIOS, assetKey)) {
187
+ matches.push({
188
+ collections: { audios: { [assetKey]: AUDIOS[assetKey] } },
189
+ loadedAsset: { kind: 'audio', key: assetKey },
190
+ });
191
+ }
192
+
193
+ if (matches.length === 0) {
194
+ throw new Error('Asset not found: ' + assetKey);
195
+ }
196
+ if (matches.length > 1) {
197
+ throw new Error('Duplicate asset key: ' + assetKey);
198
+ }
199
+
200
+ return matches[0];
201
+ };
202
+
203
+ const isAssetLoaded = (scene, loadedAsset) => {
204
+ switch (loadedAsset.kind) {
205
+ case 'image':
206
+ return scene.textures.exists(loadedAsset.key);
207
+ case 'image-sequence':
208
+ return scene.anims.exists(loadedAsset.animation);
209
+ case 'video':
210
+ return scene.cache.video.exists(loadedAsset.key);
211
+ case 'audio':
212
+ return scene.cache.audio.exists(loadedAsset.key);
213
+ default:
214
+ return false;
215
+ }
216
+ };
217
+
218
+ export const loadAsset = async (scene, assetKey) => {
219
+ const { collections, loadedAsset } = findAsset(assetKey);
220
+ if (isAssetLoaded(scene, loadedAsset)) {
221
+ return loadedAsset;
222
+ }
223
+
224
+ return new Promise((resolve, reject) => {
225
+ const cleanup = () => {
226
+ scene.load.off('complete', onComplete);
227
+ scene.load.off('loaderror', onLoadError);
228
+ };
229
+
230
+ const onComplete = () => {
231
+ cleanup();
232
+ try {
233
+ if (loadedAsset.kind === 'image-sequence') {
234
+ registerImageSequenceAnimations(
235
+ scene,
236
+ collections.imageSequences ?? {},
237
+ );
238
+ }
239
+ resolve(loadedAsset);
240
+ } catch (error) {
241
+ reject(error);
242
+ }
243
+ };
244
+
245
+ const onLoadError = file => {
246
+ if (getAssetKeyFromFileKey(file.key) !== assetKey) {
247
+ return;
248
+ }
249
+
250
+ cleanup();
251
+ reject(new Error('Failed to load asset: ' + assetKey));
252
+ };
253
+
254
+ scene.load.once('complete', onComplete);
255
+ scene.load.on('loaderror', onLoadError);
256
+
257
+ try {
258
+ loadAssets(scene, collections);
259
+ if (!scene.load.isLoading()) {
260
+ scene.load.start();
261
+ }
262
+ } catch (error) {
263
+ cleanup();
264
+ reject(error);
265
+ }
266
+ });
267
+ };
@@ -0,0 +1,2 @@
1
+ export * from './asset-loader.js';
2
+ export * from './mark-editable.js';
@@ -0,0 +1,3 @@
1
+ export const markEditable = (locator, gameObject, options) =>
2
+ window.PhaserBridge?.markEditable?.(locator, gameObject, options) ??
3
+ gameObject;
@@ -0,0 +1,35 @@
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+ export const paramsSchema = {
10
+ type: 'object',
11
+ properties: {
12
+ appName: {
13
+ type: 'string',
14
+ minLength: 1,
15
+ pattern: '^[a-z0-9-]+$',
16
+ description:
17
+ 'Application name (lowercase, alphanumeric and hyphens only)',
18
+ },
19
+ },
20
+ required: [],
21
+ additionalProperties: false,
22
+ };
23
+
24
+ const config = {
25
+ description:
26
+ 'Phaser Static(纯静态 2D 游戏):coze-dev init ${COZE_WORKSPACE_PATH} --template phaser-static\n' +
27
+ '- 适用:浏览器原生 JavaScript ESM 的 Phaser 3 游戏。\n' +
28
+ '- Phaser 与 Phaser Bridge 从 CDN 加载;无需 npm、Vite 或 TypeScript。',
29
+ paramsSchema,
30
+ defaultParams: {
31
+ appName: 'phaser-static-game',
32
+ },
33
+ };
34
+
35
+ export default config;
@@ -22,7 +22,7 @@
22
22
  "@mariozechner/pi-ai": "^0.63.2",
23
23
  "@mariozechner/pi-coding-agent": "^0.63.2",
24
24
  "@sinclair/typebox": "^0.34.48",
25
- "coze-coding-dev-sdk": "^0.7.17",
25
+ "coze-coding-dev-sdk": "^0.7.25",
26
26
  "@radix-ui/react-select": "^2.2.6",
27
27
  "@radix-ui/react-slot": "^1.2.4",
28
28
  "@streamdown/code": "^1.1.1",
@@ -36,8 +36,8 @@ importers:
36
36
  specifier: ^2.1.1
37
37
  version: 2.1.1
38
38
  coze-coding-dev-sdk:
39
- specifier: ^0.7.17
40
- version: 0.7.20(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0)
39
+ specifier: ^0.7.25
40
+ version: 0.7.25(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0)
41
41
  express:
42
42
  specifier: ^4.21.2
43
43
  version: 4.22.1
@@ -2085,8 +2085,8 @@ packages:
2085
2085
  cose-base@2.2.0:
2086
2086
  resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==}
2087
2087
 
2088
- coze-coding-dev-sdk@0.7.20:
2089
- resolution: {integrity: sha512-f3UeZcYB/udyWrlFrsOViM47PCW+Nk0I4FcXEGzcjEfaQsa1CPBpf/y5UbBM6GIZ1v+lnuh/MiBlAaALFeMTqw==}
2088
+ coze-coding-dev-sdk@0.7.25:
2089
+ resolution: {integrity: sha512-5683ngikMdsRW0slGTE2OAZ1Fyj0lhkC4fGNOwsqKc35e68/gtg9KmmtK9CK9SZ+5/oIn/4wLoHXFB0gHJtO2A==}
2090
2090
  engines: {node: '>=18.0.0'}
2091
2091
  hasBin: true
2092
2092
 
@@ -6120,7 +6120,7 @@ snapshots:
6120
6120
  dependencies:
6121
6121
  layout-base: 2.0.1
6122
6122
 
6123
- coze-coding-dev-sdk@0.7.20(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0):
6123
+ coze-coding-dev-sdk@0.7.25(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0):
6124
6124
  dependencies:
6125
6125
  '@langchain/core': 1.1.40(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0)
6126
6126
  '@langchain/openai': 1.4.3(@langchain/core@1.1.40(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0))(ws@8.20.0)
@@ -5,12 +5,18 @@ project_type = "miniprogram"
5
5
 
6
6
  [dev]
7
7
  build = ["bash", ".cozeproj/scripts/dev_build.sh"]
8
+ build_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", ".cozeproj/scripts/dev_build.ps1"]
8
9
  run = ["bash", ".cozeproj/scripts/dev_run.sh"]
10
+ run_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", ".cozeproj/scripts/dev_run.ps1"]
9
11
  deps = ["git"] # -> apt install git
10
12
  pack = ["bash", ".cozeproj/scripts/pack.sh"]
13
+ pack_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", ".cozeproj/scripts/pack.ps1"]
11
14
  validate = ["bash", ".cozeproj/scripts/validate.sh"]
15
+ validate_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", ".cozeproj/scripts/validate.ps1"]
12
16
 
13
17
  [deploy]
14
18
  build = ["bash", ".cozeproj/scripts/deploy_build.sh"]
19
+ build_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", ".cozeproj/scripts/deploy_build.ps1"]
15
20
  run = ["bash", ".cozeproj/scripts/deploy_run.sh"]
21
+ run_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", ".cozeproj/scripts/deploy_run.ps1"]
16
22
  deps = ["git"] # -> apt install git
@@ -0,0 +1,10 @@
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
+ & pnpm install
7
+ if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
8
+
9
+ & pnpm build
10
+ exit $LASTEXITCODE
@@ -0,0 +1,8 @@
1
+ $ErrorActionPreference = "Stop"
2
+
3
+ $workspace = if ($env:COZE_WORKSPACE_PATH) { $env:COZE_WORKSPACE_PATH } else { (Get-Location).Path }
4
+ $port = if ($env:DEPLOY_RUN_PORT) { $env:DEPLOY_RUN_PORT } else { <%= serverPort %> }
5
+
6
+ Set-Location (Join-Path $workspace "server/dist")
7
+ & node ./main.js -p "$port"
8
+ exit $LASTEXITCODE
@@ -4,7 +4,7 @@ set -Eeuo pipefail
4
4
  start_service() {
5
5
  cd "${COZE_WORKSPACE_PATH}/server/dist"
6
6
 
7
- local port="${DEPLOY_RUN_PORT:-3000}"
7
+ local port="${DEPLOY_RUN_PORT:-<%= serverPort %>}"
8
8
  echo "Starting Static File Server on port ${port} for deploy..."
9
9
 
10
10
  node ./main.js -p "${port}"
@@ -0,0 +1,3 @@
1
+ $ErrorActionPreference = "Stop"
2
+
3
+ Write-Host "Taro development build does not require a separate step."
@@ -0,0 +1,62 @@
1
+ $ErrorActionPreference = "Stop"
2
+
3
+ function Stop-ProcessTree([int] $processId) {
4
+ if ($processId -gt 0 -and (Get-Process -Id $processId -ErrorAction SilentlyContinue)) {
5
+ & taskkill.exe /PID $processId /T /F *> $null
6
+ }
7
+ }
8
+
9
+ function Stop-ListeningProcess([int] $port) {
10
+ Get-NetTCPConnection -LocalPort $port -State Listen -ErrorAction SilentlyContinue |
11
+ Select-Object -ExpandProperty OwningProcess -Unique |
12
+ ForEach-Object { Stop-ProcessTree $_ }
13
+ }
14
+
15
+ function Start-DevProcess([string] $workingDirectory, [string] $logFile, [hashtable] $environment) {
16
+ $previousEnvironment = @{}
17
+ foreach ($key in $environment.Keys) {
18
+ $previousEnvironment[$key] = [Environment]::GetEnvironmentVariable($key, 'Process')
19
+ [Environment]::SetEnvironmentVariable($key, $environment[$key], 'Process')
20
+ }
21
+
22
+ try {
23
+ return Start-Process -FilePath "pnpm.cmd" -ArgumentList @("dev") -WorkingDirectory $workingDirectory -RedirectStandardOutput $logFile -RedirectStandardError "$logFile.error" -PassThru
24
+ } finally {
25
+ foreach ($key in $environment.Keys) {
26
+ [Environment]::SetEnvironmentVariable($key, $previousEnvironment[$key], 'Process')
27
+ }
28
+ }
29
+ }
30
+
31
+ $workspace = if ($env:COZE_WORKSPACE_PATH) { $env:COZE_WORKSPACE_PATH } else { (Get-Location).Path }
32
+ $port = if ($env:DEPLOY_RUN_PORT) { [int] $env:DEPLOY_RUN_PORT } elseif ($env:PORT) { [int] $env:PORT } else { <%= port %> }
33
+ $serverPort = if ($env:SERVER_PORT) { [int] $env:SERVER_PORT } else { <%= serverPort %> }
34
+ $logDirectory = if ($env:COZE_LOG_DIR) { $env:COZE_LOG_DIR } else { Join-Path $workspace "logs" }
35
+ $logFile = Join-Path $logDirectory "dev.log"
36
+ $pidFile = Join-Path $logDirectory "dev.pid"
37
+ New-Item -ItemType Directory -Force -Path $logDirectory | Out-Null
38
+
39
+ if (Test-Path $pidFile) {
40
+ Stop-ProcessTree ([int] (Get-Content $pidFile -Raw))
41
+ Remove-Item $pidFile -Force
42
+ }
43
+ Stop-ListeningProcess $port
44
+ Stop-ListeningProcess $serverPort
45
+
46
+ $environment = @{ PORT = "$port"; SERVER_PORT = "$serverPort" }
47
+ if ($env:COZE_PROJECT_DOMAIN_DEFAULT) {
48
+ $environment.PROJECT_DOMAIN = $env:COZE_PROJECT_DOMAIN_DEFAULT
49
+ }
50
+
51
+ $process = Start-DevProcess $workspace $logFile $environment
52
+ $process.Id | Set-Content $pidFile
53
+ Start-Sleep -Seconds 1
54
+ if ($process.HasExited) {
55
+ Get-Content "$logFile.error" -Tail 20 -ErrorAction SilentlyContinue
56
+ Remove-Item $pidFile -Force -ErrorAction SilentlyContinue
57
+ exit 1
58
+ }
59
+
60
+ Write-Host "Taro H5 and NestJS services started. PID: $($process.Id)"
61
+ Write-Host "Web port: $port; server port: $serverPort"
62
+ Write-Host "Log file: $logFile"