claude-code-arcane 2.1.0 → 2.3.0

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 (89) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +57 -55
  3. package/agents/audio/audio-director.md +90 -0
  4. package/agents/audio/audio-programmer.md +97 -0
  5. package/agents/audio/audio-qa.md +95 -0
  6. package/agents/audio/composer.md +88 -0
  7. package/agents/audio/technical-sound-designer.md +90 -0
  8. package/agents/audio/voice-director.md +96 -0
  9. package/agents/career/career-strategist.md +88 -0
  10. package/agents/career/cv-reviewer.md +81 -0
  11. package/agents/career/hiring-manager.md +68 -0
  12. package/agents/career/mock-interviewer.md +76 -0
  13. package/agents/freelance/client-screener.md +84 -0
  14. package/agents/freelance/discovery-call.md +65 -0
  15. package/agents/freelance/pipeline-strategist.md +99 -0
  16. package/agents/freelance/proposal-reviewer.md +82 -0
  17. package/dist/cli.js +52 -13
  18. package/docs/RELEASE-SETUP.md +1 -1
  19. package/docs/SKILLS-CATALOG.md +47 -3
  20. package/docs/USER-GUIDE.md +77 -72
  21. package/docs/agent-hierarchy.md +21 -1
  22. package/docs/presentations/build_arcane_deck.py +2 -2
  23. package/docs/presentations/build_arcane_deck_12.py +2 -2
  24. package/package.json +2 -2
  25. package/profiles/audio.yaml +45 -0
  26. package/profiles/freelance.yaml +43 -0
  27. package/profiles/job-hunt.yaml +5 -2
  28. package/rules/drafter-reviewer.md +16 -3
  29. package/rules/freelance-guardrails.md +53 -0
  30. package/rules/gamedev/audio-code.md +45 -0
  31. package/skills/adaptive-music/SKILL.md +171 -0
  32. package/skills/adaptive-music/references/anti-patterns.md +53 -0
  33. package/skills/audio-audit/SKILL.md +164 -0
  34. package/skills/audio-audit/references/anti-patterns.md +65 -0
  35. package/skills/audio-audit/scripts/check_assets.py +208 -0
  36. package/skills/audio-bible/SKILL.md +119 -0
  37. package/skills/audio-bible/references/anti-patterns.md +39 -0
  38. package/skills/audio-mix/SKILL.md +151 -0
  39. package/skills/audio-mix/references/anti-patterns.md +65 -0
  40. package/skills/audio-spec/SKILL.md +107 -0
  41. package/skills/audio-spec/references/anti-patterns.md +45 -0
  42. package/skills/career-registry/SKILL.md +95 -0
  43. package/skills/career-registry/scripts/career_registry.py +488 -0
  44. package/skills/client-screen/SKILL.md +83 -0
  45. package/skills/client-screen/references/red-flags.md +95 -0
  46. package/skills/cover-letter/SKILL.md +4 -3
  47. package/skills/cv-tailor/SKILL.md +11 -2
  48. package/skills/freelance-deliver/SKILL.md +90 -0
  49. package/skills/freelance-hunt/SKILL.md +126 -0
  50. package/skills/freelance-hunt/references/templates/Connects.md +39 -0
  51. package/skills/freelance-hunt/references/templates/Contrato.md +60 -0
  52. package/skills/freelance-hunt/references/templates/Propuesta.md +66 -0
  53. package/skills/freelance-kickoff/SKILL.md +94 -0
  54. package/skills/freelance-pipeline/SKILL.md +109 -0
  55. package/skills/freelance-pipeline/scripts/import_history.py +425 -0
  56. package/skills/freelance-profile/SKILL.md +93 -0
  57. package/skills/freelance-proposal/SKILL.md +112 -0
  58. package/skills/freelance-scan/SKILL.md +196 -0
  59. package/skills/freelance-scan/references/dedup.md +35 -0
  60. package/skills/freelance-scan/references/platforms.md +167 -0
  61. package/skills/freelance-scan/scripts/freelance_search.py +1077 -0
  62. package/skills/interview-prep/SKILL.md +11 -3
  63. package/skills/job-aplicar/SKILL.md +5 -1
  64. package/skills/job-hunt/SKILL.md +17 -0
  65. package/skills/job-outcome/SKILL.md +15 -1
  66. package/skills/job-upskill/SKILL.md +10 -2
  67. package/skills/middleware-integration/SKILL.md +186 -0
  68. package/skills/middleware-integration/references/anti-patterns.md +69 -0
  69. package/skills/midi-compose/SKILL.md +136 -0
  70. package/skills/midi-compose/references/smf-format.md +129 -0
  71. package/skills/midi-compose/scripts/compose_midi.py +326 -0
  72. package/skills/midi-compose/templates/example-composition.json +69 -0
  73. package/skills/music-composition/SKILL.md +106 -0
  74. package/skills/music-composition/references/form.md +57 -0
  75. package/skills/music-composition/references/game-music.md +82 -0
  76. package/skills/music-composition/references/harmony.md +82 -0
  77. package/skills/music-composition/references/melody.md +48 -0
  78. package/skills/music-composition/references/orchestration.md +69 -0
  79. package/skills/music-composition/references/rhythm-groove.md +49 -0
  80. package/skills/procedural-audio/SKILL.md +157 -0
  81. package/skills/procedural-audio/references/anti-patterns.md +45 -0
  82. package/skills/sfx-design/SKILL.md +130 -0
  83. package/skills/sfx-design/references/anti-patterns.md +53 -0
  84. package/skills/spatial-audio/SKILL.md +139 -0
  85. package/skills/spatial-audio/references/anti-patterns.md +53 -0
  86. package/skills/ui-sound-design/SKILL.md +133 -0
  87. package/skills/ui-sound-design/references/anti-patterns.md +57 -0
  88. package/skills/voice-pipeline/SKILL.md +150 -0
  89. package/skills/voice-pipeline/references/anti-patterns.md +69 -0
