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 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
- > **427 skills, 109 agents, 17 hooks and 28 rules for Claude Code — selective deploy by profile.**
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/ # 427 skills (flat, one dir per skill)
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/ # 28 rules (Markdown)
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.local_version, cached.remote_sha);
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 remoteSha = await getLatestCommitSha();
2740
- if (!remoteSha) return false;
2741
- const shortSha = remoteSha.substring(0, 12);
2742
- const updateAvailable = localVersion !== shortSha && !remoteSha.startsWith(localVersion);
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: updateAvailable
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 (updateAvailable && !opts.quiet) {
2751
- printUpdateNotice(localVersion, shortSha);
2778
+ if (result.update_available && !opts.quiet) {
2779
+ printUpdateNotice(result);
2752
2780
  }
2753
- return updateAvailable;
2781
+ return result.update_available;
2754
2782
  } catch {
2755
2783
  return false;
2756
2784
  }
2757
2785
  }
2758
- function printUpdateNotice(localVersion, remoteSha) {
2759
- console.log(
2760
- chalk11.yellow(`
2761
- Arcane update available: ${localVersion} \u2192 ${remoteSha}`)
2762
- );
2763
- console.log(
2764
- chalk11.dim(" Run: arcane update (--dry-run to preview)\n")
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;
@@ -1,8 +1,8 @@
1
1
  # Skills Catalog — Claude Code Arcane
2
2
 
3
- Los 427 skills disponibles para proyectos consumidores, organizados por division.
3
+ Los 431 skills disponibles para proyectos consumidores, organizados por division.
4
4
 
5
- La tabla cubre 385: 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.
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 (21 skills)
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]` |
@@ -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 **427 skills**, **109 agents**, **17 hooks**, and **28 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.
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 427 skills, which is why selective deploy matters.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-arcane",
3
- "version": "2.5.0",
3
+ "version": "2.6.1",
4
4
  "description": "Skills, agents, hooks and rules for Claude Code — installable via npx claude-code-arcane",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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.