claude-code-arcane 1.4.0 → 2.1.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 (84) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +5 -4
  3. package/dist/cli.js +2 -0
  4. package/docs/SKILLS-CATALOG.md +30 -3
  5. package/docs/USER-GUIDE.md +2 -2
  6. package/docs/coding-standards.md +26 -0
  7. package/package.json +2 -1
  8. package/profiles/job-hunt.yaml +12 -2
  9. package/profiles/second-brain.yaml +37 -0
  10. package/rules/drafter-reviewer.md +39 -0
  11. package/rules/vault-conventions.md +144 -0
  12. package/skills/brain-dump/SKILL.md +53 -0
  13. package/skills/cold-outreach/SKILL.md +10 -10
  14. package/skills/cold-outreach/references/recruiter-playbook.md +5 -5
  15. package/skills/cover-letter/SKILL.md +8 -8
  16. package/skills/cv-ats-export/SKILL.md +19 -6
  17. package/skills/cv-ats-export/scripts/cv_export.py +49 -4
  18. package/skills/cv-ats-export/scripts/verify_pdf.py +90 -0
  19. package/skills/cv-tailor/SKILL.md +7 -7
  20. package/skills/cv-tailor/references/ats-keywords.md +9 -9
  21. package/skills/hub-note/SKILL.md +68 -0
  22. package/skills/interview-prep/SKILL.md +7 -7
  23. package/skills/interview-prep/references/star-framework.md +10 -10
  24. package/skills/job-aplicar/SKILL.md +88 -0
  25. package/skills/job-hunt/SKILL.md +20 -13
  26. package/skills/job-hunt/references/templates/Aplicacion.md +6 -2
  27. package/skills/job-hunt/references/templates/CV Custom.md +1 -1
  28. package/skills/job-hunt/references/templates/Contacto.md +1 -1
  29. package/skills/job-hunt/references/templates/Dashboard.md +19 -15
  30. package/skills/job-hunt/references/templates/Perfil.md +2 -2
  31. package/skills/job-outcome/SKILL.md +55 -0
  32. package/skills/job-scrape/SKILL.md +95 -0
  33. package/skills/job-scrape/references/dedup-playbook.md +25 -0
  34. package/skills/job-scrape/references/getonbrd-cli.md +62 -0
  35. package/skills/job-scrape/references/getonbrd-urls.md +37 -0
  36. package/skills/job-scrape/references/linkedin-cli.md +64 -0
  37. package/skills/job-scrape/references/linkedin-urls.md +42 -0
  38. package/skills/job-scrape/references/seen_jobs.schema.json +68 -0
  39. package/skills/job-scrape/scripts/getonbrd_search.py +501 -0
  40. package/skills/job-scrape/scripts/linkedin_search.py +428 -0
  41. package/skills/job-search/SKILL.md +22 -19
  42. package/skills/job-search/references/scoring-rubric.md +8 -8
  43. package/skills/job-upskill/SKILL.md +58 -0
  44. package/skills/linkedin-optimize/SKILL.md +5 -5
  45. package/skills/master-profile/SKILL.md +17 -17
  46. package/skills/network-map/SKILL.md +7 -7
  47. package/skills/obsidian-bases/SKILL.md +85 -0
  48. package/skills/obsidian-bases/references/bases-syntax.md +123 -0
  49. package/skills/obsidian-canvas/SKILL.md +91 -0
  50. package/skills/obsidian-markdown/SKILL.md +110 -0
  51. package/skills/pdf-generator/scripts/fill_inspect.py +2 -0
  52. package/skills/pdf-generator/scripts/render_body.py +2 -0
  53. package/skills/personal-brand/SKILL.md +10 -10
  54. package/skills/personal-brand/references/post-pillars.md +14 -14
  55. package/skills/portfolio-site/SKILL.md +11 -11
  56. package/skills/review-dump/SKILL.md +108 -0
  57. package/skills/review-monthly/SKILL.md +56 -0
  58. package/skills/review-weekly/SKILL.md +91 -0
  59. package/skills/second-brain/SKILL.md +211 -0
  60. package/skills/second-brain/hooks/hooks.json +16 -0
  61. package/skills/second-brain/hooks/validate-note.sh +85 -0
  62. package/skills/second-brain/references/cross-project.md +57 -0
  63. package/skills/second-brain/references/templates/Atomic.md +22 -0
  64. package/skills/second-brain/references/templates/Daily.md +25 -0
  65. package/skills/second-brain/references/templates/Dashboard.base +70 -0
  66. package/skills/second-brain/references/templates/Dump.md +11 -0
  67. package/skills/second-brain/references/templates/Hub.md +22 -0
  68. package/skills/second-brain/references/templates/Monthly.md +29 -0
  69. package/skills/second-brain/references/templates/Weekly.md +29 -0
  70. package/skills/second-brain/references/templates/codebases.md +37 -0
  71. package/skills/second-brain/references/templates/hot.md +37 -0
  72. package/skills/second-brain/references/templates/vault-CLAUDE.md +127 -0
  73. package/skills/vault-audit/SKILL.md +72 -0
  74. package/skills/vault-audit/scripts/vault_audit.py +539 -0
  75. package/skills/vault-clip/SKILL.md +73 -0
  76. package/skills/vault-recall/SKILL.md +82 -0
  77. package/skills/vault-recall/scripts/vault_index.py +626 -0
  78. package/skills/vault-tidy/SKILL.md +76 -0
  79. package/skills/xlsx-generator/scripts/formula_check.py +2 -0
  80. package/skills/xlsx-generator/scripts/libreoffice_recalc.py +2 -0
  81. package/skills/xlsx-generator/scripts/xlsx_add_column.py +2 -0
  82. package/skills/xlsx-generator/scripts/xlsx_insert_row.py +2 -0
  83. package/skills/xlsx-generator/scripts/xlsx_reader.py +2 -0
  84. package/skills/zettel/SKILL.md +66 -0