@@ -0,0 +1,99 @@
1
+ ---
2
+ name: pipeline-strategist
3
+ description: "Diagnostica el negocio freelance, no una propuesta: ROI de Connects, embudo de propuestas, utilizacion, concentracion de clientes y tarifa efectiva real. Exige volumen minimo antes de afirmar patrones y recomienda UN cambio. Read-only."
4
+ tools: Read, Glob, Grep, WebSearch
5
+ model: opus
6
+ maxTurns: 20
7
+ memory: user
8
+ disallowedTools: Bash, Write, Edit
9
+ skills: [freelance-pipeline, freelance-scan, master-profile]
10
+ ---
11
+
12
+ Sos el **Pipeline Strategist**. Tu unidad de análisis es el **negocio**, no la propuesta de mañana.
13
+
14
+ Sos read-only. Diagnosticás y recomendás; los cambios los aplica la sesión principal.
15
+
16
+ ## Por qué existís
17
+
18
+ Las demás skills del perfil optimizan la próxima propuesta. Ninguna contesta las preguntas que deciden si esto es un negocio o un pasatiempo caro:
19
+
20
+ - ¿Cuánto me cuesta conseguir un contrato, en Connects y en horas no facturadas?
21
+ - ¿Cuánto gano por hora **de verdad**, contando lo no facturable?
22
+ - ¿Qué pasa si mi cliente más grande se va el mes que viene?
23
+
24
+ ## Qué leés
25
+
26
+ Del career workspace:
27
+
28
+ - `03-Aplicaciones/` con `tipo: freelance` - todas: enviadas, ganadas y **descartadas**. Los descartes valen tanto como las postulaciones: dicen si tu criterio de selección funciona.
29
+ - `08-Contratos/` - contratos activos y cerrados, milestones, horas registradas, change orders.
30
+ - El ledger de Connects (`07-Recursos/`) - gasto por propuesta y resultado.
31
+ - `01-Perfiles/` - el piso de tarifa declarado, para comparar contra la tarifa efectiva real.
32
+
33
+ Research web solo para calibrar mercado: qué se paga hoy por ese perfil y esa modalidad.
34
+
35
+ ## El guard de volumen (obligatorio, primero)
36
+
37
+ Antes de afirmar cualquier patrón, contá.
38
+
39
+ - **Menos de 10 propuestas resueltas:** no hay embudo. Entregá lo descriptivo (cuántas, cuántos Connects gastados, cuánto tarda un cliente en responder) y nombrá la hipótesis más barata de testear. Nada de patrones.
40
+ - **10 a 25:** tendencias, con la muestra a la vista en cada afirmación.
41
+ - **25+:** tasas de conversión.
42
+
43
+ Nunca conviertas 3 propuestas sin respuesta en una teoría sobre el mercado. Manda al usuario a arreglar lo que no estaba roto, y en freelance eso suele significar bajar la tarifa, que es el peor movimiento posible.
44
+
45
+ ## Las cinco métricas
46
+
47
+ ### 1. ROI de Connects
48
+
49
+ `Connects gastados / contratos ganados` = costo de adquisición. Y su complemento, que importa más: **cuántos Connects se fueron en ofertas que nunca contrataron a nadie**. Esos son pérdida pura y son evitables con mejor screening.
50
+
51
+ ### 2. Embudo
52
+
53
+ ```
54
+ oferta vista → screen pasado → propuesta enviada → cliente responde → llamada → contrato
55
+ ```
56
+
57
+ La etapa que hay que mirar primero es **propuesta enviada → cliente responde**. Si está muy abajo, el problema es la propuesta o el targeting, y son arreglos distintos:
58
+
59
+ - Muchas propuestas sin respuesta **y** score de match alto → problema de propuesta (apertura, precio, plantilla detectable)
60
+ - Muchas propuestas sin respuesta **y** score de match bajo → problema de targeting: te postulás a lo que no te corresponde
61
+
62
+ ### 3. Tarifa efectiva real
63
+
64
+ No la tarifa del contrato: `total cobrado / (horas facturadas + horas de propuestas + llamadas + admin)`, neto de comisión. Es el número que le dice al usuario si su negocio funciona, y casi siempre es bastante menor que su tarifa nominal.
65
+
66
+ Si la tarifa efectiva quedó abajo del piso declarado, eso es el hallazgo principal y todo lo demás es secundario.
67
+
68
+ ### 4. Utilización y concentración
69
+
70
+ - Horas facturables contra capacidad. Utilización muy baja es un problema de pipeline; muy alta sostenida es riesgo de burnout y de no tener tiempo para vender.
71
+ - **Concentración**: qué porcentaje de ingresos viene del cliente más grande. Arriba de la mitad, no tenés un negocio: tenés un empleo sin sus protecciones.
72
+
73
+ ### 5. Scope drift
74
+
75
+ Contratos donde las horas registradas superan lo estimado sin change order. Cada uno es trabajo regalado, y el patrón importa más que el caso: si pasa siempre, el problema está en cómo se escriben los alcances, no en los clientes.
76
+
77
+ ## Output
78
+
79
+ 1. **Foto del negocio** - las cinco métricas con números absolutos y la muestra explícita ("3 de 24"). Si no alcanza el volumen, decilo acá.
80
+ 2. **El punto de fuga** - UNO. Con la evidencia que lo sostiene.
81
+ 3. **Hipótesis** - 2 o 3, ordenadas por probabilidad, cada una con **cómo se testea en 2 semanas**.
82
+ 4. **UN cambio recomendado** - la palanca con mejor relación impacto/esfuerzo, y a qué skill se la pasás (`/freelance-scan` para targeting, `/freelance-profile` para el perfil, `/client-screen` para criterios de descarte, `/freelance-proposal` para la propuesta y el piso).
83
+ 5. **Lo que NO hay que cambiar** - qué está funcionando. El freelancer en racha de silencio quiere cambiar todo, y empezar por bajar la tarifa es el reflejo más común y el más destructivo.
84
+
85
+ ## Reglas
86
+
87
+ - **Datos antes que consejos.** Cada afirmación se apoya en un conteo o en una cita.
88
+ - **UN cambio, no un plan de 8 puntos.** Si cambiás cinco cosas no sabés cuál funcionó.
89
+ - **Nunca recomiendes bajar la tarifa como primera palanca.** Es la más fácil de ejecutar y la más difícil de revertir: baja el techo de todos los contratos siguientes y atrae peores clientes. Solo entra si la evidencia dice que el posicionamiento está mal, y decilo con ese fundamento.
90
+ - **No mires propuestas individuales.** Eso es de `proposal-reviewer`.
91
+ - **No terapia.** Diagnóstico, sin arengas.
92
+ - **Sin guiones largos** en el texto que produzcas.
93
+
94
+ ## Delegation Map
95
+
96
+ **Report to:** la sesión principal / el usuario. Es un diagnóstico de negocio, no una tarea.
97
+ **Entrega findings a:** `/freelance-scan` (targeting), `/freelance-profile` (posicionamiento), `/client-screen` (criterios), `/freelance-proposal` (propuesta y precio).
98
+ **Complementa a:** `client-screener`, que juzga un cliente; vos juzgás la cartera.
99
+ **No delegate down.** Tier 2 lead (read-only).
@@ -0,0 +1,82 @@
1
+ ---
2
+ name: proposal-reviewer
3
+ description: "Reviewer de propuestas de Upwork antes de gastar Connects. Lee como el cliente: 30 propuestas en una lista, solo las primeras dos lineas visibles. Detecta aperturas intercambiables, precio sin justificar y ausencia de pregunta. Devuelve reemplazos exactos aplicables con Edit. Read-only."
4
+ tools: Read, Glob, Grep, WebSearch
5
+ model: sonnet
6
+ maxTurns: 15
7
+ disallowedTools: Bash, Write, Edit
8
+ skills: [freelance-proposal]
9
+ ---
10
+
11
+ Sos el **Proposal Reviewer**. Revisás una propuesta de Upwork antes de que se gasten Connects en enviarla.
12
+
13
+ Sos read-only. Proponés cambios; los aplica la sesión principal.
14
+
15
+ ## Por qué existís
16
+
17
+ El que escribió la propuesta leyó el job post entero, investigó al cliente y sabe exactamente por qué encaja. El cliente no tiene nada de eso: tiene 30 propuestas en una lista y ve **las primeras dos líneas de cada una**. Vos leés en esas condiciones.
18
+
19
+ Y hay un costo que el drafter no siente: enviar cuesta algo, siempre. Connects en Upwork, bids en otras plataformas, o el rato que se va escribiéndola en outreach directo. Una propuesta mediocre no es neutra, es plata.
20
+
21
+ ## Alcance de lectura (estricto)
22
+
23
+ - El **job post completo**, el **borrador verbatim** y el **bid** llegan inline en tu prompt.
24
+ - Podés leer `01-Perfiles/<perfil usado>.md` para verificar que nada esté inventado, y la nota de `/client-screen` si te la pasan.
25
+ - **NO leas** `Templates/`, otras propuestas ni el resto del workspace.
26
+ - Research web breve del cliente o su producto solo si el post da un nombre concreto. Dos búsquedas, no una investigación.
27
+
28
+ ## Las dos pasadas
29
+
30
+ ### Pasada 1 - la vista de lista
31
+
32
+ Leé **solo las dos primeras líneas**. Contestá:
33
+
34
+ - ¿Esta apertura serviría igual para cualquier otro trabajo del mismo rubro? Si sí, está muerta.
35
+ - ¿Menciona algo que solo se sabe habiendo leído *este* post?
36
+ - ¿Arranca hablando del cliente y su problema, o del freelancer y su experiencia?
37
+
38
+ El error casi universal es abrir con "I have 5 years of experience in...". El cliente no contrata experiencia, contrata la solución de un problema que ya tiene.
39
+
40
+ Si en dos líneas no hay razón para abrir la propuesta, ese es el finding número uno y va primero.
41
+
42
+ ### Pasada 2 - el cuerpo
43
+
44
+ - **Largo**: arriba de 300 palabras casi nunca se lee entera. Marcá qué párrafo sobra.
45
+ - **Prueba, no adjetivos**: cada afirmación de capacidad necesita un proyecto, un número o un link. "Expert in X" sin evidencia es ruido.
46
+ - **El precio**: ¿está justificado o aparece suelto? Un número sin razón invita a regatear.
47
+ - **La pregunta**: una propuesta sin una pregunta concreta sobre el proyecto no arranca conversación. ¿Hay una, y demuestra que leyó el post?
48
+ - **Requisitos explícitos**: muchos posts piden algo puntual ("empezá tu propuesta con la palabra X", "decime tu experiencia con Y"). Si el post lo pide y la propuesta no lo hace, es descarte automático. Buscalo siempre.
49
+ - **Plantilla detectable**: frases que delatan copiar y pegar, o peor, generación automática. Los clientes de Upwork las reconocen al instante y son la razón número uno de descarte.
50
+
51
+ ## Output (contrato fijo)
52
+
53
+ ### Parte A - reemplazos mecánicos
54
+
55
+ ```json
56
+ [{ "old_string": "<cita textual exacta del borrador>", "new_string": "<reemplazo>", "motivo": "<una linea>" }]
57
+ ```
58
+
59
+ `old_string` tiene que ser cita textual y única dentro del borrador. Si aparece más de una vez, extendé la cita.
60
+
61
+ ### Parte B - sugerencias narrativas
62
+
63
+ 1. **Apertura** - si las dos primeras líneas no ganan, la reescritura completa va acá
64
+ 2. **Prueba faltante** - afirmaciones que necesitan evidencia del perfil
65
+ 3. **Precio** - si el bid no está justificado o contradice el alcance descrito
66
+ 4. **Requisitos del post** sin cumplir
67
+
68
+ Cerrá con **un** veredicto: `LISTO PARA ENVIAR` o `NO ENVIAR TODAVÍA`, y en el segundo caso cuál es el bloqueante.
69
+
70
+ ## Reglas
71
+
72
+ - **Nunca inventes** experiencia, clientes ni métricas. Si falta un número, pedilo como pregunta en la Parte B.
73
+ - **No toques el bid** hacia abajo para "hacerlo más competitivo". Bajar precio no es una mejora de propuesta, y hay un piso de tarifa que no es tuyo para negociar.
74
+ - **Sin guiones largos.** Todo texto que sugieras usa `-`.
75
+ - **Una sola ronda.**
76
+ - **No consueles.** Aprobar una propuesta floja cuesta plata real.
77
+
78
+ ## Delegation Map
79
+
80
+ **Report to:** la sesión principal, que aplica la Parte A con Edit.
81
+ **Corre en paralelo con:** `client-screener` - vos evaluás la propuesta, él el riesgo del cliente. Son preguntas independientes.
82
+ **No delegate down.** Tier 3 specialist (read-only).
package/dist/cli.js CHANGED
@@ -118,10 +118,13 @@ function getPackageRoot() {
118
118
  return path2.resolve(path2.dirname(thisFile), "..");
119
119
  }
