claude-code-arcane 2.5.0 → 2.6.1
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/CHANGELOG.md +14 -0
- package/README.md +4 -3
- package/agents/game/art-director.md +1 -1
- package/dist/cli.js +74 -17
- package/docs/SKILLS-CATALOG.md +7 -3
- package/docs/USER-GUIDE.md +3 -3
- package/package.json +1 -1
- package/profiles/meshy.yaml +42 -0
- package/rules/meshy-assets.md +111 -0
- package/skills/meshy-derive/SKILL.md +116 -0
- package/skills/meshy-generate/SKILL.md +118 -0
- package/skills/meshy-print/SKILL.md +108 -0
- package/skills/meshy-setup/SKILL.md +116 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## [2.6.1](https://github.com/SebastianLuser/claude-code-arcane/compare/v2.6.0...v2.6.1) (2026-08-18)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* **update-check:** compare like with like, and check the CLI version too ([fe734ce](https://github.com/SebastianLuser/claude-code-arcane/commit/fe734ce9bff14ec37e22d75fc38e64ba7b17f098))
|
|
7
|
+
|
|
8
|
+
# [2.6.0](https://github.com/SebastianLuser/claude-code-arcane/compare/v2.5.0...v2.6.0) (2026-08-18)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* **profiles:** add meshy profile for 3D asset production ([c550bf2](https://github.com/SebastianLuser/claude-code-arcane/commit/c550bf24aff143ce0284457b4c70c9b356935069))
|
|
14
|
+
|
|
1
15
|
# [2.5.0](https://github.com/SebastianLuser/claude-code-arcane/compare/v2.4.0...v2.5.0) (2026-08-13)
|
|
2
16
|
|
|
3
17
|
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Claude Code Arcane
|
|
2
2
|
|
|
3
|
-
> **
|
|
3
|
+
> **431 skills, 109 agents, 17 hooks and 29 rules for Claude Code — selective deploy by profile.**
|
|
4
4
|
|
|
5
5
|
A configuration harness installable via `npx`. Pick a **profile** that matches your stack and only the relevant tools get installed into your project's `.claude/` directory.
|
|
6
6
|
|
|
@@ -193,6 +193,7 @@ All profiles combine freely with `+` — there is no required "base". Grouped by
|
|
|
193
193
|
|---------|-------|--------|--------|
|
|
194
194
|
| `unity-dev` | Unity programmer — C#, architecture, performance, builds | 25 | game |
|
|
195
195
|
| `unity-design` | Game designer — GDDs, balance, art bible, playtesting | 17 | game |
|
|
196
|
+
| `meshy` | 3D asset production with Meshy AI — credit-gated generation, single master + cheap derivatives, printability | 5 | — |
|
|
196
197
|
| `unreal-dev` | Unreal Engine 5 programmer — C++, Blueprints, GAS, replication, rendering, packaging | 49 | game |
|
|
197
198
|
| `visual-novel` | Visual novel developer — Ren'Py, narrative, branching | 17 | visualnovel, game |
|
|
198
199
|
| `audio` | Game audio — direction, composition, sound design, middleware, VO, QA | 13 | audio |
|
|
@@ -430,11 +431,11 @@ claude-code-arcane/
|
|
|
430
431
|
│ ├── manifest.ts # Read/write arcane-manifest.json
|
|
431
432
|
│ ├── types.ts # TypeScript interfaces
|
|
432
433
|
│ └── utils.ts # Cross-platform helpers
|
|
433
|
-
├── skills/ #
|
|
434
|
+
├── skills/ # 431 skills (flat, one dir per skill)
|
|
434
435
|
├── profiles/ # 38 profiles (YAML)
|
|
435
436
|
├── agents/ # 17 dirs, 109 agents (Markdown)
|
|
436
437
|
├── hooks/ # 17 lifecycle hooks (Bash)
|
|
437
|
-
├── rules/ #
|
|
438
|
+
├── rules/ # 29 rules (Markdown)
|
|
438
439
|
├── templates/ # Gamedev templates
|
|
439
440
|
├── docs/ # Documentation
|
|
440
441
|
└── skills-selftest/ # QA framework
|
|
@@ -5,7 +5,7 @@ tools: Read, Glob, Grep, Write, Edit, WebSearch
|
|
|
5
5
|
model: sonnet
|
|
6
6
|
maxTurns: 20
|
|
7
7
|
memory: project
|
|
8
|
-
skills: [art-bible, asset-spec, asset-audit]
|
|
8
|
+
skills: [art-bible, asset-spec, asset-audit, meshy-setup, meshy-generate, meshy-derive, meshy-print]
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
Sos el **Art Director**. Owner de la identidad visual — que el juego se vea coherente y memorable.
|
package/dist/cli.js
CHANGED
|
@@ -2722,6 +2722,25 @@ var CHECK_INTERVAL_MS = 4 * 60 * 60 * 1e3;
|
|
|
2722
2722
|
var GITHUB_OWNER2 = "SebastianLuser";
|
|
2723
2723
|
var GITHUB_REPO2 = "Claude-Code-Arcane";
|
|
2724
2724
|
var GITHUB_BRANCH2 = "main";
|
|
2725
|
+
var PACKAGE_NAME2 = "claude-code-arcane";
|
|
2726
|
+
var SHA_PATTERN = /^[0-9a-f]{7,40}$/i;
|
|
2727
|
+
function compareSemver(a, b) {
|
|
2728
|
+
const release = (v) => v.trim().replace(/^v/, "").split(/[-+]/)[0];
|
|
2729
|
+
const parts = (v) => release(v).split(".").map((n) => Number.parseInt(n, 10) || 0);
|
|
2730
|
+
const [aMajor = 0, aMinor = 0, aPatch = 0] = parts(a);
|
|
2731
|
+
const [bMajor = 0, bMinor = 0, bPatch = 0] = parts(b);
|
|
2732
|
+
if (aMajor !== bMajor) return aMajor - bMajor;
|
|
2733
|
+
if (aMinor !== bMinor) return aMinor - bMinor;
|
|
2734
|
+
if (aPatch !== bPatch) return aPatch - bPatch;
|
|
2735
|
+
const aPre = /-/.test(a.trim());
|
|
2736
|
+
const bPre = /-/.test(b.trim());
|
|
2737
|
+
if (aPre !== bPre) return aPre ? -1 : 1;
|
|
2738
|
+
return 0;
|
|
2739
|
+
}
|
|
2740
|
+
function isContentUpdateAvailable(localVersion, remoteSha) {
|
|
2741
|
+
if (!SHA_PATTERN.test(localVersion)) return false;
|
|
2742
|
+
return !remoteSha.startsWith(localVersion) && !localVersion.startsWith(remoteSha);
|
|
2743
|
+
}
|
|
2725
2744
|
async function checkForUpdates(opts = {}) {
|
|
2726
2745
|
try {
|
|
2727
2746
|
const cached = readCachedCheck();
|
|
@@ -2729,40 +2748,62 @@ async function checkForUpdates(opts = {}) {
|
|
|
2729
2748
|
const age = Date.now() - new Date(cached.checked_at).getTime();
|
|
2730
2749
|
if (age < CHECK_INTERVAL_MS) {
|
|
2731
2750
|
if (cached.update_available && !opts.quiet) {
|
|
2732
|
-
printUpdateNotice(cached
|
|
2751
|
+
printUpdateNotice(cached);
|
|
2733
2752
|
}
|
|
2734
2753
|
return cached.update_available;
|
|
2735
2754
|
}
|
|
2736
2755
|
}
|
|
2737
2756
|
const manifest = readManifest(process.cwd());
|
|
2738
2757
|
const localVersion = manifest?.source_version ?? manifest?.arcane_version ?? "unknown";
|
|
2739
|
-
const
|
|
2740
|
-
|
|
2741
|
-
|
|
2742
|
-
|
|
2758
|
+
const cliVersion = getPackageVersion();
|
|
2759
|
+
const [remoteSha, latestCli] = await Promise.all([
|
|
2760
|
+
getLatestCommitSha(),
|
|
2761
|
+
getLatestNpmVersion()
|
|
2762
|
+
]);
|
|
2763
|
+
const shortSha = remoteSha ? remoteSha.substring(0, 12) : cached?.remote_sha ?? "";
|
|
2764
|
+
const contentUpdate = shortSha !== "" && isContentUpdateAvailable(localVersion, shortSha);
|
|
2765
|
+
const cliUpdate = latestCli !== null && compareSemver(latestCli, cliVersion) > 0;
|
|
2766
|
+
if (!remoteSha && latestCli === null) return false;
|
|
2743
2767
|
const result = {
|
|
2744
2768
|
checked_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
2745
2769
|
local_version: localVersion,
|
|
2746
2770
|
remote_sha: shortSha,
|
|
2747
|
-
update_available:
|
|
2771
|
+
update_available: contentUpdate || cliUpdate,
|
|
2772
|
+
content_update_available: contentUpdate,
|
|
2773
|
+
cli_version: cliVersion,
|
|
2774
|
+
latest_cli_version: latestCli ?? void 0,
|
|
2775
|
+
cli_update_available: cliUpdate
|
|
2748
2776
|
};
|
|
2749
2777
|
writeCachedCheck(result);
|
|
2750
|
-
if (
|
|
2751
|
-
printUpdateNotice(
|
|
2778
|
+
if (result.update_available && !opts.quiet) {
|
|
2779
|
+
printUpdateNotice(result);
|
|
2752
2780
|
}
|
|
2753
|
-
return
|
|
2781
|
+
return result.update_available;
|
|
2754
2782
|
} catch {
|
|
2755
2783
|
return false;
|
|
2756
2784
|
}
|
|
2757
2785
|
}
|
|
2758
|
-
function printUpdateNotice(
|
|
2759
|
-
|
|
2760
|
-
|
|
2761
|
-
|
|
2762
|
-
|
|
2763
|
-
|
|
2764
|
-
|
|
2765
|
-
|
|
2786
|
+
function printUpdateNotice(result) {
|
|
2787
|
+
if (result.cli_update_available) {
|
|
2788
|
+
console.log(
|
|
2789
|
+
chalk11.yellow(
|
|
2790
|
+
`
|
|
2791
|
+
Arcane CLI update: ${result.cli_version} \u2192 ${result.latest_cli_version}`
|
|
2792
|
+
)
|
|
2793
|
+
);
|
|
2794
|
+
const how = isGloballyInstalled() ? ` Run: npm install -g ${PACKAGE_NAME2}@latest` : ` You are on an older CLI. Latest: ${PACKAGE_NAME2}@${result.latest_cli_version}`;
|
|
2795
|
+
console.log(chalk11.dim(how));
|
|
2796
|
+
}
|
|
2797
|
+
if (result.content_update_available ?? true) {
|
|
2798
|
+
console.log(
|
|
2799
|
+
chalk11.yellow(
|
|
2800
|
+
`
|
|
2801
|
+
Arcane content update: ${result.local_version} \u2192 ${result.remote_sha}`
|
|
2802
|
+
)
|
|
2803
|
+
);
|
|
2804
|
+
console.log(chalk11.dim(" Run: arcane update (--dry-run to preview)"));
|
|
2805
|
+
}
|
|
2806
|
+
console.log("");
|
|
2766
2807
|
}
|
|
2767
2808
|
async function getLatestCommitSha() {
|
|
2768
2809
|
try {
|
|
@@ -2783,6 +2824,22 @@ async function getLatestCommitSha() {
|
|
|
2783
2824
|
return null;
|
|
2784
2825
|
}
|
|
2785
2826
|
}
|
|
2827
|
+
async function getLatestNpmVersion() {
|
|
2828
|
+
try {
|
|
2829
|
+
const response = await fetch(
|
|
2830
|
+
`https://registry.npmjs.org/${PACKAGE_NAME2}/latest`,
|
|
2831
|
+
{
|
|
2832
|
+
headers: { "User-Agent": "arcane-cli", Accept: "application/json" },
|
|
2833
|
+
signal: AbortSignal.timeout(5e3)
|
|
2834
|
+
}
|
|
2835
|
+
);
|
|
2836
|
+
if (!response.ok) return null;
|
|
2837
|
+
const data = await response.json();
|
|
2838
|
+
return typeof data.version === "string" ? data.version : null;
|
|
2839
|
+
} catch {
|
|
2840
|
+
return null;
|
|
2841
|
+
}
|
|
2842
|
+
}
|
|
2786
2843
|
function readCachedCheck() {
|
|
2787
2844
|
try {
|
|
2788
2845
|
if (!fs15.existsSync(CHECK_FILE)) return null;
|
package/docs/SKILLS-CATALOG.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Skills Catalog — Claude Code Arcane
|
|
2
2
|
|
|
3
|
-
Los
|
|
3
|
+
Los 431 skills disponibles para proyectos consumidores, organizados por division.
|
|
4
4
|
|
|
5
|
-
La tabla cubre
|
|
5
|
+
La tabla cubre 389: hay 42 skills instalables que todavia no estan catalogados aca. Un test de CI (`src/__tests__/doc-counts.test.ts`) verifica que estos numeros coincidan con el filesystem y que el header de cada seccion coincida con sus filas.
|
|
6
6
|
|
|
7
7
|
## Como ejecutar un skill
|
|
8
8
|
|
|
@@ -72,7 +72,7 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
|
|
|
72
72
|
|
|
73
73
|
---
|
|
74
74
|
|
|
75
|
-
## Gamedev (
|
|
75
|
+
## Gamedev (25 skills)
|
|
76
76
|
|
|
77
77
|
| Skill | Descripcion | Uso |
|
|
78
78
|
|-------|-------------|-----|
|
|
@@ -85,6 +85,10 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
|
|
|
85
85
|
| `/doc-gdd` | Genera Game Design Document completo | `[game-name]` |
|
|
86
86
|
| `/doc-pas` | Documentacion PAS (Problem-Analysis-Solution) | `[problem o decision title]` |
|
|
87
87
|
| `/install-mcp` | Conecta Claude con el MCP del engine: Unity (package UPM) o Unreal (plugins del engine) | `[unity\|unreal] [--secondary] [path]` |
|
|
88
|
+
| `/meshy-derive` | Deriva targets (FBX, GLB web, blend, STL) desde el master GLB | `<slug> [game\|web\|edit\|print\|all]` |
|
|
89
|
+
| `/meshy-generate` | Genera asset 3D con Meshy: preview -> refine, con gate de creditos | `<slug> [--from-image <path>] [--spec <path>]` |
|
|
90
|
+
| `/meshy-print` | Prepara asset para impresion 3D: analyze -> repair -> resize -> STL/3MF | `<slug> [--height-mm <n>] [--multicolor]` |
|
|
91
|
+
| `/meshy-setup` | Conecta Claude Code con Meshy AI: API key, MCP oficial, estructura de assets | `[--verify]` |
|
|
88
92
|
| `/map-systems` | Descompone concepto en sistemas, mapea dependencias | `[next \| system-name] [--review]` |
|
|
89
93
|
| `/playtest-report` | Genera o analiza reporte de playtest | `[new\|analyze path] [--review]` |
|
|
90
94
|
| `/scaffold-unity` | Scaffoldea proyecto Unity estilo Project_T | `[project-name]` |
|
package/docs/USER-GUIDE.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## What is Arcane?
|
|
4
4
|
|
|
5
|
-
Arcane is a configuration harness for [Claude Code](https://docs.anthropic.com/en/docs/claude-code). It provides a curated library of **
|
|
5
|
+
Arcane is a configuration harness for [Claude Code](https://docs.anthropic.com/en/docs/claude-code). It provides a curated library of **431 skills**, **109 agents**, **17 hooks**, and **29 rules** that you selectively deploy into any project. Instead of shipping everything to every project (wasting tokens and degrading performance), you pick a **profile** that matches your stack and only the relevant tools get installed.
|
|
6
6
|
|
|
7
7
|
## Table of Contents
|
|
8
8
|
|
|
@@ -206,7 +206,7 @@ All profiles are equal — pick any combination that fits your work. They are gr
|
|
|
206
206
|
| **Backend** | `backend-ts`, `backend-go`, `backend-dotnet`, `backend-nestjs`, `backend-nextjs` |
|
|
207
207
|
| **Frontend & Design** | `frontend`, `design` |
|
|
208
208
|
| **Mobile** | `mobile`, `flutter`, `android-native`, `ios-native` |
|
|
209
|
-
| **Gamedev** | `unity-dev`, `unity-design`, `unreal-dev`, `visual-novel`, `audio` |
|
|
209
|
+
| **Gamedev** | `unity-dev`, `unity-design`, `unreal-dev`, `visual-novel`, `audio`, `meshy` |
|
|
210
210
|
| **Platform & Quality** | `infra`, `database`, `security`, `testing`, `ai` |
|
|
211
211
|
| **Project Management** | `agile`, `jira`, `clickup`, `integrations` |
|
|
212
212
|
| **Business** | `business`, `clevel`, `finance`, `marketing`, `ecommerce`, `regulatory` |
|
|
@@ -515,7 +515,7 @@ Yes, and it's recommended. This way everyone on the team gets the same Claude Co
|
|
|
515
515
|
|
|
516
516
|
### How many tokens does a profile consume?
|
|
517
517
|
|
|
518
|
-
Each skill adds ~30-100 tokens to the system prompt. A typical stack profile (20-30 skills) adds ~1-2k tokens. The core profile adds ~500 tokens. Compare that to loading all
|
|
518
|
+
Each skill adds ~30-100 tokens to the system prompt. A typical stack profile (20-30 skills) adds ~1-2k tokens. The core profile adds ~500 tokens. Compare that to loading all 431 skills, which is why selective deploy matters.
|
|
519
519
|
|
|
520
520
|
### Why replace instead of merge on install?
|
|
521
521
|
|
package/package.json
CHANGED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
name: meshy
|
|
2
|
+
description: "Produccion de assets 3D con Meshy AI — generacion con gate de creditos, master unico + derivados baratos (FBX game, GLB web, blend, STL print) y printability"
|
|
3
|
+
category: gamedev
|
|
4
|
+
|
|
5
|
+
skills:
|
|
6
|
+
# Setup: cablea el MCP oficial de Meshy, no lo vendoriza
|
|
7
|
+
- meshy-setup
|
|
8
|
+
# Pipeline
|
|
9
|
+
- meshy-generate
|
|
10
|
+
- meshy-derive
|
|
11
|
+
- meshy-print
|
|
12
|
+
# Reusada de la libreria compartida
|
|
13
|
+
- asset-audit
|
|
14
|
+
|
|
15
|
+
rules:
|
|
16
|
+
universal:
|
|
17
|
+
- meshy-assets
|
|
18
|
+
gamedev:
|
|
19
|
+
[]
|
|
20
|
+
|
|
21
|
+
agents:
|
|
22
|
+
# Meshy siempre se instala junto a unity-* o unreal-dev, que ya traen
|
|
23
|
+
# agents/game/. Declararlo aca solo copiaria los 30 agentes de gamedev
|
|
24
|
+
# a quien instale +meshy suelto para impresion 3D.
|
|
25
|
+
[]
|
|
26
|
+
|
|
27
|
+
permissions:
|
|
28
|
+
allow:
|
|
29
|
+
# Derivados locales — cero creditos
|
|
30
|
+
- "Bash(npx --yes @gltf-transform/cli*)"
|
|
31
|
+
- "Bash(npx @gltf-transform/cli*)"
|
|
32
|
+
- "Bash(npx gltf-transform*)"
|
|
33
|
+
# Verificacion de LFS antes de commitear binarios
|
|
34
|
+
- "Bash(git check-attr*)"
|
|
35
|
+
- "Bash(git lfs version)"
|
|
36
|
+
- "Glob(assets/3d/**)"
|
|
37
|
+
- "Grep(assets/3d/**)"
|
|
38
|
+
deny:
|
|
39
|
+
# El master es inmutable: entra solo via mcp__meshy__download_model,
|
|
40
|
+
# ninguna herramienta de edicion lo toca despues
|
|
41
|
+
- "Write(assets/3d/*/master.glb)"
|
|
42
|
+
- "Edit(assets/3d/*/master.glb)"
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Meshy Assets
|
|
2
|
+
|
|
3
|
+
Reglas para produccion de assets 3D con Meshy. Aplican a cualquier operacion que toque `assets/3d/`.
|
|
4
|
+
|
|
5
|
+
## Creditos — cada llamada cuesta plata real
|
|
6
|
+
|
|
7
|
+
| Operacion | Creditos |
|
|
8
|
+
|---|---|
|
|
9
|
+
| `meshy_analyze_printability` | **0** |
|
|
10
|
+
| `meshy_check_balance`, `meshy_get_task_status`, `meshy_list_tasks`, `meshy_download_model` | **0** |
|
|
11
|
+
| `meshy_convert`, `meshy_resize` | 1 |
|
|
12
|
+
| `meshy_animate` | 3 |
|
|
13
|
+
| `meshy_text_to_image` | 3-9 |
|
|
14
|
+
| `meshy_image_to_image` | 3-12 |
|
|
15
|
+
| `meshy_remesh`, `meshy_rig`, `meshy_uv_unwrap` | 5 |
|
|
16
|
+
| `meshy_retexture`, `meshy_repair_printability` | 10 |
|
|
17
|
+
| `meshy_text_to_3d`, `meshy_image_to_3d`, `meshy_multi_image_to_3d` | 20-30 |
|
|
18
|
+
| Print white model | 20 |
|
|
19
|
+
| `meshy_creative_lab` | 36 |
|
|
20
|
+
| Print multicolor | 40 |
|
|
21
|
+
|
|
22
|
+
### Reglas duras
|
|
23
|
+
|
|
24
|
+
1. **Nunca generar sin confirmacion explicita.** Preguntar siempre, incluso si el pedido parece obvio. Informar el costo estimado **antes** de la llamada.
|
|
25
|
+
2. **Preview primero.** `meshy_text_to_3d_refine` solo con el preview aprobado por el usuario.
|
|
26
|
+
3. **Nunca en batch.** Un asset por vez, con confirmacion por asset.
|
|
27
|
+
4. **Chequear el ledger antes de generar.** Grepear `assets/3d/*/meshy.json` buscando un prompt equivalente. Si existe, avisar y **no** generar.
|
|
28
|
+
5. **Las operaciones de 0 creditos no necesitan confirmacion.** `analyze_printability`, `check_balance`, `get_task_status`, `list_tasks`, `download_model` corren libres.
|
|
29
|
+
|
|
30
|
+
Ante cualquier duda sobre si una operacion gasta, correr `meshy_check_balance` antes y despues y reportar el delta real.
|
|
31
|
+
|
|
32
|
+
## Master unico, derivados baratos
|
|
33
|
+
|
|
34
|
+
El GLB refined es la fuente de verdad y es **inmutable**. Ningun target se genera desde el prompt: todos salen del master.
|
|
35
|
+
|
|
36
|
+
| Target | Como | Creditos |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| Unity y UE5 | `meshy_convert` -> `fbx` (un solo archivo sirve para los dos) | 1 |
|
|
39
|
+
| Blender | `meshy_convert` -> `blend` | 1 |
|
|
40
|
+
| Impresion | `meshy_convert` -> `stl` (`3mf` si es multicolor) | 1 |
|
|
41
|
+
| Web / three.js | `npx gltf-transform optimize --simplify` | **0** |
|
|
42
|
+
|
|
43
|
+
- Nunca usar `remesh` (5) cuando `convert` (1) alcanza. `remesh` es para cambiar topologia de verdad, no para cambiar de formato.
|
|
44
|
+
- Nunca usar `remesh` para LODs de web: `gltf-transform` hace decimation, meshopt y KTX2 en local y gratis.
|
|
45
|
+
|
|
46
|
+
## Estructura en disco
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
assets/3d/<slug>/
|
|
50
|
+
meshy.json # ledger, ver abajo
|
|
51
|
+
master.glb # refined, inmutable
|
|
52
|
+
thumb.png
|
|
53
|
+
targets/
|
|
54
|
+
web.glb # <=15k tris, texturas 1024, KTX2 + draco
|
|
55
|
+
game.fbx # Unity + UE5
|
|
56
|
+
edit.blend
|
|
57
|
+
print.stl
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Slugs en kebab-case, sin fechas ni task_ids en el path.
|
|
61
|
+
|
|
62
|
+
## Ledger: `meshy.json`
|
|
63
|
+
|
|
64
|
+
Obligatorio por asset. Sin esto cada sesion nueva arranca ciega y se paga dos veces el mismo modelo.
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"slug": "rune-pedestal",
|
|
69
|
+
"prompt": "...",
|
|
70
|
+
"ai_model": "meshy-5",
|
|
71
|
+
"tasks": [
|
|
72
|
+
{ "id": "...", "op": "text_to_3d_preview", "credits": 5, "at": "2026-08-18T14:02:00Z" },
|
|
73
|
+
{ "id": "...", "op": "text_to_3d_refine", "credits": 25, "at": "2026-08-18T14:11:00Z" }
|
|
74
|
+
],
|
|
75
|
+
"credits_total": 30,
|
|
76
|
+
"derived": ["targets/web.glb", "targets/game.fbx"]
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Actualizar `meshy.json` **en el mismo turno** en que se genera. No dejarlo para despues.
|
|
81
|
+
|
|
82
|
+
## Ejes y escala
|
|
83
|
+
|
|
84
|
+
Verificar una vez, anotar en el ledger, no volver a pensarlo.
|
|
85
|
+
|
|
86
|
+
| Destino | Convencion |
|
|
87
|
+
|---|---|
|
|
88
|
+
| GLB | Y-up, metros |
|
|
89
|
+
| Unity | Y-up, 1 unidad = 1 m |
|
|
90
|
+
| UE5 | Z-up, 1 unidad = 1 cm (rotacion + factor 100) |
|
|
91
|
+
| Blender | Z-up, metros |
|
|
92
|
+
|
|
93
|
+
## Impresion 3D
|
|
94
|
+
|
|
95
|
+
Correr `meshy_analyze_printability` (gratis) **siempre** antes de `meshy_repair_printability` (10). `meshy_resize` a milimetros reales antes de exportar STL. Las operaciones de print (20 white / 40 multicolor) son las mas caras del catalogo: doble confirmacion.
|
|
96
|
+
|
|
97
|
+
## Rigging
|
|
98
|
+
|
|
99
|
+
`meshy_rig` es solo humanoides. El esqueleto que devuelve **no** es el mannequin de UE5: el retargeting es manual. En UE5 los static meshes van a Nanite y no necesitan decimation; los skeletal meshes si necesitan LODs propios.
|
|
100
|
+
|
|
101
|
+
## Git y secretos
|
|
102
|
+
|
|
103
|
+
- `*.glb *.fbx *.blend *.stl *.3mf` por **Git LFS**.
|
|
104
|
+
- `meshy.json` y `thumb.png` van como archivos normales — son chicos y son lo que hace grepeable el catalogo.
|
|
105
|
+
- `MESHY_API_KEY` (formato `msy_...`) va en `.env`, **nunca** en el repo ni en un SKILL.md.
|
|
106
|
+
|
|
107
|
+
## Integracion con el resto del stack
|
|
108
|
+
|
|
109
|
+
`asset-spec` define que asset hace falta -> Meshy lo genera -> `asset-audit` valida el resultado. Meshy no reemplaza a ninguno de los dos.
|
|
110
|
+
|
|
111
|
+
Si existe un art bible en el proyecto, el prompt de generacion se deriva de ahi, no se inventa.
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: meshy-derive
|
|
3
|
+
description: "Deriva targets (FBX para Unity/UE5, GLB web optimizado, blend, STL) desde el master GLB de un asset. Usa convert (1 credito) o gltf-transform (gratis), nunca regenera. Usar para: exportar asset, target unity, target web, optimizar glb, lod web."
|
|
4
|
+
category: "gamedev"
|
|
5
|
+
argument-hint: "<slug> [game|web|edit|print|all]"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Bash, Write, Edit
|
|
8
|
+
---
|
|
9
|
+
# meshy-derive — Master a targets
|
|
10
|
+
|
|
11
|
+
Todos los targets salen del `master.glb`. **Nunca se regenera desde el prompt** — eso son 20-30 creditos para algo que cuesta 1 o 0.
|
|
12
|
+
|
|
13
|
+
## Input
|
|
14
|
+
|
|
15
|
+
- `<slug>` (requerido). Sin argumento → mostrar el uso y parar.
|
|
16
|
+
- Target (opcional, default `all`): `game` | `web` | `edit` | `print` | `all`.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Phase 1: Validar el master
|
|
21
|
+
|
|
22
|
+
- `assets/3d/<slug>/master.glb` tiene que existir. Si no, parar: "Corre `/meshy-generate <slug>` primero."
|
|
23
|
+
- Leer `assets/3d/<slug>/meshy.json`. Si el target pedido ya esta en `derived[]` y el archivo existe en disco, **no rehacerlo**: reportarlo y parar.
|
|
24
|
+
|
|
25
|
+
El master es inmutable. Ninguna fase de esta skill lo escribe.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Phase 2: Elegir la herramienta
|
|
30
|
+
|
|
31
|
+
| Target | Salida | Como | Creditos |
|
|
32
|
+
|---|---|---|---|
|
|
33
|
+
| `game` | `targets/game.fbx` | `mcp__meshy__convert` -> `fbx` | 1 |
|
|
34
|
+
| `edit` | `targets/edit.blend` | `mcp__meshy__convert` -> `blend` | 1 |
|
|
35
|
+
| `print` | `targets/print.stl` (`.3mf` si multicolor) | `mcp__meshy__convert` | 1 |
|
|
36
|
+
| `web` | `targets/web.glb` | `npx gltf-transform` | **0** |
|
|
37
|
+
|
|
38
|
+
Un solo `game.fbx` sirve para Unity y UE5. No generar uno por engine.
|
|
39
|
+
|
|
40
|
+
**Nunca usar `remesh` (5) donde `convert` (1) alcanza.** `remesh` cambia topologia; no es un conversor de formato. Y nunca usar `remesh` para LODs de web: `gltf-transform` hace decimation, meshopt y KTX2 en local y gratis.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Phase 3A: Web — gratis, local
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
npx --yes @gltf-transform/cli optimize \
|
|
48
|
+
assets/3d/<slug>/master.glb \
|
|
49
|
+
assets/3d/<slug>/targets/web.glb \
|
|
50
|
+
--simplify --texture-compress ktx2 --compress draco
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Presupuesto: ≤15k tris, texturas 1024. Verificar el resultado:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npx --yes @gltf-transform/cli inspect assets/3d/<slug>/targets/web.glb
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Reportar tris y tamaño finales. Si queda por encima del presupuesto, bajar con `--simplify-ratio` antes de dar por bueno — no aceptar el default en silencio.
|
|
60
|
+
|
|
61
|
+
Cero creditos: esta fase no necesita confirmacion de gasto.
|
|
62
|
+
|
|
63
|
+
## Phase 3B: convert — 1 credito por target
|
|
64
|
+
|
|
65
|
+
Cada `convert` gasta. Mostrar al usuario **la lista completa de targets y el total** en un solo mensaje y pedir una confirmacion para todo el lote:
|
|
66
|
+
|
|
67
|
+
> `game` + `edit` = 2 creditos. Balance actual: N.
|
|
68
|
+
|
|
69
|
+
Con `all`, hacer web primero (gratis) y despues los `convert` — asi el usuario ve un resultado antes de aprobar gasto.
|
|
70
|
+
|
|
71
|
+
Pollear con `mcp__meshy__get_task_status`, bajar con `mcp__meshy__download_model`.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Phase 4: Ejes y escala
|
|
76
|
+
|
|
77
|
+
Verificar una vez por asset y **anotarlo en el ledger** para no volver a pensarlo:
|
|
78
|
+
|
|
79
|
+
| Destino | Convencion |
|
|
80
|
+
|---|---|
|
|
81
|
+
| GLB | Y-up, metros |
|
|
82
|
+
| Unity | Y-up, 1 unidad = 1 m |
|
|
83
|
+
| UE5 | Z-up, 1 unidad = 1 cm — rotacion + factor 100 al importar |
|
|
84
|
+
| Blender | Z-up, metros |
|
|
85
|
+
|
|
86
|
+
El FBX se importa igual en los dos engines; lo que cambia es la config de import, no el archivo.
|
|
87
|
+
|
|
88
|
+
**Rigging**: si el asset esta rigueado, el esqueleto de Meshy no es el mannequin de UE5 — el retargeting es manual. En UE5, los static meshes van a Nanite y no necesitan LODs; los skeletal meshes si.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Phase 5: Actualizar el ledger
|
|
93
|
+
|
|
94
|
+
Agregar cada target a `derived[]` en `meshy.json`, sumar los creditos de los `convert` a `tasks[]` y a `credits_total`. **En el mismo turno.** Mostrar el diff del ledger y **pedir aprobacion antes de escribir**.
|
|
95
|
+
|
|
96
|
+
Verificar LFS sobre los archivos nuevos (`git check-attr filter`).
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Phase 6: Resumen
|
|
101
|
+
|
|
102
|
+
Reportar: targets generados, creditos gastados reales (delta de `check_balance`), tris/tamaño del web target, y que quedo sin hacer.
|
|
103
|
+
|
|
104
|
+
**Verdict:**
|
|
105
|
+
- **COMPLETE** — todos los targets pedidos en disco y en el ledger.
|
|
106
|
+
- **PARTIAL** — alguno fallo o el usuario no aprobo el gasto. Decir cual y por que.
|
|
107
|
+
- **SKIPPED** — ya existian, no se gasto nada.
|
|
108
|
+
|
|
109
|
+
## Next Steps
|
|
110
|
+
|
|
111
|
+
- `/asset-audit` para validar naming, budgets y formatos contra los standards
|
|
112
|
+
- `/meshy-print <slug>` si ademas va a impresion (tiene su propio flujo de printability)
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
> Presupuestos, estructura de `targets/`, formato del ledger y la tabla de creditos completa: `.claude/rules/meshy-assets.md`.
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: meshy-generate
|
|
3
|
+
description: "Genera un asset 3D con Meshy: preview -> aprobacion -> refine, con gate de creditos, dedupe contra el ledger y escritura de meshy.json. Usar para: generar modelo 3D, text to 3d, image to 3d, crear asset con meshy."
|
|
4
|
+
category: "gamedev"
|
|
5
|
+
argument-hint: "<slug> [--from-image <path>] [--spec <path>]"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Bash, Write, Edit
|
|
8
|
+
---
|
|
9
|
+
# meshy-generate — Generar un asset 3D
|
|
10
|
+
|
|
11
|
+
Un asset por corrida. **Nunca en batch.** Cada llamada de generacion cuesta 20-30 creditos reales.
|
|
12
|
+
|
|
13
|
+
## Input
|
|
14
|
+
|
|
15
|
+
- `<slug>` (requerido): kebab-case, sin fechas ni task_ids. Es el nombre de la carpeta. Sin argumento → mostrar el uso y parar.
|
|
16
|
+
- `--from-image <path>` (opcional): usa `image_to_3d` en vez de `text_to_3d`. Con varias imagenes, `multi_image_to_3d`.
|
|
17
|
+
- `--spec <path>` (opcional): spec de `asset-spec` de donde sale el prompt.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Phase 1: Dedupe — antes de gastar
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
grep -rl "<termino>" assets/3d/*/meshy.json 2>/dev/null
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Buscar por slug y por palabras clave del prompt. **Si hay un asset equivalente, parar**: mostrarlo al usuario, con su `credits_total`, y preguntar si quiere reusarlo, derivar un target nuevo con `/meshy-derive`, o generar igual.
|
|
28
|
+
|
|
29
|
+
Si `assets/3d/<slug>/` ya existe, no pisarlo. Parar y preguntar.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Phase 2: Prompt
|
|
34
|
+
|
|
35
|
+
- **Con `--spec`**: el prompt sale del spec, textual.
|
|
36
|
+
- **Sin spec**: si existe art bible (`design/art/art-bible.md` o equivalente), derivar el prompt de ahi — estilo, paleta, nivel de detalle. Si no existe, redactarlo con el usuario.
|
|
37
|
+
- Nunca inventar un estilo que contradiga el art bible.
|
|
38
|
+
|
|
39
|
+
Mostrar el prompt final y pedir aprobacion. El prompt aprobado va al ledger textual: es lo que hace que el dedupe de la proxima sesion funcione.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Phase 3: Gate de creditos
|
|
44
|
+
|
|
45
|
+
Antes de la primera llamada que gasta:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
mcp__meshy__check_balance
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Presentar al usuario, en un solo mensaje:
|
|
52
|
+
|
|
53
|
+
| | |
|
|
54
|
+
|---|---|
|
|
55
|
+
| Operacion | `text_to_3d` preview |
|
|
56
|
+
| Costo estimado | 20-30 creditos (preview + refine) |
|
|
57
|
+
| Balance actual | (de `check_balance`) |
|
|
58
|
+
|
|
59
|
+
**Esperar confirmacion explicita.** No generar con un "dale" ambiguo sobre otra cosa — la confirmacion tiene que ser sobre el costo mostrado.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Phase 4: Preview
|
|
64
|
+
|
|
65
|
+
Llamar `mcp__meshy__text_to_3d` (o `image_to_3d` / `multi_image_to_3d`) en modo preview. Pollear con `mcp__meshy__get_task_status` — es gratis, no hay razon para adivinar.
|
|
66
|
+
|
|
67
|
+
Bajar el preview con `mcp__meshy__download_model` y **mostrarselo al usuario**. Anotar el `task_id` y los creditos del preview en el ledger ya en este punto: si el refine se cancela, el gasto del preview igual ocurrio y tiene que quedar registrado.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Phase 5: Refine — solo con el preview aprobado
|
|
72
|
+
|
|
73
|
+
Si el preview no convence: **no refinar**. Opciones, en orden de costo:
|
|
74
|
+
1. Ajustar el prompt y volver a preview.
|
|
75
|
+
2. `retexture` (10) si la geometria sirve y el problema es la textura.
|
|
76
|
+
3. Descartar.
|
|
77
|
+
|
|
78
|
+
Con el preview aprobado, llamar `mcp__meshy__text_to_3d_refine`. El GLB resultante es el **master** y es inmutable — nada lo edita despues.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Phase 6: Escribir en disco
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
assets/3d/<slug>/
|
|
86
|
+
meshy.json
|
|
87
|
+
master.glb
|
|
88
|
+
thumb.png
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Mostrar el contenido de `meshy.json` y **pedir aprobacion antes de escribir**. Se escribe **en este mismo turno**, con el prompt textual, `ai_model`, un entry por task con sus creditos, y `credits_total`. El formato exacto esta en la rule.
|
|
92
|
+
|
|
93
|
+
Verificar que `master.glb` este cubierto por Git LFS (`git check-attr filter assets/3d/<slug>/master.glb`). Si no lo esta, avisar — commitear un GLB sin LFS ensucia el repo de forma dificil de revertir.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Phase 7: Resumen
|
|
98
|
+
|
|
99
|
+
Reportar:
|
|
100
|
+
- Slug, prompt usado y de donde salio (spec / art bible / redactado).
|
|
101
|
+
- Task ids y **creditos gastados reales** (correr `check_balance` de nuevo y reportar el delta contra Phase 3).
|
|
102
|
+
- Archivos escritos.
|
|
103
|
+
- Estado de LFS.
|
|
104
|
+
|
|
105
|
+
**Verdict:**
|
|
106
|
+
- **COMPLETE** — master en disco, ledger escrito, LFS ok.
|
|
107
|
+
- **PARTIAL** — se gasto en preview pero no hubo refine. El ledger tiene que reflejarlo igual. Decir cuanto se gasto.
|
|
108
|
+
- **ABORTED** — no se gasto nada. Decir por que.
|
|
109
|
+
|
|
110
|
+
## Next Steps
|
|
111
|
+
|
|
112
|
+
- `/meshy-derive <slug>` para los targets (FBX, web, blend) — el master no se toca
|
|
113
|
+
- `/meshy-print <slug>` si va a impresion
|
|
114
|
+
- `/asset-audit` para validar contra los standards del proyecto
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
> Tabla de creditos completa, reglas de gasto, formato del ledger y convenciones de ejes/escala: `.claude/rules/meshy-assets.md`. Leerla antes de la Phase 3.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: meshy-print
|
|
3
|
+
description: "Prepara un asset para impresion 3D con Meshy: analyze printability (gratis) -> repair -> resize a mm reales -> STL/3MF. Usar para: imprimir 3d, printability, stl, resize mm, reparar malla para impresion."
|
|
4
|
+
category: "gamedev"
|
|
5
|
+
argument-hint: "<slug> [--height-mm <n>] [--multicolor]"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Bash, Write, Edit
|
|
8
|
+
---
|
|
9
|
+
# meshy-print — Preparar para impresion 3D
|
|
10
|
+
|
|
11
|
+
El flujo esta ordenado por costo a proposito: lo gratis primero, y lo caro solo si el diagnostico lo justifica.
|
|
12
|
+
|
|
13
|
+
## Input
|
|
14
|
+
|
|
15
|
+
- `<slug>` (requerido). Sin argumento → mostrar el uso y parar.
|
|
16
|
+
- `--height-mm <n>` (opcional): altura real de la pieza. Sin esto no se puede escalar bien.
|
|
17
|
+
- `--multicolor` (opcional): salida `3mf` en vez de `stl`.
|
|
18
|
+
|
|
19
|
+
Requiere `assets/3d/<slug>/master.glb`. Si no existe, parar: "Corre `/meshy-generate <slug>` primero."
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Phase 1: Analyze — gratis, siempre
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
mcp__meshy__analyze_printability
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Cuesta **0 creditos**. Correrlo siempre, sin pedir confirmacion, antes que cualquier otra cosa.
|
|
30
|
+
|
|
31
|
+
Reportar el diagnostico al usuario en concreto: non-manifold, normals invertidas, paredes finas, geometria flotante, self-intersections. Este reporte es el que decide si vale la pena gastar en repair.
|
|
32
|
+
|
|
33
|
+
**Si el analisis sale limpio, saltar la Phase 2 entera.** Diez creditos de `repair` sobre una malla sana son diez creditos tirados.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Phase 2: Repair — 10 creditos, solo si hace falta
|
|
38
|
+
|
|
39
|
+
Presentar el gate antes de llamar:
|
|
40
|
+
|
|
41
|
+
| | |
|
|
42
|
+
|---|---|
|
|
43
|
+
| Operacion | `repair_printability` |
|
|
44
|
+
| Costo | 10 creditos |
|
|
45
|
+
| Problemas que resuelve | (los que listo la Phase 1) |
|
|
46
|
+
| Balance actual | (de `check_balance`) |
|
|
47
|
+
|
|
48
|
+
Con confirmacion explicita, llamar `mcp__meshy__repair_printability` y pollear con `get_task_status`.
|
|
49
|
+
|
|
50
|
+
Despues del repair, **volver a correr `analyze_printability`** (gratis) para confirmar que quedo resuelto. No asumir que el repair funciono.
|
|
51
|
+
|
|
52
|
+
Si hay problemas que el repair no arregla, decirlo: algunos requieren edicion manual en Blender y no tiene sentido gastar dos veces.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Phase 3: Escala real — 1 credito
|
|
57
|
+
|
|
58
|
+
Los modelos de Meshy vienen en unidades arbitrarias. Sin escalar, el slicer imprime cualquier cosa.
|
|
59
|
+
|
|
60
|
+
- **Con `--height-mm`**: `mcp__meshy__resize` a esa altura.
|
|
61
|
+
- **Sin `--height-mm`**: preguntar la altura antes de seguir. No adivinar.
|
|
62
|
+
|
|
63
|
+
Anotar la altura final en el ledger — es lo que evita reimprimir a la escala equivocada.
|
|
64
|
+
|
|
65
|
+
Chequear la altura contra el volumen de la impresora del usuario si lo sabemos; si no, avisar que lo verifique en el slicer.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Phase 4: Exportar — 1 credito
|
|
70
|
+
|
|
71
|
+
`mcp__meshy__convert` a `stl` (o `3mf` con `--multicolor`, que preserva color por cara). Salida: `assets/3d/<slug>/targets/print.stl` (o `.3mf`).
|
|
72
|
+
|
|
73
|
+
`mcp__meshy__send_to_slicer` esta disponible si el usuario lo pide explicitamente.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Phase 5: Print via Meshy — solo si lo piden
|
|
78
|
+
|
|
79
|
+
Meshy puede imprimir y enviar la pieza fisica. Es lo mas caro del catalogo:
|
|
80
|
+
|
|
81
|
+
| | Creditos |
|
|
82
|
+
|---|---|
|
|
83
|
+
| White model | 20 |
|
|
84
|
+
| Multicolor (`process_multicolor`) | 40 |
|
|
85
|
+
|
|
86
|
+
**Doble confirmacion**: mostrar el costo, esperar confirmacion, repetir el costo y el destino, esperar de nuevo. No entrar a esta fase por iniciativa propia — solo si el usuario la pidio.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Phase 6: Ledger y resumen
|
|
91
|
+
|
|
92
|
+
Agregar cada task a `meshy.json` con sus creditos, sumar a `credits_total`, agregar el STL/3MF a `derived[]`, anotar la altura en mm. Mostrar el diff y **pedir aprobacion antes de escribir**.
|
|
93
|
+
|
|
94
|
+
Reportar: veredicto del analisis inicial, si hubo repair y si el re-analisis quedo limpio, altura final, archivo generado, y **creditos gastados reales** (delta de `check_balance`).
|
|
95
|
+
|
|
96
|
+
**Verdict:**
|
|
97
|
+
- **PRINT-READY** — analisis limpio, escala aplicada, archivo en disco.
|
|
98
|
+
- **NEEDS-MANUAL** — quedan defectos que el repair no resuelve. Listarlos y decir que hace falta en Blender.
|
|
99
|
+
- **BLOCKED** — falta el master, o falta la altura y el usuario no la dio.
|
|
100
|
+
|
|
101
|
+
## Next Steps
|
|
102
|
+
|
|
103
|
+
- Verificar la pieza en el slicer antes de imprimir: soportes, orientacion, volumen
|
|
104
|
+
- `/meshy-derive <slug> game` si el mismo asset ademas va al juego — el master es el mismo, los targets son independientes
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
> Tabla de creditos completa y reglas de gasto: `.claude/rules/meshy-assets.md`. La regla de "gratis antes que pago" de este flujo esta ahi tambien.
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: meshy-setup
|
|
3
|
+
description: "Conecta Claude Code con Meshy AI: API key, registro del MCP oficial de Meshy, verificacion de balance y estructura de assets. Usar para: setup meshy, conectar meshy, mcp meshy, meshy api key."
|
|
4
|
+
category: "gamedev"
|
|
5
|
+
argument-hint: "[--verify]"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Bash, Write, Edit
|
|
8
|
+
---
|
|
9
|
+
# meshy-setup — Conectar Meshy AI
|
|
10
|
+
|
|
11
|
+
Deja el proyecto listo para generar assets 3D con Meshy. **Este repo no trae el MCP server** — es un paquete npm de Meshy que se registra en el cliente. Esta skill lo cablea, verifica y reporta; no vendoriza nada.
|
|
12
|
+
|
|
13
|
+
`--verify` salta la configuracion y corre solo la Phase 4.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Phase 1: API key
|
|
18
|
+
|
|
19
|
+
La key vive en el entorno, nunca en el repo.
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
echo "${MESHY_API_KEY:0:4}" # esperado: msy_
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
- **Si esta**: confirmar el prefijo `msy_` y seguir. No imprimir la key completa nunca.
|
|
26
|
+
- **Si falta**: pedirsela al usuario y guardarla en `.env` del proyecto. Verificar que `.env` este en `.gitignore` **antes** de escribir — si no esta, agregarlo primero.
|
|
27
|
+
|
|
28
|
+
Se saca de meshy.ai → Settings → API Keys. Requiere plan pago para la API.
|
|
29
|
+
|
|
30
|
+
> Si el usuario pega la key en el chat, escribirla a `.env` y avisarle que rote esa key si el transcript se comparte.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Phase 2: Registrar el MCP
|
|
35
|
+
|
|
36
|
+
Chequear si ya esta registrado antes de tocar nada — es idempotente, nunca duplicar:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
claude mcp list | grep -i meshy
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Si no aparece, mostrar el comando y **pedir aprobacion antes de correrlo**:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
claude mcp add-json meshy '{"command":"npx","args":["-y","@meshy-ai/meshy-mcp-server"],"env":{"MESHY_API_KEY":"msy_YOUR_API_KEY"}}'
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
- Paquete: `@meshy-ai/meshy-mcp-server` (npm, oficial de Meshy).
|
|
49
|
+
- Requiere Node. Si falta `node --version`, avisar y no abortar el resto.
|
|
50
|
+
- Sustituir `msy_YOUR_API_KEY` por la key real. Si el usuario prefiere no dejarla en la config del cliente, registrar el server sin `env` y exportar `MESHY_API_KEY` desde el shell.
|
|
51
|
+
|
|
52
|
+
El server expone 24 tools `mcp__meshy__*`: generacion (`text_to_3d`, `image_to_3d`, `multi_image_to_3d`, `creative_lab`), post-proceso (`remesh`, `retexture`, `rig`, `animate`), conversion (`convert`, `resize`, `uv_unwrap`), imagen (`text_to_image`, `image_to_image`), tasks (`get_task_status`, `list_tasks`, `cancel_task`, `download_model`, `list_models`), impresion (`analyze_printability`, `repair_printability`, `process_multicolor`, `send_to_slicer`) y `check_balance`.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Phase 3: Estructura del proyecto
|
|
57
|
+
|
|
58
|
+
Crear si no existen — todo idempotente:
|
|
59
|
+
|
|
60
|
+
1. `assets/3d/` con un `.gitkeep`.
|
|
61
|
+
2. Entradas de **Git LFS** en `.gitattributes`. Verificar `git lfs version` primero; si LFS no esta instalado, avisar y **no** escribir las entradas (peor que no tenerlas es tenerlas sin LFS):
|
|
62
|
+
```
|
|
63
|
+
*.glb filter=lfs diff=lfs merge=lfs -text
|
|
64
|
+
*.fbx filter=lfs diff=lfs merge=lfs -text
|
|
65
|
+
*.blend filter=lfs diff=lfs merge=lfs -text
|
|
66
|
+
*.stl filter=lfs diff=lfs merge=lfs -text
|
|
67
|
+
*.3mf filter=lfs diff=lfs merge=lfs -text
|
|
68
|
+
```
|
|
69
|
+
`meshy.json` y `thumb.png` quedan fuera de LFS a proposito: son chicos y son lo que hace grepeable el catalogo.
|
|
70
|
+
3. `.env` en `.gitignore`.
|
|
71
|
+
|
|
72
|
+
Mostrar el diff de `.gitattributes` y `.gitignore` y pedir aprobacion antes de escribir.
|
|
73
|
+
|
|
74
|
+
Para derivados web gratis hace falta `gltf-transform`. No instalarlo: se usa via `npx` on-demand.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Phase 4: Verificar
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
claude mcp list
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Con el server conectado, confirmar credenciales y balance con la tool gratis:
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
mcp__meshy__check_balance
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Reportar el balance en creditos. **Si el server no esta conectado, avisar explicitamente** y aclarar que ninguna operacion de generacion esta disponible — no asumir exito.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Phase 5: Resumen
|
|
95
|
+
|
|
96
|
+
Reportar:
|
|
97
|
+
- Origen de la API key (`.env` nueva vs ya presente en el entorno). Nunca el valor.
|
|
98
|
+
- Si el MCP se registro ahora o ya estaba.
|
|
99
|
+
- Que se creo o modifico: `assets/3d/`, `.gitattributes`, `.gitignore`.
|
|
100
|
+
- Balance de creditos actual.
|
|
101
|
+
|
|
102
|
+
**Verdict:**
|
|
103
|
+
- **READY** — MCP conectado en `claude mcp list` y `check_balance` respondio.
|
|
104
|
+
- **PENDING** — config escrita pero el server no conecta todavia (tipico: Node ausente, o hay que reiniciar Claude Code para que levante el server). Aclarar que generar **aun no** esta disponible.
|
|
105
|
+
- **BLOCKED** — falta la API key, el plan no tiene acceso a la API, o `.gitignore` no se pudo asegurar. Indicar el fix concreto.
|
|
106
|
+
|
|
107
|
+
## Next Steps
|
|
108
|
+
|
|
109
|
+
- `/meshy-generate` para el primer asset (leer el gate de creditos antes)
|
|
110
|
+
- `/meshy-derive` para sacar targets de un master existente
|
|
111
|
+
- `/meshy-print` si el destino es impresion 3D
|
|
112
|
+
- Si ya hay art bible, `/asset-spec` primero: los prompts se derivan de ahi, no se inventan
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
> Las reglas de gasto, estructura de `assets/3d/`, ledger `meshy.json` y tabla de derivados estan en `.claude/rules/meshy-assets.md`. Leerlas antes de cualquier operacion que gaste creditos.
|