package/CHANGELOG.md CHANGED
@@ -1,3 +1,58 @@
1
+ # [2.1.0](https://github.com/SebastianLuser/claude-code-arcane/compare/v2.0.0...v2.1.0) (2026-08-04)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **ci:** group concurrency by branch name so a push really runs once ([54a83b7](https://github.com/SebastianLuser/claude-code-arcane/commit/54a83b729c9a82213880cf02de0bf44098040d38))
7
+ * **ci:** scope the concurrency group per event, not per branch ([1ce5273](https://github.com/SebastianLuser/claude-code-arcane/commit/1ce52739a7182f29b51af68b00b6164fc6911b72)), closes [#7](https://github.com/SebastianLuser/claude-code-arcane/issues/7)
8
+
9
+
10
+ ### Features
11
+
12
+ * related notes, doc-count and python-floor guards, .base dashboard ([f4fe5c6](https://github.com/SebastianLuser/claude-code-arcane/commit/f4fe5c65deedf0ad247aaa31edfb2498183092e1))
13
+ * **second-brain:** add a hot context cache, note maturity, and cross-project reads ([9b1669f](https://github.com/SebastianLuser/claude-code-arcane/commit/9b1669f2b9808d2815a653fa34acd62531274bd0))
14
+ * **second-brain:** add Obsidian second brain profile ([882c836](https://github.com/SebastianLuser/claude-code-arcane/commit/882c83680efcb3d345888486423fad3d73f2d176))
15
+ * **second-brain:** resolve paths by role, add ranked recall, cache the inventory ([f4c9c7c](https://github.com/SebastianLuser/claude-code-arcane/commit/f4c9c7c8bbf27a4388598cdec50ed9a1141bdf7a))
16
+ * **second-brain:** who-writes-what classes, a code bridge, and sync rules ([03236d2](https://github.com/SebastianLuser/claude-code-arcane/commit/03236d20fdcee3aa55e1b26056021a0334c5497d))
17
+
18
+ # [2.0.0](https://github.com/SebastianLuser/claude-code-arcane/compare/v1.4.0...v2.0.0) (2026-07-27)
19
+
20
+
21
+ * refactor(job-scrape)!: port both search CLIs from TypeScript to Python ([4a30a3e](https://github.com/SebastianLuser/claude-code-arcane/commit/4a30a3e7b30cbf616d01b860620172c602e5c6cf))
22
+
23
+
24
+ ### Bug Fixes
25
+
26
+ * **cv-ats-export:** tell a missing verify_pdf.py apart from a missing pypdf ([f2b907e](https://github.com/SebastianLuser/claude-code-arcane/commit/f2b907e4f844725abe2b967941cef78d5fb98a0d))
27
+ * **installer:** skip Python bytecode when copying skill assets ([525967d](https://github.com/SebastianLuser/claude-code-arcane/commit/525967d0270058b9cb5967c932a4969b23e4ea27))
28
+ * **job-scrape:** accept share-button LinkedIn URLs in detail ([7f874e7](https://github.com/SebastianLuser/claude-code-arcane/commit/7f874e71007214540c5814561f8c5e9d46848cea))
29
+ * **job-scrape:** read published dates as UTC in the jobage filter ([fa8e4d7](https://github.com/SebastianLuser/claude-code-arcane/commit/fa8e4d73e68fb1b3f8071cbdd15b1da53882d6e2))
30
+
31
+
32
+ ### Features
33
+
34
+ * **cv-ats-export:** add ATS text-layer verification to PDF export ([dd79cc9](https://github.com/SebastianLuser/claude-code-arcane/commit/dd79cc966f88fc3e2ab38a8ebfcc1b51f4f1ad5f))
35
+ * **job-hunt:** adopt extended application-state vocabulary and route to new skills ([4a39add](https://github.com/SebastianLuser/claude-code-arcane/commit/4a39add45301841625581ad4a42bb54442c51a8f))
36
+ * **job-scrape:** confirm the LinkedIn ToS warning before running the CLIs ([294d905](https://github.com/SebastianLuser/claude-code-arcane/commit/294d9054b8c1014bde5babdce928da6d61570102))
37
+ * **profiles:** add job-search tooling suite to job-hunt profile ([b4b061a](https://github.com/SebastianLuser/claude-code-arcane/commit/b4b061a8d724a2f9b4e94c40e83890d564ee9fd8))
38
+ * **rules:** add drafter-reviewer rule for CV and cover review ([8467c38](https://github.com/SebastianLuser/claude-code-arcane/commit/8467c38b2b0e7af98838c3a4d91c3bb0dd36b8c4))
39
+ * **skills:** add job-aplicar, job-outcome and job-upskill skills ([0401ca7](https://github.com/SebastianLuser/claude-code-arcane/commit/0401ca7e0c79b9e619ad064bb726a31d646b3fd3))
40
+ * **skills:** add job-scrape skill with bundled linkedin/getonbrd CLIs ([562bd7b](https://github.com/SebastianLuser/claude-code-arcane/commit/562bd7bd261567efcfaaa17c871f80e47a3f0824))
41
+
42
+
43
+ ### Performance Improvements
44
+
45
+ * **job-scrape:** add --brief to trim JD text from GetOnBoard search ([f2309e5](https://github.com/SebastianLuser/claude-code-arcane/commit/f2309e59ffd670894829a0730763d71733e2bffd))
46
+
47
+
48
+ ### BREAKING CHANGES
49
+
50
+ * the CLI paths changed from
51
+ scripts/<portal>-search/cli.ts to scripts/<portal>_search.py, and the profile's
52
+ Bash permissions moved from node to python. Reinstall the job-hunt profile.
53
+
54
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
55
+
1
56
  # [1.4.0](https://github.com/SebastianLuser/claude-code-arcane/compare/v1.3.0...v1.4.0) (2026-06-22)
2
57
 
3
58
 
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Claude Code Arcane
2
2
 
3
- > **333 skills, 87 agents, 15 hooks and 19 rules for Claude Code — selective deploy by profile.**
3
+ > **375 skills, 92 agents, 16 hooks and 25 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
 
@@ -192,8 +192,9 @@ Once installed, manage the installation from within a Claude Code session:
192
192
  | `+finance` | Investment analysis, financial modeling, SaaS metrics | 3 | business |
193
193
  | `+marketing` | Content, growth, SEO/CRO, strategy, analytics | 44 | marketing |
194
194
  | `+regulatory` | ISO 13485, GDPR, FDA, SOC 2, ISMS, QMS, MDR | 13 | regulatory |
195
- | `+job-hunt` | Job search end-to-end — master profile, ATS CV, LinkedIn, portfolio, cover letters, outreach, interview prep | 12 | — |
195
+ | `+job-hunt` | Job search end-to-end — master profile, ATS CV with verification, job scraping with dedup, LinkedIn, portfolio, cover letters, outreach, interview prep | 16 | — |
196
196
  | `+ecommerce` | Commerce end-to-end agnóstico de lenguaje — data model, checkout, inventario, órdenes, pagos, promociones, shipping/tax, listings, analytics, feeds, storefront, suscripciones | 12 | ecommerce |
197
+ | `+second-brain` | Second brain en Obsidian — captura sin fricción, reviews diario/semanal/mensual, notas atómicas y hub files (PARA + Zettelkasten), búsqueda con ranking, caché de contexto entre sesiones, auditoría de salud del vault, sintaxis nativa (markdown, Bases, Canvas) | 14 | — |
197
198
  | `+self-improving` | Agent self-improvement and skill extraction | 2 | — |
198
199
  | `+statusline` | Claude Code status bar (branch, division, session info) | 0 | — |
199
200
 
@@ -348,11 +349,11 @@ claude-code-arcane/
348
349
  │ ├── manifest.ts # Read/write arcane-manifest.json
349
350
  │ ├── types.ts # TypeScript interfaces
350
351
  │ └── utils.ts # Cross-platform helpers
351
- ├── skills/ # 333 skills (flat, one dir per skill)
352
+ ├── skills/ # 375 skills (flat, one dir per skill)
352
353
  ├── profiles/ # 29 profiles (YAML)
353
354
  ├── agents/ # 13 dirs, 86+ agents (Markdown)
354
355
  ├── hooks/ # 15 lifecycle hooks (Bash)
355
- ├── rules/ # 19 rules (Markdown)
356
+ ├── rules/ # 25 rules (Markdown)
356
357
  ├── templates/ # Gamedev templates
357
358
  ├── docs/ # Documentation
358
359
  └── skills-selftest/ # QA framework
package/dist/cli.js CHANGED
@@ -117,9 +117,11 @@ function getPackageRoot() {
117
117
  const thisFile = fileURLToPath(import.meta.url);
118
118
  return path2.resolve(path2.dirname(thisFile), "..");
119
119
  }
120
+ var COPY_SKIP = /* @__PURE__ */ new Set(["__pycache__", ".pytest_cache"]);
120
121
  function copyDirSync(src, dest) {
121
122
  fs2.mkdirSync(dest, { recursive: true });
122
123
  for (const entry of fs2.readdirSync(src, { withFileTypes: true })) {
124
+ if (COPY_SKIP.has(entry.name) || entry.name.endsWith(".pyc")) continue;
123
125
  const srcPath = path2.join(src, entry.name);
124
126
  const destPath = path2.join(dest, entry.name);
125
127
  if (entry.isDirectory()) {
@@ -1,6 +1,8 @@
1
1
  # Skills Catalog — Claude Code Arcane
2
2
 
3
- Catalogo completo de los 333 skills disponibles para proyectos consumidores. Organizados por division.
3
+ Los 375 skills disponibles para proyectos consumidores, organizados por division.
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.
4
6
 
5
7
  ## Como ejecutar un skill
6
8
 
@@ -98,7 +100,7 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
98
100
 
99
101
  ---
100
102
 
101
- ## General (55 skills)
103
+ ## General (54 skills)
102
104
 
103
105
  | Skill | Descripcion | Uso |
104
106
  |-------|-------------|-----|
@@ -432,7 +434,7 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
432
434
 
433
435
  ---
434
436
 
435
- ## Job Hunt (12 skills)
437
+ ## Job Hunt (16 skills)
436
438
 
437
439
  | Skill | Descripcion | Uso |
438
440
  |-------|-------------|-----|
@@ -443,6 +445,10 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
443
445
  | `/linkedin-optimize` | Optimiza LinkedIn: headline, About, experiencia con KPIs, keywords, value prop, pitch 30s | `[section\|full]` |
444
446
  | `/portfolio-site` | Genera/actualiza portfolio web desde el source-of-truth | `[sync\|scaffold] [repo\|--new]` |
445
447
  | `/job-search` | Busca, scorea y prioriza ofertas + plan de busqueda de 7 dias | `[search <query>\|score <url>\|plan]` |
448
+ | `/job-scrape` | Busca ofertas (CLIs LinkedIn + GetOnBoard bundleados) con dedup entre corridas, scorea y ofrece crear notas | `[perfil] [--jobage N]` |
449
+ | `/job-aplicar` | Pipeline completo de una postulacion: fit, CV custom, cover, review, PDF verificado y dashboard | `<url\|nota>` |
450
+ | `/job-outcome` | Registra resultado/avance de una aplicacion y actualiza nota + dashboard | `[empresa]` |
451
+ | `/job-upskill` | Gaps de skills agregados de las aplicaciones + plan de estudio con recursos reales | `[url\|nota]` |
446
452
  | `/cover-letter` | Cover letters y mensajes de aplicacion concisos y custom | `[application\|company + role]` |
447
453
  | `/cold-outreach` | Mensajes en frio a recruiters/hiring managers + follow-ups post-aplicacion | `[contact\|recruiter + company]` |
448
454
  | `/interview-prep` | Prep de entrevista: research, banco de preguntas, respuestas STAR, red flags | `[application\|company + role + round]` |
@@ -451,6 +457,27 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
451
457
 
452
458
  ---
453
459
 
460
+ ## Second Brain (14 skills)
461
+
462
+ | Skill | Descripcion | Uso |
463
+ |-------|-------------|-----|
464
+ | `/second-brain` | Entry point: crea o adopta el vault (PARA + Zettelkasten + hub files), escribe su CLAUDE.md y su cache hot.md, detecta plugins, conecta otros proyectos al mismo vault y rutea | `[setup\|adopt\|status\|next\|link]` |
465
+ | `/brain-dump` | Captura sin friccion al dump del dia: sin tags, sin clasificar, sin decidir donde va | `[texto a capturar]` |
466
+ | `/review-dump` | Procesa el dump: clasifica item por item con confirmacion, actualiza hubs, rutea tareas y crea el daily | `[today\|YYYY-MM-DD]` |
467
+ | `/review-weekly` | Retrospectiva semanal: temas recurrentes, hilos abiertos y tareas hechas vs no hechas | `[current\|YYYY-Www\|YYYY-MM-DD]` |
468
+ | `/review-monthly` | Retrospectiva mensual: patrones, logros con evidencia, semillas y salud del vault | `[current\|YYYY-MM]` |
469
+ | `/zettel` | Nota atomica con el criterio de cuando una idea pasa de nota de proyecto a permanente | `[idea\|ruta#seccion\|dump YYYY-MM-DD]` |
470
+ | `/hub-note` | Hub file (MOC) por entidad que importa: el tejido entre PARA y Zettelkasten | `[entidad] [--update]` |
471
+ | `/vault-recall` | Busqueda con ranking (BM25, acentos plegados, expansion por alias) y notas relacionadas por vocabulario compartido, via indice cacheado | `<consulta> \| related <nota> [-n N]` |
472
+ | `/vault-clip` | URL a nota limpia: contenido sin menus ni banners, con resumen propio y fuente | `<url> [--full\|--summary]` |
473
+ | `/vault-audit` | Reporte de salud via script Python: huerfanas, links roto, stale, semillas que no crecieron, contradicciones, tag sprawl, nombres duplicados. Read-only | `[--vault <path>] [--stale-days N]` |
474
+ | `/vault-tidy` | Aplica los arreglos del audit con approval item por item. Nunca borra, archiva | `[orphans\|broken\|duplicates\|tasks\|frontmatter\|archive\|all]` |
475
+ | `/obsidian-markdown` | Sintaxis Obsidian: wikilinks, embeds, callouts, block IDs, propiedades. Valida o corrige una nota | `[reference\|check <archivo>\|fix <archivo>]` |
476
+ | `/obsidian-bases` | Archivos .base: vistas, filtros, formulas y summaries. Incluye migracion desde Dataview | `[create <desc>\|explain <archivo>\|migrate <query>]` |
477
+ | `/obsidian-canvas` | Archivos .canvas (JSON Canvas): nodos, grupos y edges con direccion y color | `[create <desc>\|explain <archivo>\|edit <archivo>]` |
478
+
479
+ ---
480
+
454
481
  ## E-Commerce (12 skills)
455
482
 
456
483
  | Skill | Descripcion | Uso |
@@ -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 **333 skills**, **87 agents**, **15 hooks**, and **19 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 **375 skills**, **92 agents**, **16 hooks**, and **25 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
 
@@ -536,7 +536,7 @@ Yes, and it's recommended. This way everyone on the team gets the same Claude Co
536
536
 
537
537
  ### How many tokens does a profile consume?
538
538
 
539
- Each skill adds ~30-100 tokens to the system prompt. A typical base profile (20-30 skills) adds ~1-2k tokens. The core profile adds ~500 tokens. Compare that to loading all 333 skills, which is why selective deploy matters.
539
+ Each skill adds ~30-100 tokens to the system prompt. A typical base profile (20-30 skills) adds ~1-2k tokens. The core profile adds ~500 tokens. Compare that to loading all 375 skills, which is why selective deploy matters.
540
540
 
541
541
  ### Why replace instead of merge on install?
542
542
 
@@ -18,6 +18,32 @@ Las rules path-scoped específicas viven en `.claude/rules/`.
18
18
 
19
19
  ---
20
20
 
21
+ ## Elección de lenguaje en este repo
22
+
23
+ El lenguaje lo dicta **el contexto de ejecución**, no la preferencia. Hay cuatro contextos y uno solo por cada uno:
24
+
25
+ | Contexto | Lenguaje | Por qué | Garantía en CI |
26
+ |---|---|---|---|
27
+ | Installer (`src/`) | **TypeScript** | Es el paquete npm publicado: el único código con build (`tsup`) y typechecker | `npm run build`, `tsc --noEmit`, `vitest` |
28
+ | Hooks de lifecycle (`hooks/`, `skills/*/hooks/`) | **Bash** | Claude Code los invoca por path, sin intérprete de por medio | `bash -n` sobre todos |
29
+ | Scripts de skill (`skills/*/scripts/`) | **Python 3, solo stdlib** | Se copian al proyecto del usuario y corren ahí: sin build, sin `package.json`, sin `node_modules` | Specs en `tests/` (ver Testing) |
30
+ | Templates (`*/templates/`) | **El del proyecto destino** | Son contenido que se emite al proyecto del usuario; el repo nunca los ejecuta | N/A |
31
+
32
+ **TypeScript fuera de `src/` no es una elección de lenguaje: es un requisito de runtime disfrazado.** Sin build step, un `.ts` solo corre con el type stripping nativo de Node 24+, que la matriz de CI (20 y 22) no cubre. Si el script tiene que correr en la máquina del usuario, es Python.
33
+
34
+ **Dependencias opcionales:** permitidas solo con degradación explícita. Referencia: `cv-ats-export` usa `pypdf` si está y reporta `[ATS SKIP]` si no, sin romper el export.
35
+
36
+ ### Escotilla de escape
37
+
38
+ Otro lenguaje **únicamente cuando una dependencia obligatoria lo impone** — nunca por gusto ni por familiaridad. Requiere una línea de justificación en el SKILL.md del skill. Los dos casos vigentes:
39
+
40
+ - `pdf-generator/scripts/render_cover.js` → Node, porque **Playwright es una librería de Node**.
41
+ - `docx-generator/scripts/` (`.cs`, `.slnx`, `setup.ps1`) → .NET, porque **vendorea un proyecto .NET** (MiniMaxAIDocx); el `.ps1` es su setup en Windows.
42
+
43
+ Si podés hacerlo con la stdlib de Python, la escotilla no aplica.
44
+
45
+ ---
46
+
21
47
  ## Naming
22
48
 
23
49
  - **Variables/funciones:** camelCase (JS/TS/Java/C#) o snake_case (Python/Rust) o PascalCase (Go exports)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-arcane",
3
- "version": "1.4.0",
3
+ "version": "2.1.0",
4
4
  "description": "Skills, agents, hooks and rules for Claude Code — installable via npx arcane",
5
5
  "type": "module",
6
6
  "bin": {
@@ -22,6 +22,7 @@
22
22
  "dev": "tsup src/cli.ts --format esm --target node20 --watch",
23
23
  "test": "vitest run",
24
24
  "test:watch": "vitest",
25
+ "test:skills": "python -m unittest discover -s tests -p \"test_*.py\"",
25
26
  "prepublishOnly": "npm run build",
26
27
  "release": "semantic-release"
27
28
  },
@@ -1,5 +1,5 @@
1
1
  name: job-hunt
2
- description: "Job Hunt — busqueda laboral end-to-end: perfil maestro, CV ATS, LinkedIn, portfolio, cover letters, outreach a recruiters, scoring de ofertas y prep de entrevistas"
2
+ description: "Job Hunt — busqueda laboral end-to-end: perfil maestro, CV ATS con verificacion, scraping de ofertas con dedup, pipeline de postulacion, LinkedIn, portfolio, cover letters, outreach a recruiters, scoring de ofertas, gaps/upskill y prep de entrevistas"
3
3
  type: addon
4
4
 
5
5
  skills:
@@ -10,6 +10,10 @@ skills:
10
10
  - linkedin-optimize
11
11
  - portfolio-site
12
12
  - job-search
13
+ - job-scrape
14
+ - job-aplicar
15
+ - job-outcome
16
+ - job-upskill
13
17
  - cover-letter
14
18
  - cold-outreach
15
19
  - interview-prep
@@ -18,7 +22,7 @@ skills:
18
22
 
19
23
  rules:
20
24
  universal:
21
- []
25
+ - drafter-reviewer
22
26
  gamedev:
23
27
  []
24
28
 
@@ -29,7 +33,13 @@ permissions:
29
33
  allow:
30
34
  - "Bash(python *cv_export.py*)"
31
35
  - "Bash(python3 *cv_export.py*)"
36
+ - "Bash(python *verify_pdf.py*)"
37
+ - "Bash(python3 *verify_pdf.py*)"
32
38
  - "Bash(python *network_map.py*)"
33
39
  - "Bash(python3 *network_map.py*)"
40
+ - "Bash(python *linkedin_search.py*)"
41
+ - "Bash(python3 *linkedin_search.py*)"
42
+ - "Bash(python *getonbrd_search.py*)"
43
+ - "Bash(python3 *getonbrd_search.py*)"
34
44
  deny:
35
45
  []
@@ -0,0 +1,37 @@
1
+ name: second-brain
2
+ description: "Second Brain — vault de Obsidian gestionado con Claude Code: captura sin friccion, reviews diario/semanal/mensual, notas atomicas y hub files (PARA + Zettelkasten), busqueda con ranking, captura web, auditoria de salud del vault y sintaxis nativa de Obsidian (markdown, Bases, Canvas)"
3
+ type: addon
4
+
5
+ skills:
6
+ - second-brain
7
+ - brain-dump
8
+ - review-dump
9
+ - review-weekly
10
+ - review-monthly
11
+ - zettel
12
+ - hub-note
13
+ - vault-recall
14
+ - vault-clip
15
+ - vault-audit
16
+ - vault-tidy
17
+ - obsidian-markdown
18
+ - obsidian-bases
19
+ - obsidian-canvas
20
+
21
+ rules:
22
+ universal:
23
+ - vault-conventions
24
+ gamedev:
25
+ []
26
+
27
+ agents:
28
+ []
29
+
30
+ permissions:
31
+ allow:
32
+ - "Bash(python *vault_audit.py*)"
33
+ - "Bash(python3 *vault_audit.py*)"
34
+ - "Bash(python *vault_index.py*)"
35
+ - "Bash(python3 *vault_index.py*)"
36
+ deny:
37
+ []
@@ -0,0 +1,39 @@
1
+ # Drafter-Reviewer Rule (CVs y covers)
2
+
3
+ Adaptado del workflow `/apply` de MadsLorentzen/ai-job-search. Todo CV custom o cover letter para una aplicación pasa por un reviewer de contexto fresco ANTES de exportarse a PDF. El que redacta no se auto-revisa.
4
+
5
+ Las rutas son relativas al career workspace (`./career-workspace/` o env `CAREER_WORKSPACE`).
6
+
7
+ ## Cuándo aplica
8
+
9
+ - Al terminar el borrador de un CV custom (flujo cv-tailor) o de una cover / mensaje de aplicación (flujo cover-letter) destinado a una postulación concreta.
10
+ - NO aplica a ediciones menores de un CV ya revisado (typos, cambiar una fecha) ni a los CVs base de `02-CVs/` fuera de una postulación.
11
+
12
+ ## El paso reviewer
13
+
14
+ Lanzar UN agente `general-purpose` de contexto fresco vía el Agent tool, con este contenido inline en el prompt (para que no dependa de leer archivos de la conversación):
15
+
16
+ 1. El texto completo de la job description.
17
+ 2. El borrador del CV y/o cover, verbatim.
18
+ 3. Instrucción de lectura acotada: solo puede leer `01-Perfiles/<perfil usado>.md` del workspace. NO debe leer los templates ni el resto del workspace - critica contenido, no estructura.
19
+ 4. Instrucción de research: búsqueda web breve sobre la empresa (misión, producto, noticias recientes, cultura) para detectar ángulos no aprovechados.
20
+
21
+ El reviewer devuelve dos partes:
22
+
23
+ - **Parte A - reemplazos mecánicos:** lista JSON de objetos `{ "old_string": "<texto exacto del borrador>", "new_string": "<reemplazo>", "motivo": "<una línea>" }`. El `old_string` debe ser cita textual para aplicarse con Edit sin ambigüedad.
24
+ - **Parte B - sugerencias narrativas**, agrupadas por categoría:
25
+ - Keywords ATS de la JD que faltan o aparecen solo como sinónimo
26
+ - Ángulos de empresa no aprovechados (del research)
27
+ - Bullets que se pueden reformular como logro medible
28
+ - Tono / estilo (registro, longitud, muletillas)
29
+
30
+ ## Reglas de aplicación del feedback
31
+
32
+ - **Una sola ronda.** El drafter aplica la Parte A, incorpora de la Parte B lo que corresponda, y sigue. Sin ida y vuelta iterativo.
33
+ - **Never stuff keywords:** si una keyword de la JD es un gap real del candidato, NO se agrega al CV; se reconoce honestamente en el cover si vale la pena.
34
+ - Nada de guiones largos en el resultado final: si el reviewer sugiere texto con em-dash o en-dash, se normaliza a `-` al aplicarlo.
35
+ - Recién después de aplicar el feedback se exporta: `python .claude/skills/cv-ats-export/scripts/cv_export.py "<CV>"` (o la copia instalada en `<workspace>/tools/`; incluye verificación ATS automática de la capa de texto).
36
+
37
+ ## Registro
38
+
39
+ En la nota de aplicación (`03-Aplicaciones/`), dejar en `## Notas` un resumen de 3-5 decisiones de tailoring (qué se enfatizó, qué ángulo de empresa se usó, qué gap se reconoció). Sirve para calibrar futuras aplicaciones y para el prep de entrevista.
@@ -0,0 +1,144 @@
1
+ # Vault Conventions Rule (second brain en Obsidian)
2
+
3
+ Reglas que gobiernan toda escritura dentro de un vault de Obsidian. Existen porque un agente que escribe notas sin restricciones degrada el vault mas rapido de lo que lo construye: linkea todo con todo, arrastra tareas en silencio y renombra archivos rompiendo `[[wikilinks]]`.
4
+
5
+ Las rutas son relativas al vault (`--vault`, env `OBSIDIAN_VAULT`, o el directorio actual si contiene `.obsidian/`).
6
+
7
+ ## Cuando aplica
8
+
9
+ - Cualquier skill del profile `second-brain` que cree o edite notas.
10
+ - Cualquier escritura en un directorio que contenga `.obsidian/`, incluso desde otro skill.
11
+ - NO aplica a los archivos de configuracion del vault (`.obsidian/**`): no se tocan nunca sin pedido explicito del usuario.
12
+
13
+ ## Quién escribe cada archivo
14
+
15
+ Antes de tocar cualquier cosa, la pregunta es de quién es ese archivo. Hay tres clases y el permiso de escritura es distinto en cada una. Adaptado de la distinción **autorado / proyectado** de la base de conocimiento de producto de Educabot, que es la que hace que un agente y una persona escriban en el mismo repositorio sin pisarse.
16
+
17
+ | Clase | Quién escribe | Qué puede hacer el agente | Ejemplos |
18
+ |---|---|---|---|
19
+ | **Autorado** | La persona. Cambia lento | **Nada sin approval.** Ni reformatear, ni "mejorar" | Dumps, notas atómicas, hubs, clips, proyectos, el `CLAUDE.md` del vault, la sección `## Reflexión` de los reviews |
20
+ | **Sintetizado** | El agente, con approval, y queda como nota permanente | Proponer y escribir tras el OK. Idempotente: correr dos veces no duplica | Dailies, weeklies, monthlies, el `## Historial` de un hub |
21
+ | **Proyectado** | El agente, sin preguntar. Derivado y descartable | Reescribir completo cuando corresponda | `hot.md`, el índice `.vault-index.json`, las vistas `.base` |
22
+
23
+ Tres consecuencias que resuelven las dudas que aparecen en la práctica:
24
+
25
+ - **Lo proyectado no se edita a mano.** Si el usuario lo edita, el próximo review lo pisa. Por eso `hot.md` lleva la advertencia adentro.
26
+ - **Lo proyectado no es fuente de verdad.** Si contradice a una nota, la nota gana. Se puede borrar sin perder nada.
27
+ - **Lo autorado no se toca ni para arreglarlo.** Si una nota del usuario tiene el frontmatter roto, se propone el arreglo; no se aplica solo. La excepción son las categorías que `/vault-tidy` aplica con approval item por item.
28
+
29
+ Si no sabés en qué clase cae un archivo, es autorado. El default es no escribir.
30
+
31
+ ## El vault apunta, no copia
32
+
33
+ Cuando algo ya tiene una fuente de verdad afuera, el vault guarda **el puntero y el porqué**, nunca una copia:
34
+
35
+ | Contenido | Fuente de verdad | En el vault |
36
+ |---|---|---|
37
+ | Código y arquitectura | El repo | `repos:` en el frontmatter, y `codebases.md` con el path local |
38
+ | Tickets, estados, sprints | Jira, ClickUp, Linear | Link, y la decisión que salió de ahí |
39
+ | Diseños | Figma | Link en la nota del tema |
40
+ | Artículos, papers | La web | El clip, con `source:` y **tu** resumen |
41
+
42
+ Una copia se desactualiza en silencio y después hay dos verdades y ninguna gana. Lo que sí acumula el vault es lo que ninguna de esas fuentes tiene: **qué decidiste, por qué, y qué aprendiste**. Eso no vive en Jira ni en el código.
43
+
44
+ ## Resolución de rutas: roles, no carpetas
45
+
46
+ Ningún skill escribe en una ruta literal. Escribe en un **rol**, y el `## Rutas` del `CLAUDE.md` del vault dice qué carpeta es ese rol en este vault. Es lo que hace que un vault adoptado con otra estructura funcione sin tocar los skills.
47
+
48
+ | Rol | Qué contiene | Default del `setup` |
49
+ |---|---|---|
50
+ | `inbox` | captura cruda del día | `_inbox` |
51
+ | `daily` | síntesis diaria | `Reflect/Daily` |
52
+ | `weekly` | retrospectiva semanal | `Reflect/Weekly` |
53
+ | `monthly` | balance mensual | `Reflect/Monthly` |
54
+ | `atomic` | notas atómicas | `03_Resources` |
55
+ | `hubs` | hub files por entidad | `Hubs` |
56
+ | `projects` | proyectos con deadline | `01_Projects` |
57
+ | `areas` | responsabilidades continuas | `02_Areas` |
58
+ | `archive` | cerrado, nunca borrado | `04_Archive` |
59
+ | `templates` | plantillas del usuario | `Templates` |
60
+
61
+ Orden de resolución, sin excepciones:
62
+
63
+ 1. El `## Rutas` del `CLAUDE.md` del vault.
64
+ 2. Si el vault no lo declara, el default de la tabla, **avisándole al usuario que se está asumiendo**.
65
+ 3. Si el rol no existe en este vault (no todos tienen `areas`), preguntar antes de crear la carpeta.
66
+
67
+ Los scripts reciben el mapeo por flag (`--role hubs=People`), nunca lo adivinan. **Si el `CLAUDE.md` del vault declara rutas distintas del default y un skill escribe en el default igual, eso es un bug del skill, no una preferencia.**
68
+
69
+ ## Las tres reglas de estructura
70
+
71
+ ### 1. Los links van hacia arriba, nunca hacia abajo
72
+
73
+ Cada nota linkea a su contexto, no a su detalle:
74
+
75
+ | Desde | Linkea a | Nunca a |
76
+ |---|---|---|
77
+ | Nota de `_inbox/` (dump) | hub files, proyectos, areas | otros dumps |
78
+ | Daily | el dump del dia, notas creadas ese dia | otros dailies |
79
+ | Weekly | los dailies de la semana | notas atomicas sueltas |
80
+ | Monthly | los weeklies del mes | dailies |
81
+ | Hub file | notas atomicas y proyectos del tema | dumps ni dailies |
82
+
83
+ Sin esta regla el agente crea links bidireccionales en todas las direcciones y el grafo se vuelve ruido: cada nota apunta a todo y ninguna relacion significa nada. Los backlinks de Obsidian ya dan la direccion inversa gratis, no hay que escribirla.
84
+
85
+ ### 2. Ninguna nota se cierra sin al menos un `[[wikilink]]`
86
+
87
+ Es la unica regla que previene las huerfanas de raiz. Si al terminar una nota no hay a que linkearla, esa es la senal de que falta un hub file: crear el hub (ver `/hub-note`) antes de cerrar la nota, o dejarla en `_inbox/` en vez de archivarla en `03_Resources/`.
88
+
89
+ Excepcion: los dumps crudos de `_inbox/` pueden nacer sin links, porque los agrega `/review-dump`.
90
+
91
+ ### 3. Las tareas no hechas no se arrastran en silencio
92
+
93
+ Una tarea abierta en el dump del lunes que sigue abierta el martes **se queda en el lunes**, marcada como cancelada (`- [-]`), y se crea de nuevo en el martes. No se mueve.
94
+
95
+ No haber hecho algo un dia determinado es informacion. Arrastrar la tarea hacia adelante produce una lista limpia y una historia falsa.
96
+
97
+ ## Que no puede hacer el agente
98
+
99
+ - **Nunca borrar una nota.** Mover a `04_Archive/` preservando el nombre. El borrado es decision del usuario, siempre.
100
+ - **Nunca renombrar ni mover una nota sin approval explicito.** Rompe `[[wikilinks]]` en silencio: Obsidian solo los actualiza cuando el rename ocurre dentro de la app.
101
+ - **Nunca editar en masa.** Una corrida toca las notas de esa corrida. Los cambios que afectan a muchas notas se proponen como plan y los aplica `/vault-tidy` con approval item por item.
102
+ - **Nunca tocar `Templates/`** salvo pedido explicito: son el contrato del usuario, no del agente.
103
+ - **Nunca reescribir la seccion de reflexion del usuario.** Los reviews sintetizan hechos; la interpretacion la escribe el usuario.
104
+
105
+ ## Contrato de frontmatter
106
+
107
+ Todo campo que un skill escriba tiene que estar declarado en el `CLAUDE.md` del vault. Un campo que no esta en el contrato no se inventa: se propone y se agrega al contrato primero.
108
+
109
+ Minimo por tipo de nota:
110
+
111
+ ```yaml
112
+ ---
113
+ created: 2026-07-27 # ISO, nunca se reescribe
114
+ type: daily # daily | weekly | monthly | dump | atomic | hub | project | area | clip
115
+ tags: []
116
+ ---
117
+ ```
118
+
119
+ Los tipos con campos propios (`status` en proyectos, `source` en clips) los declara el skill que los crea.
120
+
121
+ ## Convenciones de escritura
122
+
123
+ - Nada de guiones largos: si un texto generado trae em-dash o en-dash, normalizar a `-` antes de escribir.
124
+ - `[[wikilinks]]` para todo lo interno, `[texto](url)` solo para URLs externas. Obsidian trackea renames de wikilinks, no de markdown links.
125
+ - Fechas ISO (`YYYY-MM-DD`) en frontmatter y en nombres de archivo de notas periodicas.
126
+ - Una idea por nota atomica. Si una nota necesita dos titulos de nivel `##` que no se relacionan, son dos notas.
127
+
128
+ ## La estructura no la sostiene este archivo
129
+
130
+ Una convención que solo vive en un documento se muere en tres meses. Lo que la sostiene es lo que corre:
131
+
132
+ | Convención | Qué la hace cumplir |
133
+ |---|---|
134
+ | Frontmatter completo, notas con al menos un link | El hook `PostToolUse` de `second-brain`, al escribir |
135
+ | Huérfanas, links roto, nombres duplicados, semillas que no crecen | `/vault-audit`, cada vez que se corre |
136
+ | Contradicciones sin resolver | `status: contested`, que el audit lista y el monthly mira |
137
+ | Rutas por rol | El `## Rutas` del contrato, que los skills leen antes de escribir |
138
+ | Tareas que no se arrastran | El paso de tareas de `/review-dump`, y `stale_open_tasks` en el audit |
139
+
140
+ Si una regla nueva de este archivo no tiene una columna derecha, es una intención, no una regla. Antes de agregarla, preguntá qué la va a hacer cumplir.
141
+
142
+ ## Git como red de seguridad
143
+
144
+ El vault deberia ser un repo git. Antes de una corrida que escribe varias notas (`/review-dump`, `/vault-tidy`), verificar que el arbol este limpio y avisar al usuario si no lo esta. Es lo que permite deshacer una corrida completa sin revisar nota por nota.
@@ -0,0 +1,53 @@
1
+ ---
2
+ name: brain-dump
3
+ description: "Captura sin friccion al dump del dia en el vault de Obsidian: tareas, ideas, links, transcripciones. Sin tags, sin decidir donde va. Triggers: anota, capturar, brain dump, tirame esto al vault, apunta esto, agregar al inbox, dump del dia."
4
+ argument-hint: "[texto a capturar]"
5
+ category: "pkm"
6
+ user-invocable: true
7
+ allowed-tools: Read, Glob, Write, Edit
8
+ ---
9
+
10
+ # Brain Dump - Captura sin fricción
11
+
12
+ Agregás lo que el usuario te pasa al dump del día y te callás. Este skill existe para que capturar cueste cero: el momento en que el usuario tiene que pensar "¿dónde va esto?", el sistema ya falló.
13
+
14
+ Contenido a capturar: `$ARGUMENTS`
15
+
16
+ Aplica la rule `vault-conventions`.
17
+
18
+ **Rutas por rol:** el destino se nombra por rol (`inbox`, `templates`), y la ruta real sale del `## Rutas` del `CLAUDE.md` del vault. Los defaults entre paréntesis solo aplican si el vault no declara otra cosa.
19
+
20
+ ## Pasos
21
+
22
+ 1. **Ubicar el vault.** Flag `--vault <path>`, env `OBSIDIAN_VAULT`, o el directorio actual si contiene `.obsidian/`. Si no hay vault, decirlo en una línea y ofrecer `/second-brain setup`. No inventar una carpeta.
23
+
24
+ 2. **Resolver el rol `inbox`.** Leer el `## Rutas` del `CLAUDE.md` del vault. Es lo único que hace falta leer del contrato acá, y cuesta una lectura: escribir en `_inbox/` cuando el vault usa otra carpeta deja la captura en un lugar que ningún review va a mirar. Si el vault no tiene `CLAUDE.md`, usar el default y avisar en la misma línea de confirmación.
25
+
26
+ 3. **Abrir el dump de hoy.** `<inbox>/YYYY-MM-DD dump.md` (default `_inbox/`) con la fecha de hoy. El dump se llama `YYYY-MM-DD dump.md` y no `YYYY-MM-DD.md` a propósito: el daily de ese día ya se llama `YYYY-MM-DD.md`, y dos archivos con el mismo nombre hacen que `[[2026-07-28]]` resuelva de forma impredecible en todo el vault. Es la colisión que el audit reporta como `ambiguous_names`, y sin el sufijo pasaría todos los días. Si el vault ya tiene dumps con el nombre viejo, seguir su convención y avisarlo, en vez de partir la serie en dos.
27
+
28
+ Si no existe, crearlo desde `<templates>/Dump.md` (default `Templates/`), o con el frontmatter mínimo `created`, `type: dump`, `tags: []` si el template no está.
29
+
30
+ 4. **Agregar el contenido al final**, una línea por cosa, sin reordenar ni reescribir lo que ya había:
31
+ - Lo que suena a tarea va como `- [ ] <texto>`. Lo que suena a idea, nota o link va como `- <texto>`.
32
+ - URLs sueltas se dejan crudas, con el título de la página al lado solo si el usuario lo dio. No abrir la URL: eso es `/vault-clip`.
33
+ - Se preserva la redacción del usuario. No corregís su ortografía ni su registro, no resumís, no traducís.
34
+
35
+ 5. **Si no vino contenido en `$ARGUMENTS`**, preguntar qué capturar en una sola línea y esperar. No abrir un cuestionario.
36
+
37
+ 6. **Confirmar en una línea** qué se agregó y a qué archivo. Nada más: el usuario está en medio de otra cosa.
38
+
39
+ ## Approval
40
+
41
+ La invocación del skill es la aprobación para agregar al dump de hoy: pedir confirmación en cada captura destruiría el punto del skill. Los límites son estrictos en cambio para todo lo demás: **pedí approval explícito antes de escribir fuera del rol `inbox`**, antes de editar líneas que ya estaban en el dump, y antes de crear cualquier nota en los roles `atomic` o `hubs`. Clasificar es trabajo de `/review-dump`, no de acá.
42
+
43
+ ## Reglas
44
+
45
+ - No clasificar, no taggear, no linkear, no crear notas nuevas. Nada de eso pasa en la captura.
46
+ - No juzgar el contenido ni sugerir mejoras. Es un dump, no un borrador.
47
+ - Nunca reescribir ni reordenar lo que ya estaba en el archivo: solo append.
48
+ - Sin guiones largos en lo que agregues de tu parte.
49
+ - Si el usuario captura algo que claramente es una tarea de un proyecto que existe, **igual va al dump**. La ruteada la hace el review, así el usuario nunca decide en el momento.
50
+
51
+ ## Handoff
52
+
53
+ Captura COMPLETE cuando el contenido está en el dump del día. A la noche, o cuando el usuario quiera cerrar el día, el siguiente paso es `/review-dump` para clasificar todo lo capturado y generar el daily.
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  name: cold-outreach
3
- description: "Write cold LinkedIn/email messages from a job-seeker to recruiters, hiring managers and referrals — plus post-application follow-up sequences that get replies. For B2B sales outreach use cold-email instead. Triggers: mensaje en frio recruiter, escribirle a un reclutador, follow up postulacion, networking message, pedir referido, contactar hiring manager."
3
+ description: "Write cold LinkedIn/email messages from a job-seeker to recruiters, hiring managers and referrals - plus post-application follow-up sequences that get replies. For B2B sales outreach use cold-email instead. Triggers: mensaje en frio recruiter, escribirle a un reclutador, follow up postulacion, networking message, pedir referido, contactar hiring manager."
4
4
  argument-hint: "[contact-note | recruiter + company]"
5
5
  category: "career"
6
6
  user-invocable: true
7
7
  allowed-tools: Read, Glob, Grep, Write, Edit, WebFetch
8
8
  ---
9
9
 
10
- # Cold Outreach — Job-seeker → Recruiter / Hiring Manager
10
+ # Cold Outreach - Job-seeker → Recruiter / Hiring Manager
11
11
 
12
- Escribís mensajes en frío de un **candidato** a recruiters, hiring managers y referidos, y secuencias de **follow-up** post-aplicación que reciben respuesta. Esto NO es venta B2B (para eso está `/cold-email`) — el ángulo es conseguir una conversación o un referido, sin sonar a spam ni a desesperación.
12
+ Escribís mensajes en frío de un **candidato** a recruiters, hiring managers y referidos, y secuencias de **follow-up** post-aplicación que reciben respuesta. Esto NO es venta B2B (para eso está `/cold-email`) - el ángulo es conseguir una conversación o un referido, sin sonar a spam ni a desesperación.
13
13
 
14
14
  ## Cuándo usar cada variante
15
15
 
@@ -24,7 +24,7 @@ Escribís mensajes en frío de un **candidato** a recruiters, hiring managers y
24
24
  ## Principios
25
25
 
26
26
  - **Personalizá la primera línea.** Algo real de esa persona/empresa/rol. Si sirve para 100 personas, no sirve para ninguna.
27
- - **Corto.** LinkedIn: 50–125 palabras. La connection note: <300 caracteres.
27
+ - **Corto.** LinkedIn: 50-125 palabras. La connection note: <300 caracteres.
28
28
  - **Una pregunta / un CTA.** Bajá la fricción de responder.
29
29
  - **Vos resolvés algo para ellos**, no "estoy buscando trabajo, ¿me ayudás?". El foco es el valor que aportás al equipo.
30
30
  - **Sin paredes de texto, sin CV adjunto en el primer toque** (salvo que lo pidan).
@@ -33,26 +33,26 @@ Escribís mensajes en frío de un **candidato** a recruiters, hiring managers y
33
33
  ## Estructura de un primer mensaje
34
34
 
35
35
  1. **Gancho personal** (1 línea): por qué *a esta persona*.
36
- 2. **Quién sos + fit** (1–2 líneas): rol + el logro más relevante para ellos.
36
+ 2. **Quién sos + fit** (1-2 líneas): rol + el logro más relevante para ellos.
37
37
  3. **CTA suave** (1 línea): ¿15 min para charlar? / ¿abierto a una intro? / dejé mi aplicación, encantado de dar contexto.
38
38
 
39
39
  ## Secuencia de follow-up post-aplicación
40
40
 
41
- - **Día 0** — aplicación enviada (+ mensaje al recruiter/hiring manager si tenés el contacto).
42
- - **Día 4–5** — follow-up 1: reafirmá interés + agregá *algo nuevo* (un proyecto relevante, una idea sobre su producto). No "¿novedades?".
43
- - **Día 10–12** — follow-up 2 (último): breve, profesional, dejá la puerta abierta. Si no hay respuesta, cerrás el loop con dignidad.
41
+ - **Día 0** - aplicación enviada (+ mensaje al recruiter/hiring manager si tenés el contacto).
42
+ - **Día 4-5** - follow-up 1: reafirmá interés + agregá *algo nuevo* (un proyecto relevante, una idea sobre su producto). No "¿novedades?".
43
+ - **Día 10-12** - follow-up 2 (último): breve, profesional, dejá la puerta abierta. Si no hay respuesta, cerrás el loop con dignidad.
44
44
 
45
45
  Cada follow-up debe tener un **gancho propio** y leerse solo, sin depender de los anteriores.
46
46
 
47
47
  ## Proceso
48
48
 
49
49
  1. Leer la nota de `05-Contactos/` (o crearla) y la de `04-Empresas/`.
50
- 2. Investigar a la persona (rol, equipo, algo reciente) — WebFetch del perfil público si hay URL.
50
+ 2. Investigar a la persona (rol, equipo, algo reciente) - WebFetch del perfil público si hay URL.
51
51
  3. Elegir variante + canal.
52
52
  4. Draftear mensaje + 1 variante de apertura.
53
53
  5. Registrar en `05-Contactos/` (historial de interacciones) y planificar el follow-up.
54
54
 
55
- > Nota: Claude no accede a tu LinkedIn ni envía mensajes — redacta para que vos copies/pegues y registres la interacción.
55
+ > Nota: Claude no accede a tu LinkedIn ni envía mensajes - redacta para que vos copies/pegues y registres la interacción.
56
56
 
57
57
  ## Idioma
58
58