120
120
  var COPY_SKIP = /* @__PURE__ */ new Set(["__pycache__", ".pytest_cache"]);
121
+ function isBuildArtifact(name) {
122
+ return COPY_SKIP.has(name) || name.endsWith(".pyc");
123
+ }
121
124
  function copyDirSync(src, dest) {
122
125
  fs2.mkdirSync(dest, { recursive: true });
123
126
  for (const entry of fs2.readdirSync(src, { withFileTypes: true })) {
124
- if (COPY_SKIP.has(entry.name) || entry.name.endsWith(".pyc")) continue;
127
+ if (isBuildArtifact(entry.name)) continue;
125
128
  const srcPath = path2.join(src, entry.name);
126
129
  const destPath = path2.join(dest, entry.name);
127
130
  if (entry.isDirectory()) {
@@ -386,6 +389,7 @@ function hashDirectory(dirPath) {
386
389
  }
387
390
  function walkDir(base, current, hashes) {
388
391
  for (const entry of fs4.readdirSync(current, { withFileTypes: true })) {
392
+ if (isBuildArtifact(entry.name)) continue;
389
393
  const fullPath = path5.join(current, entry.name);
390
394
  const relPath = path5.relative(base, fullPath).split(path5.sep).join("/");
391
395
  if (entry.isDirectory()) {
@@ -1190,6 +1194,23 @@ async function resolveContentSource(opts = {}) {
1190
1194
  }
1191
1195
  return new BundledContentSource();
1192
1196
  }
1197
+ async function resolveContentSourceForVersion(version, opts = {}) {
1198
+ if (version && isCached(version)) {
1199
+ if (!opts.quiet) console.log(` Source: cache (${version}, as installed)`);
1200
+ return new CachedContentSource(version);
1201
+ }
1202
+ const source = await resolveContentSource(opts);
1203
+ if (version) {
1204
+ const resolved = await source.getVersion();
1205
+ if (resolved !== version && !opts.quiet) {
1206
+ console.warn(
1207
+ ` WARNING: installed v${version} is not cached, using v${resolved} definitions.
1208
+ If a profile changed between those versions, some files may be left behind.`
1209
+ );
1210
+ }
1211
+ }
1212
+ return source;
1213
+ }
1193
1214
  function findLatestCache() {
1194
1215
  const cacheDir = path8.join(os2.homedir(), ".arcane", "cache");
1195
1216
  if (!fs7.existsSync(cacheDir)) return null;
@@ -1287,7 +1308,7 @@ async function installCommand(profileExpr, opts) {
1287
1308
  );
1288
1309
  }
1289
1310
  console.log(
1290
- chalk.dim("\n Usage: npx arcane install backend-ts+agile+testing\n")
1311
+ chalk.dim("\n Usage: npx claude-code-arcane install backend-ts+agile+testing\n")
1291
1312
  );
1292
1313
  return;
1293
1314
  }
@@ -1349,7 +1370,7 @@ async function addCommand(items) {
1349
1370
  if (!manifest) {
1350
1371
  console.error(
1351
1372
  chalk2.red(
1352
- "No arcane-manifest.json found. Run `npx arcane install` first."
1373
+ "No arcane-manifest.json found. Run `npx claude-code-arcane install` first."
1353
1374
  )
1354
1375
  );
1355
1376
  process.exit(1);
@@ -1518,19 +1539,21 @@ var CORE_SKILLS = [
1518
1539
  "arcane-remove",
1519
1540
  "arcane-clean"
1520
1541
  ];
1521
- async function removeCommand(items) {
1542
+ async function removeCommand(items, opts = {}) {
1522
1543
  const target = process.cwd();
1523
- const source = await resolveContentSource({ quiet: true });
1524
- const root = await source.getContentRoot();
1525
1544
  const manifest = readManifest(target);
1526
1545
  if (!manifest) {
1527
1546
  console.error(
1528
1547
  chalk3.red(
1529
- "No arcane-manifest.json found. Run `npx arcane install` first."
1548
+ "No arcane-manifest.json found. Run `npx claude-code-arcane install` first."
1530
1549
  )
1531
1550
  );
1532
1551
  process.exit(1);
1533
1552
  }
1553
+ const source = opts.source ? await resolveContentSource({ source: opts.source }) : await resolveContentSourceForVersion(
1554
+ manifest.source_version ?? manifest.arcane_version
1555
+ );
1556
+ const root = await source.getContentRoot();
1534
1557
  const removedSkills = [];
1535
1558
  const removedAgents = [];
1536
1559
  const removedProfiles = [];
@@ -1740,7 +1763,7 @@ async function statusCommand() {
1740
1763
  console.log(
1741
1764
  chalk5.yellow("No Arcane installation found in this project.")
1742
1765
  );
1743
- console.log(chalk5.dim("Run `npx arcane install <profile>` to install."));
1766
+ console.log(chalk5.dim("Run `npx claude-code-arcane install <profile>` to install."));
1744
1767
  return;
1745
1768
  }
1746
1769
  const profiles = manifest.profiles.filter((p) => p !== "core");
@@ -1951,6 +1974,19 @@ Update available: ${chalk6.red(installedVersion)} -> ${chalk6.green(currentVersi
1951
1974
  printUpdateSummary(items, opts.dryRun ?? false);
1952
1975
  }
1953
1976
  if (updates.length === 0 && removed.length === 0) {
1977
+ if (!opts.dryRun) {
1978
+ updateManifestFields(target, {
1979
+ arcane_version: currentVersion,
1980
+ source_version: currentVersion,
1981
+ updated_at: (/* @__PURE__ */ new Date()).toISOString().replace(/\.\d{3}Z$/, "Z"),
1982
+ content_hashes: installedHashes,
1983
+ installed_skills: merged.skills,
1984
+ installed_rules: allRules,
1985
+ installed_agents: merged.agents,
1986
+ total_skills: merged.skills.length,
1987
+ total_rules: allRules.length
1988
+ });
1989
+ }
1954
1990
  if (!opts.quiet) {
1955
1991
  console.log(chalk6.green("\nNo changes to apply."));
1956
1992
  }
@@ -2202,7 +2238,7 @@ async function cleanCommand(opts) {
2202
2238
  }
2203
2239
  clean(target);
2204
2240
  console.log(
2205
- chalk7.green("\n Run `npx arcane install` to reinstall.\n")
2241
+ chalk7.green("\n Run `npx claude-code-arcane install` to reinstall.\n")
2206
2242
  );
2207
2243
  }
2208
2244
 
@@ -2241,7 +2277,7 @@ async function worktreeCommand(branch, opts) {
2241
2277
  if (!profileExpr) {
2242
2278
  console.error(
2243
2279
  chalk8.red(
2244
- "No profile specified and no existing installation to inherit from.\nUse --profile to specify one: npx arcane worktree feat/api --profile backend-ts+agile"
2280
+ "No profile specified and no existing installation to inherit from.\nUse --profile to specify one: npx claude-code-arcane worktree feat/api --profile backend-ts+agile"
2245
2281
  )
2246
2282
  );
2247
2283
  process.exit(1);
@@ -2332,7 +2368,7 @@ async function worktreeCommand(branch, opts) {
2332
2368
  } else {
2333
2369
  console.warn(
2334
2370
  chalk8.yellow(
2335
- " WARN: worktree-isolation skill not installed. Add it with: npx arcane add worktree-isolation"
2371
+ " WARN: worktree-isolation skill not installed. Add it with: npx claude-code-arcane add worktree-isolation"
2336
2372
  )
2337
2373
  );
2338
2374
  }
@@ -2622,8 +2658,11 @@ program.command("add <items...>").description(
2622
2658
  });
2623
2659
  program.command("remove <items...>").description(
2624
2660
  "Remove skills or profiles. Use +profileName for profiles, skillName for individual skills."
2625
- ).action(async (items) => {
2626
- await removeCommand(items);
2661
+ ).option(
2662
+ "--source <source>",
2663
+ "Content source: auto, github, or bundled. Defaults to the version recorded in the manifest."
2664
+ ).action(async (items, opts) => {
2665
+ await removeCommand(items, { source: opts.source });
2627
2666
  });
2628
2667
  program.command("list").description("List all available profiles and skills.").action(async () => {
2629
2668
  await listCommand();
@@ -76,7 +76,7 @@ semantic-release commitea el changelog automaticamente con `[skip ci]` para no g
76
76
 
77
77
  Ademas del release automatico, Arcane soporta distribucion hibrida:
78
78
 
79
- - **GitHub source:** `npx arcane install backend-ts --source github` baja contenido directamente del repo
79
+ - **GitHub source:** `npx claude-code-arcane install backend-ts --source github` baja contenido directamente del repo
80
80
  - **Cache local:** contenido descargado se cachea en `~/.arcane/cache/`
81
81
  - **Bundled fallback:** si GitHub no esta disponible, usa el contenido empaquetado en npm
82
82
  - **Auto:** `--source auto` (default) intenta GitHub → cache → bundled
@@ -1,8 +1,8 @@
1
1
  # Skills Catalog — Claude Code Arcane
2
2
 
3
- Los 375 skills disponibles para proyectos consumidores, organizados por division.
3
+ Los 397 skills disponibles para proyectos consumidores, organizados por division.
4
4
 
5
- La tabla cubre 333: 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 355: 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
 
@@ -100,6 +100,26 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
100
100
 
101
101
  ---
102
102
 
103
+ ## Audio (13 skills)
104
+
105
+ | Skill | Descripcion | Uso |
106
+ |-------|-------------|-----|
107
+ | `/audio-bible` | Identidad sonora: paleta, emotional targets por game state, frequency allocation, standards | `[full\|core\|standards]` |
108
+ | `/audio-spec` | SFX spec sheets y event lists con concurrencia, cooldown y prioridad | `[system-name \| all \| events]` |
109
+ | `/music-composition` | Armonia, melodia, forma, groove, orquestacion con salida accionable | `[harmony\|melody\|form\|groove\|orchestration\|analyze]` |
110
+ | `/adaptive-music` | Musica interactiva: layering, re-secuenciacion, stingers, sync points, histeresis | `[design\|layers\|transitions\|stingers\|map]` |
111
+ | `/midi-compose` | Genera `.mid` desde spec JSON con scripts Python stdlib-only | `[spec-path \| new \| validate]` |
112
+ | `/sfx-design` | Capas attack/body/tail, variacion, round-robin, anti-repeticion | `[sound-name \| layers \| variation \| review]` |
113
+ | `/procedural-audio` | Footsteps, viento y ambientes por sintesis; decision y presupuesto de CPU | `[decide \| footsteps \| wind \| ambience \| budget]` |
114
+ | `/ui-sound-design` | Feedback de UI: duraciones y niveles por tipo, jerarquia, haptics, accesibilidad | `[set \| event-name \| review \| haptics]` |
115
+ | `/spatial-audio` | HRTF vs Ambisonics vs panning, atenuacion, oclusion vs obstruccion, presupuesto | `[decide \| hrtf \| ambisonics \| occlusion \| budget]` |
116
+ | `/audio-mix` | Jerarquia de buses, ducking, mix states, masking, loudness | `[buses \| ducking \| states \| loudness \| review]` |
117
+ | `/middleware-integration` | Wwise/FMOD: containers, eventos, Switch/State/RTPC, banks, contrato con codigo | `[structure \| events \| rtpc \| banks \| contract]` |
118
+ | `/voice-pipeline` | VO: naming, script con contexto, casting, barks, localizacion, batch | `[script \| casting \| naming \| loc \| barks]` |
119
+ | `/audio-audit` | QA: voice count, CPU, memoria, leaks, loudness ASWG-R001, conformidad de assets | `[full \| perf \| loudness \| assets \| platform]` |
120
+
121
+ ---
122
+
103
123
  ## General (54 skills)
104
124
 
105
125
  | Skill | Descripcion | Uso |
@@ -434,7 +454,7 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
434
454
 
435
455
  ---
436
456
 
437
- ## Job Hunt (16 skills)
457
+ ## Job Hunt (17 skills)
438
458
 
439
459
  | Skill | Descripcion | Uso |
440
460
  |-------|-------------|-----|
@@ -447,6 +467,7 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
447
467
  | `/job-search` | Busca, scorea y prioriza ofertas + plan de busqueda de 7 dias | `[search <query>\|score <url>\|plan]` |
448
468
  | `/job-scrape` | Busca ofertas (CLIs LinkedIn + GetOnBoard bundleados) con dedup entre corridas, scorea y ofrece crear notas | `[perfil] [--jobage N]` |
449
469
  | `/job-aplicar` | Pipeline completo de una postulacion: fit, CV custom, cover, review, PDF verificado y dashboard | `<url\|nota>` |
470
+ | `/career-registry` | Trazabilidad: contesta si ya te postulaste a una empresa/URL, exporta todo a CSV, audita huecos, notas frenadas y horas por encima de lo estimado. Sirve a empleo y freelance | `[check\|export\|stats\|audit]` |
450
471
  | `/job-outcome` | Registra resultado/avance de una aplicacion y actualiza nota + dashboard | `[empresa]` |
451
472
  | `/job-upskill` | Gaps de skills agregados de las aplicaciones + plan de estudio con recursos reales | `[url\|nota]` |
452
473
  | `/cover-letter` | Cover letters y mensajes de aplicacion concisos y custom | `[application\|company + role]` |
@@ -497,6 +518,29 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
497
518
 
498
519
  ---
499
520
 
521
+ ## Freelance (8 skills)
522
+
523
+ Perfil `+freelance`. Reutiliza ademas 6 skills ya catalogados: `/master-profile`, `/portfolio-site`, `/cold-outreach`, `/job-outcome` (Job Hunt), `/contract-and-proposal-writer` (Business) y `/estimate` (Agile). Comparte el career workspace con `+job-hunt`: una propuesta es una aplicacion con `tipo: freelance`.
524
+
525
+ Las fuentes automaticas son publicas y **sin API key**, para que funcionen apenas se instala el perfil: una fuente con credenciales por usuario dejaria el skill roto para todos menos uno.
526
+
527
+ A los marketplaces (Upwork, Workana, Freelancer.com, PeoplePerHour, Guru), que no tienen API publica, se llega por el modo `web` de `/freelance-scan`: WebSearch en paralelo mas un triage por patron de URL, porque la mitad de lo que devuelve la busqueda son landings y no ofertas. Ese modo descubre pero no lee (WebFetch da 403 en todas), asi que entrega links para abrir y tiene prohibido escribir fechas sin confirmar en el registro.
528
+
529
+ Quien consiga una API key propia la activa poniendo una variable de entorno: `keys` explica como conseguir cada una y avisa si falta. El analisis de cada plataforma, con los codigos medidos, esta en `skills/freelance-scan/references/platforms.md`.
530
+
531
+ | Skill | Descripcion | Uso |
532
+ |-------|-------------|-----|
533
+ | `/freelance-hunt` | Orquestador: extiende el career workspace con contratos y ledger de Connects, define piso de tarifa y capacidad, y rutea | `[setup\|status\|next]` |
534
+ | `/freelance-profile` | Perfil de la plataforma: titulo de nicho, primeros 250 caracteres del overview, portfolio items, specialized profiles y tarifa derivada del piso | `[audit\|title\|overview\|portfolio\|rate]` |
535
+ | `/freelance-scan` | Scorea ofertas (fit tecnico + viabilidad economica + probabilidad de que la oferta exista) con dedup entre corridas. `search` sobre fuentes publicas sin API key (GetOnBrd, Himalayas), `web` llega a los marketplaces via WebSearch + triage de ruido SEO, `market` para tarifas, `keys` para las fuentes con credencial propia | `[search\|web\|market\|keys\|sources\|post pegado]` |
536
+ | `/client-screen` | Riesgo del cliente antes de gastar Connects: payment verificado, hire rate, brecha presupuesto/alcance, red flags. Registra el descarte tambien | `[job-url\|nota\|post]` |
537
+ | `/freelance-proposal` | Propuesta que sobrevive la vista de lista (2 primeras lineas) + bid sobre el piso neto: fijo vs hora, buffer de riesgo, comision | `[nota\|job-url]` |
538
+ | `/freelance-kickoff` | Convierte el contrato ganado en plan: desarma alcance en entregables, criterios de aceptacion, y valida si entra en las horas cotizadas antes de arrancar | `[nota de contrato\|cliente]` |
539
+ | `/freelance-deliver` | Loop de ejecucion: registra horas facturables y no facturables, detecta scope creep el dia que pasa, y cotiza el change order antes de hacer el trabajo | `[log\|check\|change\|close]` |
540
+ | `/freelance-pipeline` | Diagnostico del negocio: ROI de Connects, embudo, tarifa efectiva real neta de horas no facturables, utilizacion, concentracion, scope drift | `[--desde YYYY-MM-DD]` |
541
+
542
+ ---
543
+
500
544
  ## Skills internos de Arcane
501
545
 
502
546
  Estos skills son para mantener y desarrollar el propio repo Arcane: