evomeme 0.1.10-beta.3 → 0.1.10-beta.8

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 (103) hide show
  1. package/README.md +2 -0
  2. package/dist/canvas-public/features/editing/perfect-pixel.js +55 -92
  3. package/dist/canvas-public/vendor/pixi.min.js +166 -131
  4. package/dist/{canvas-public/workers/perfect-pixel-worker.js → image-workers/perfect-pixel/perfect-pixel-core.js} +3 -72
  5. package/dist/image-workers/perfect-pixel/perfect-pixel-worker.cjs +10 -0
  6. package/dist/index.js +8932 -3496
  7. package/dist/skills/en-US/evomeme-cloud-fs/SKILL.md +6 -0
  8. package/dist/skills/en-US/evomeme-cover/SKILL.md +1 -1
  9. package/dist/skills/en-US/evomeme-login/SKILL.md +5 -0
  10. package/dist/skills/en-US/game-asset-align/SKILL.md +6 -4
  11. package/dist/skills/en-US/game-asset-align/references/blender-scene-pipeline.md +7 -17
  12. package/dist/skills/en-US/game-asset-align/references/canonical-package.md +1 -1
  13. package/dist/skills/en-US/game-asset-align/references/lightweight-review.md +7 -5
  14. package/dist/skills/en-US/game-asset-align/references/repair-policy.md +2 -2
  15. package/dist/skills/en-US/game-asset-align/references/tool-contract.md +47 -17
  16. package/dist/skills/en-US/game-asset-batch-generator/SKILL.md +117 -0
  17. package/dist/skills/en-US/game-asset-batch-generator/agents/openai.yaml +7 -0
  18. package/dist/skills/en-US/game-asset-image-generator/SKILL.md +28 -6
  19. package/dist/skills/en-US/game-asset-image-generator/references/background.md +3 -1
  20. package/dist/skills/en-US/game-asset-image-generator/references/static-game-assets.md +1 -1
  21. package/dist/skills/en-US/game-asset-mesh-generator/SKILL.md +77 -0
  22. package/dist/skills/en-US/game-asset-mesh-generator/agents/openai.yaml +7 -0
  23. package/dist/skills/en-US/game-asset-mesh-generator/references/animation-presets.md +312 -0
  24. package/dist/skills/en-US/game-asset-mesh-generator/references/image-generator-workflows.md +65 -0
  25. package/dist/skills/en-US/game-asset-mesh-generator/references/threejs-integration.md +113 -0
  26. package/dist/skills/en-US/game-asset-mesh-generator/references/tool-reference.md +96 -0
  27. package/dist/skills/en-US/game-audio/SKILL.md +47 -14
  28. package/dist/skills/en-US/game-audio/agents/openai.yaml +2 -2
  29. package/dist/skills/en-US/game-character-view-generator/SKILL.md +110 -0
  30. package/dist/skills/en-US/game-character-view-generator/agents/openai.yaml +7 -0
  31. package/dist/skills/en-US/game-image-layer-decomposer/SKILL.md +99 -0
  32. package/dist/skills/en-US/game-image-layer-decomposer/agents/openai.yaml +7 -0
  33. package/dist/skills/en-US/game-image-splitter/SKILL.md +114 -0
  34. package/dist/skills/en-US/game-image-splitter/agents/openai.yaml +7 -0
  35. package/dist/skills/en-US/game-perfect-pixel/SKILL.md +123 -0
  36. package/dist/skills/en-US/game-perfect-pixel/agents/openai.yaml +7 -0
  37. package/dist/skills/en-US/game-scroll-generator/SKILL.md +110 -0
  38. package/dist/skills/en-US/game-scroll-generator/agents/openai.yaml +7 -0
  39. package/dist/skills/en-US/game-tile-generator/SKILL.md +152 -0
  40. package/dist/skills/en-US/game-tile-generator/agents/openai.yaml +7 -0
  41. package/dist/skills/en-US/game-ui-generator/SKILL.md +82 -0
  42. package/dist/skills/en-US/game-ui-generator/agents/openai.yaml +7 -0
  43. package/dist/skills/en-US/game-ui-generator/references/component-patterns.md +65 -0
  44. package/dist/skills/en-US/game-ui-generator/references/runtime-integration.md +45 -0
  45. package/dist/skills/en-US/game-video-cycle/SKILL.md +98 -0
  46. package/dist/skills/en-US/game-video-cycle/agents/openai.yaml +7 -0
  47. package/dist/skills/en-US/game-video-generator/SKILL.md +78 -0
  48. package/dist/skills/en-US/game-video-generator/agents/openai.yaml +7 -0
  49. package/dist/skills/en-US/godot-3d-game/SKILL.md +4 -2
  50. package/dist/skills/en-US/godot-3d-game/references/alignment-gates.md +1 -1
  51. package/dist/skills/en-US/godot-3d-game/references/appearance-alignment.md +4 -2
  52. package/dist/skills/en-US/threejs-3d-game/SKILL.md +3 -3
  53. package/dist/skills/en-US/threejs-3d-game/references/engine-asset-pipeline.md +5 -3
  54. package/dist/skills/en-US/threejs-aaa-graphics-builder/SKILL.md +6 -6
  55. package/dist/skills/zh-CN/evomeme-cloud-fs/SKILL.md +7 -1
  56. package/dist/skills/zh-CN/evomeme-cover/SKILL.md +1 -1
  57. package/dist/skills/zh-CN/evomeme-login/SKILL.md +5 -0
  58. package/dist/skills/zh-CN/game-asset-align/SKILL.md +6 -4
  59. package/dist/skills/zh-CN/game-asset-align/references/blender-scene-pipeline.md +7 -17
  60. package/dist/skills/zh-CN/game-asset-align/references/canonical-package.md +1 -1
  61. package/dist/skills/zh-CN/game-asset-align/references/lightweight-review.md +7 -5
  62. package/dist/skills/zh-CN/game-asset-align/references/repair-policy.md +2 -2
  63. package/dist/skills/zh-CN/game-asset-align/references/tool-contract.md +48 -18
  64. package/dist/skills/zh-CN/game-asset-batch-generator/SKILL.md +117 -0
  65. package/dist/skills/zh-CN/game-asset-batch-generator/agents/openai.yaml +7 -0
  66. package/dist/skills/zh-CN/game-asset-image-generator/SKILL.md +28 -6
  67. package/dist/skills/zh-CN/game-asset-image-generator/references/background.md +3 -1
  68. package/dist/skills/zh-CN/game-asset-image-generator/references/static-game-assets.md +1 -1
  69. package/dist/skills/zh-CN/game-asset-mesh-generator/SKILL.md +77 -0
  70. package/dist/skills/zh-CN/game-asset-mesh-generator/agents/openai.yaml +7 -0
  71. package/dist/skills/zh-CN/game-asset-mesh-generator/references/animation-presets.md +312 -0
  72. package/dist/skills/zh-CN/game-asset-mesh-generator/references/image-generator-workflows.md +65 -0
  73. package/dist/skills/zh-CN/game-asset-mesh-generator/references/threejs-integration.md +113 -0
  74. package/dist/skills/zh-CN/game-asset-mesh-generator/references/tool-reference.md +96 -0
  75. package/dist/skills/zh-CN/game-audio/SKILL.md +47 -14
  76. package/dist/skills/zh-CN/game-audio/agents/openai.yaml +2 -2
  77. package/dist/skills/zh-CN/game-character-view-generator/SKILL.md +110 -0
  78. package/dist/skills/zh-CN/game-character-view-generator/agents/openai.yaml +7 -0
  79. package/dist/skills/zh-CN/game-image-layer-decomposer/SKILL.md +99 -0
  80. package/dist/skills/zh-CN/game-image-layer-decomposer/agents/openai.yaml +7 -0
  81. package/dist/skills/zh-CN/game-image-splitter/SKILL.md +114 -0
  82. package/dist/skills/zh-CN/game-image-splitter/agents/openai.yaml +7 -0
  83. package/dist/skills/zh-CN/game-perfect-pixel/SKILL.md +123 -0
  84. package/dist/skills/zh-CN/game-perfect-pixel/agents/openai.yaml +7 -0
  85. package/dist/skills/zh-CN/game-scroll-generator/SKILL.md +110 -0
  86. package/dist/skills/zh-CN/game-scroll-generator/agents/openai.yaml +7 -0
  87. package/dist/skills/zh-CN/game-tile-generator/SKILL.md +151 -0
  88. package/dist/skills/zh-CN/game-tile-generator/agents/openai.yaml +7 -0
  89. package/dist/skills/zh-CN/game-ui-generator/SKILL.md +82 -0
  90. package/dist/skills/zh-CN/game-ui-generator/agents/openai.yaml +7 -0
  91. package/dist/skills/zh-CN/game-ui-generator/references/component-patterns.md +65 -0
  92. package/dist/skills/zh-CN/game-ui-generator/references/runtime-integration.md +45 -0
  93. package/dist/skills/zh-CN/game-video-cycle/SKILL.md +98 -0
  94. package/dist/skills/zh-CN/game-video-cycle/agents/openai.yaml +7 -0
  95. package/dist/skills/zh-CN/game-video-generator/SKILL.md +78 -0
  96. package/dist/skills/zh-CN/game-video-generator/agents/openai.yaml +7 -0
  97. package/dist/skills/zh-CN/godot-3d-game/SKILL.md +4 -2
  98. package/dist/skills/zh-CN/godot-3d-game/references/alignment-gates.md +1 -1
  99. package/dist/skills/zh-CN/godot-3d-game/references/appearance-alignment.md +4 -2
  100. package/dist/skills/zh-CN/threejs-3d-game/SKILL.md +3 -3
  101. package/dist/skills/zh-CN/threejs-3d-game/references/engine-asset-pipeline.md +5 -3
  102. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/SKILL.md +6 -6
  103. package/package.json +2 -1
