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.
- package/CHANGELOG.md +29 -0
- package/README.md +57 -55
- package/agents/audio/audio-director.md +90 -0
- package/agents/audio/audio-programmer.md +97 -0
- package/agents/audio/audio-qa.md +95 -0
- package/agents/audio/composer.md +88 -0
- package/agents/audio/technical-sound-designer.md +90 -0
- package/agents/audio/voice-director.md +96 -0
- package/agents/career/career-strategist.md +88 -0
- package/agents/career/cv-reviewer.md +81 -0
- package/agents/career/hiring-manager.md +68 -0
- package/agents/career/mock-interviewer.md +76 -0
- package/agents/freelance/client-screener.md +84 -0
- package/agents/freelance/discovery-call.md +65 -0
- package/agents/freelance/pipeline-strategist.md +99 -0
- package/agents/freelance/proposal-reviewer.md +82 -0
- package/dist/cli.js +52 -13
- package/docs/RELEASE-SETUP.md +1 -1
- package/docs/SKILLS-CATALOG.md +47 -3
- package/docs/USER-GUIDE.md +77 -72
- package/docs/agent-hierarchy.md +21 -1
- package/docs/presentations/build_arcane_deck.py +2 -2
- package/docs/presentations/build_arcane_deck_12.py +2 -2
- package/package.json +2 -2
- package/profiles/audio.yaml +45 -0
- package/profiles/freelance.yaml +43 -0
- package/profiles/job-hunt.yaml +5 -2
- package/rules/drafter-reviewer.md +16 -3
- package/rules/freelance-guardrails.md +53 -0
- package/rules/gamedev/audio-code.md +45 -0
- package/skills/adaptive-music/SKILL.md +171 -0
- package/skills/adaptive-music/references/anti-patterns.md +53 -0
- package/skills/audio-audit/SKILL.md +164 -0
- package/skills/audio-audit/references/anti-patterns.md +65 -0
- package/skills/audio-audit/scripts/check_assets.py +208 -0
- package/skills/audio-bible/SKILL.md +119 -0
- package/skills/audio-bible/references/anti-patterns.md +39 -0
- package/skills/audio-mix/SKILL.md +151 -0
- package/skills/audio-mix/references/anti-patterns.md +65 -0
- package/skills/audio-spec/SKILL.md +107 -0
- package/skills/audio-spec/references/anti-patterns.md +45 -0
- package/skills/career-registry/SKILL.md +95 -0
- package/skills/career-registry/scripts/career_registry.py +488 -0
- package/skills/client-screen/SKILL.md +83 -0
- package/skills/client-screen/references/red-flags.md +95 -0
- package/skills/cover-letter/SKILL.md +4 -3
- package/skills/cv-tailor/SKILL.md +11 -2
- package/skills/freelance-deliver/SKILL.md +90 -0
- package/skills/freelance-hunt/SKILL.md +126 -0
- package/skills/freelance-hunt/references/templates/Connects.md +39 -0
- package/skills/freelance-hunt/references/templates/Contrato.md +60 -0
- package/skills/freelance-hunt/references/templates/Propuesta.md +66 -0
- package/skills/freelance-kickoff/SKILL.md +94 -0
- package/skills/freelance-pipeline/SKILL.md +109 -0
- package/skills/freelance-pipeline/scripts/import_history.py +425 -0
- package/skills/freelance-profile/SKILL.md +93 -0
- package/skills/freelance-proposal/SKILL.md +112 -0
- package/skills/freelance-scan/SKILL.md +196 -0
- package/skills/freelance-scan/references/dedup.md +35 -0
- package/skills/freelance-scan/references/platforms.md +167 -0
- package/skills/freelance-scan/scripts/freelance_search.py +1077 -0
- package/skills/interview-prep/SKILL.md +11 -3
- package/skills/job-aplicar/SKILL.md +5 -1
- package/skills/job-hunt/SKILL.md +17 -0
- package/skills/job-outcome/SKILL.md +15 -1
- package/skills/job-upskill/SKILL.md +10 -2
- package/skills/middleware-integration/SKILL.md +186 -0
- package/skills/middleware-integration/references/anti-patterns.md +69 -0
- package/skills/midi-compose/SKILL.md +136 -0
- package/skills/midi-compose/references/smf-format.md +129 -0
- package/skills/midi-compose/scripts/compose_midi.py +326 -0
- package/skills/midi-compose/templates/example-composition.json +69 -0
- package/skills/music-composition/SKILL.md +106 -0
- package/skills/music-composition/references/form.md +57 -0
- package/skills/music-composition/references/game-music.md +82 -0
- package/skills/music-composition/references/harmony.md +82 -0
- package/skills/music-composition/references/melody.md +48 -0
- package/skills/music-composition/references/orchestration.md +69 -0
- package/skills/music-composition/references/rhythm-groove.md +49 -0
- package/skills/procedural-audio/SKILL.md +157 -0
- package/skills/procedural-audio/references/anti-patterns.md +45 -0
- package/skills/sfx-design/SKILL.md +130 -0
- package/skills/sfx-design/references/anti-patterns.md +53 -0
- package/skills/spatial-audio/SKILL.md +139 -0
- package/skills/spatial-audio/references/anti-patterns.md +53 -0
- package/skills/ui-sound-design/SKILL.md +133 -0
- package/skills/ui-sound-design/references/anti-patterns.md +57 -0
- package/skills/voice-pipeline/SKILL.md +150 -0
- 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 (
|
|
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
|
-
).
|
|
2626
|
-
|
|
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();
|
package/docs/RELEASE-SETUP.md
CHANGED
|
@@ -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
|
package/docs/SKILLS-CATALOG.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Skills Catalog — Claude Code Arcane
|
|
2
2
|
|
|
3
|
-
Los
|
|
3
|
+
Los 397 skills disponibles para proyectos consumidores, organizados por division.
|
|
4
4
|
|
|
5
|
-
La tabla cubre
|
|
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 (
|
|
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:
|