package/README.md CHANGED
@@ -5,6 +5,8 @@
5
5
 
6
6
  npm 包名:`evomeme`。用 `npx` 安装到 AI 工具后,即可在对话里做游戏、生图、提交草稿。
7
7
 
8
+ 本地 3D 资产工作流默认使用 `evomeme asset`、`evomeme scene export` 和 `evomeme stage`,详见 [资产 CLI 使用说明](../docs/asset-cli.md)。IDE 插件安装不等于全局安装 CLI:使用已发布且支持这些命令的 `npx -y evomeme@latest`,或本地构建后的 `node dist/index.js`;先执行 `asset --help` 检查能力。这 12 个资产/Stage MCP 入口已移除,对应操作使用 CLI;其余 20 个 MCP 工具继续可用。
9
+
8
10
  ---
9
11
 
10
12
  ## 一、这是什么?
@@ -3,7 +3,7 @@ import {
3
3
  peekFeatureState,
4
4
  notifyFeatureState,
5
5
  } from '../../core/feature-state.js'
6
- import { t, translateWorkerError } from '../../language/index.js'
6
+ import { t } from '../../language/index.js'
7
7
  import { api } from '../../core/api.js'
8
8
  import { state } from '../../core/state.js'
9
9
  import { el } from '../../ui/controls.js'
@@ -85,7 +85,7 @@ export default {
85
85
  },
86
86
  ],
87
87
  runtimeDefaults: () => ({
88
- worker: null,
88
+ previewController: null,
89
89
  processTimer: null,
90
90
  layoutSaveTimer: null,
91
91
  requestId: 0,
@@ -103,21 +103,14 @@ export default {
103
103
  function createPerfectPixelTool(context) {
104
104
  const { findNodeEl, formatPerfectPixelSourceArea, imageUrl, saveLayout } = context
105
105
 
106
- function workerErrorText(message) {
107
- if (message?.messageKey === 'workers.imageLoadFailed') {
108
- return `${t('workers.imageLoadFailed')}${message.messageVariables?.status ?? ''}`
109
- }
110
- return translateWorkerError(message)
111
- }
112
-
113
106
  function perfectPixelSettings(ds) {
114
107
  return {
115
- autoGrid: ds.autoGrid,
116
- pixelSize: ds.pixelSize,
117
- sampleMethod: ds.sampleMethod,
118
- exportScale: ds.exportScale,
119
- alphaMode: ds.alphaMode,
120
- alphaThreshold: ds.alphaThreshold,
108
+ auto_grid: ds.autoGrid,
109
+ pixel_size: ds.pixelSize,
110
+ sample_method: ds.sampleMethod,
111
+ export_scale: ds.exportScale,
112
+ alpha_mode: ds.alphaMode,
113
+ alpha_threshold: ds.alphaThreshold,
121
114
  }
122
115
  }
123
116
 
@@ -157,78 +150,60 @@ function createPerfectPixelTool(context) {
157
150
  }, 220)
158
151
  }
159
152
 
160
- function startPerfectPixelWorker(editorId, sourceId, requestId) {
153
+ async function startPerfectPixelPreview(editorId, sourceId, requestId) {
161
154
  const ds = peekFeatureState(editorId)
162
155
  if (!ds || ds.requestId !== requestId) return
163
- ds.worker?.terminate()
164
- const worker = new Worker('/workers/perfect-pixel-worker.js')
165
- ds.worker = worker
166
- worker.addEventListener('message', (event) => {
167
- const current = peekFeatureState(editorId)
168
- if (!current || current.worker !== worker || current.requestId !== requestId) return
169
- const message = event.data || {}
170
- if (message.type === 'ready') {
171
- worker.postMessage({
172
- type: 'process',
173
- requestId,
174
- settings: perfectPixelSettings(current),
175
- })
176
- return
156
+ const controller = new AbortController()
157
+ ds.previewController = controller
158
+ try {
159
+ const response = await fetch('/api/perfect-pixel/preview', {
160
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
161
+ body: JSON.stringify({ id: sourceId, ...perfectPixelSettings(ds) }),
162
+ signal: controller.signal,
163
+ })
164
+ if (!response.ok) {
165
+ const error = await response.json().catch(() => ({}))
166
+ throw new Error(error.detail || response.statusText)
177
167
  }
178
- if (message.type === 'result' && message.requestId === requestId && message.blob) {
179
- worker.terminate()
180
- current.worker = null
181
- if (current.previewUrl?.startsWith('blob:')) URL.revokeObjectURL(current.previewUrl)
182
- current.resultBlob = message.blob
183
- current.previewUrl = URL.createObjectURL(message.blob)
184
- current.resultMeta = {
185
- width: message.width,
186
- height: message.height,
187
- gridWidth: message.gridWidth,
188
- gridHeight: message.gridHeight,
189
- pixelSizeX: message.pixelSizeX,
190
- pixelSizeY: message.pixelSizeY,
191
- confidence: message.confidence,
192
- automatic: message.automatic,
193
- }
194
- current.pending = false
195
- current.error = ''
196
- const image = findNodeEl(editorId)?.querySelector('[data-role="perfect-pixel-preview"]')
197
- if (image) image.src = current.previewUrl
198
- updatePerfectPixelEditorUi(editorId)
199
- return
200
- }
201
- if (message.type === 'error') {
202
- worker.terminate()
203
- current.worker = null
204
- current.pending = false
205
- current.resultBlob = null
206
- current.resultMeta = null
207
- current.error = `${t('features.editing.perfectPixel.text007')}${workerErrorText(message)}`
208
- updatePerfectPixelEditorUi(editorId)
168
+ const meta = JSON.parse(response.headers.get('X-Perfect-Pixel-Metadata'))
169
+ const blob = await response.blob()
170
+ const current = peekFeatureState(editorId)
171
+ if (!current || current.requestId !== requestId || controller.signal.aborted) return
172
+ if (current.previewUrl?.startsWith('blob:')) URL.revokeObjectURL(current.previewUrl)
173
+ current.resultBlob = blob
174
+ current.previewUrl = URL.createObjectURL(blob)
175
+ current.resultMeta = {
176
+ width: meta.width, height: meta.height,
177
+ gridWidth: meta.grid_width, gridHeight: meta.grid_height,
178
+ pixelSizeX: meta.pixel_size_x, pixelSizeY: meta.pixel_size_y,
179
+ confidence: meta.confidence, automatic: meta.auto_grid,
209
180
  }
210
- })
211
- worker.addEventListener('error', () => {
181
+ current.error = ''
182
+ const image = findNodeEl(editorId)?.querySelector('[data-role="perfect-pixel-preview"]')
183
+ if (image) image.src = current.previewUrl
184
+ } catch (error) {
212
185
  const current = peekFeatureState(editorId)
213
- if (!current || current.worker !== worker || current.requestId !== requestId) return
214
- worker.terminate()
215
- current.worker = null
216
- current.pending = false
186
+ if (!current || current.requestId !== requestId || controller.signal.aborted) return
217
187
  current.resultBlob = null
218
188
  current.resultMeta = null
219
- current.error = t('features.editing.perfectPixel.text008')
220
- updatePerfectPixelEditorUi(editorId)
221
- })
222
- worker.postMessage({ type: 'init', requestId, url: imageUrl(sourceId) })
189
+ current.error = t('features.editing.perfectPixel.text007') + error.message
190
+ } finally {
191
+ const current = peekFeatureState(editorId)
192
+ if (current?.requestId === requestId && !controller.signal.aborted) {
193
+ current.previewController = null
194
+ current.pending = false
195
+ updatePerfectPixelEditorUi(editorId)
196
+ }
197
+ }
223
198
  }
224
199
 
225
- function schedulePerfectPixelProcess(editorId, delay = 100) {
200
+ function schedulePerfectPixelProcess(editorId, delay = 200) {
226
201
  const ds = peekFeatureState(editorId)
227
202
  const item = state.layoutItems.find((candidate) => candidate.id === editorId)
228
203
  if (!ds || !item?.sourceId || ds.busy) return
229
204
  clearTimeout(ds.processTimer)
230
- ds.worker?.terminate()
231
- ds.worker = null
205
+ ds.previewController?.abort()
206
+ ds.previewController = null
232
207
  ds.requestId += 1
233
208
  const requestId = ds.requestId
234
209
  if (ds.previewUrl?.startsWith('blob:')) URL.revokeObjectURL(ds.previewUrl)
@@ -240,7 +215,7 @@ function createPerfectPixelTool(context) {
240
215
  updatePerfectPixelEditorUi(editorId)
241
216
  ds.processTimer = setTimeout(() => {
242
217
  ds.processTimer = null
243
- startPerfectPixelWorker(editorId, item.sourceId, requestId)
218
+ void startPerfectPixelPreview(editorId, item.sourceId, requestId)
244
219
  }, delay)
245
220
  }
246
221
 
@@ -266,25 +241,12 @@ function createPerfectPixelTool(context) {
266
241
  if (!ds) return
267
242
  clearTimeout(ds.processTimer)
268
243
  clearTimeout(ds.layoutSaveTimer)
269
- ds.worker?.terminate()
244
+ ds.previewController?.abort()
270
245
  if (ds.previewUrl?.startsWith('blob:')) URL.revokeObjectURL(ds.previewUrl)
271
246
  }
272
247
 
273
248
  function task(item, ds) {
274
- const blob = ds.resultBlob
275
- const settings = {
276
- source_id: item.sourceId,
277
- auto_grid: String(ds.autoGrid),
278
- grid_width: String(ds.resultMeta.gridWidth),
279
- grid_height: String(ds.resultMeta.gridHeight),
280
- pixel_size: String(ds.pixelSize),
281
- pixel_size_x: String(ds.resultMeta.pixelSizeX),
282
- pixel_size_y: String(ds.resultMeta.pixelSizeY),
283
- sample_method: ds.sampleMethod,
284
- export_scale: String(ds.exportScale),
285
- alpha_mode: ds.alphaMode,
286
- alpha_threshold: String(ds.alphaThreshold),
287
- }
249
+ const settings = { id: item.sourceId, ...perfectPixelSettings(ds) }
288
250
  return {
289
251
  wait: {
290
252
  name: t('features.editing.perfectPixel.text009'),
@@ -294,8 +256,9 @@ function createPerfectPixelTool(context) {
294
256
  },
295
257
  request: (operationId) =>
296
258
  api(
297
- `/api/perfect-pixel/apply-browser?${new URLSearchParams({ ...settings, client_operation_id: operationId })}`,
298
- { method: 'POST', headers: { 'Content-Type': 'image/png' }, body: blob },
259
+ '/api/perfect-pixel/apply',
260
+ { method: 'POST', headers: { 'Content-Type': 'application/json' },
261
+ body: JSON.stringify({ ...settings, client_operation_id: operationId }) },
299
262
  ),
300
263
  }
301
264
  }