claude-code-arcane 1.2.0 → 1.4.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 (78) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +5 -2
  3. package/agents/ecommerce/ecommerce-architect.md +60 -0
  4. package/agents/engineering/dotnet-engineer.md +78 -0
  5. package/docs/SKILLS-CATALOG.md +45 -3
  6. package/docs/USER-GUIDE.md +2 -2
  7. package/package.json +1 -1
  8. package/profiles/backend-dotnet.yaml +54 -0
  9. package/profiles/ecommerce.yaml +48 -0
  10. package/profiles/job-hunt.yaml +35 -0
  11. package/profiles/unity-design.yaml +1 -0
  12. package/profiles/unity-dev.yaml +1 -0
  13. package/rules/dotnet-code.md +64 -0
  14. package/skills/cart-checkout/SKILL.md +85 -0
  15. package/skills/cart-checkout/references/checkout-flow-spec.md +50 -0
  16. package/skills/cold-outreach/SKILL.md +65 -0
  17. package/skills/cold-outreach/references/recruiter-playbook.md +65 -0
  18. package/skills/commerce-analytics/SKILL.md +85 -0
  19. package/skills/commerce-analytics/references/ga4-ecommerce-events.md +63 -0
  20. package/skills/commerce-analytics/scripts/ga4_ecommerce_validate.py +134 -0
  21. package/skills/commerce-data-model/SKILL.md +84 -0
  22. package/skills/commerce-data-model/references/data-model-spec.md +79 -0
  23. package/skills/cover-letter/SKILL.md +66 -0
  24. package/skills/cv-ats-export/SKILL.md +64 -0
  25. package/skills/cv-ats-export/scripts/cv_export.py +306 -0
  26. package/skills/cv-tailor/SKILL.md +70 -0
  27. package/skills/cv-tailor/references/ats-keywords.md +46 -0
  28. package/skills/dotnet-architecture/SKILL.md +66 -0
  29. package/skills/dotnet-architecture/references/anti-patterns.md +12 -0
  30. package/skills/dotnet-architecture/references/checklist.md +19 -0
  31. package/skills/dotnet-architecture/references/patterns.md +118 -0
  32. package/skills/dotnet-architecture/references/project-structure.md +78 -0
  33. package/skills/dotnet-best-practices/SKILL.md +76 -0
  34. package/skills/dotnet-best-practices/references/api-design.md +75 -0
  35. package/skills/dotnet-best-practices/references/architecture.md +62 -0
  36. package/skills/dotnet-best-practices/references/async.md +62 -0
  37. package/skills/dotnet-best-practices/references/database.md +69 -0
  38. package/skills/dotnet-best-practices/references/dependency-injection.md +73 -0
  39. package/skills/dotnet-best-practices/references/devops.md +76 -0
  40. package/skills/dotnet-best-practices/references/error-handling.md +72 -0
  41. package/skills/dotnet-best-practices/references/performance.md +63 -0
  42. package/skills/dotnet-best-practices/references/security.md +73 -0
  43. package/skills/dotnet-best-practices/references/testing.md +76 -0
  44. package/skills/dotnet-scaffold/SKILL.md +99 -0
  45. package/skills/install-mcp/SKILL.md +107 -0
  46. package/skills/install-mcp/references/manual-setup.md +92 -0
  47. package/skills/interview-prep/SKILL.md +69 -0
  48. package/skills/interview-prep/references/star-framework.md +42 -0
  49. package/skills/inventory-stock/SKILL.md +86 -0
  50. package/skills/inventory-stock/scripts/restock_forecast.py +173 -0
  51. package/skills/job-hunt/SKILL.md +92 -0
  52. package/skills/job-hunt/references/templates/Aplicacion.md +48 -0
  53. package/skills/job-hunt/references/templates/CV Custom.md +53 -0
  54. package/skills/job-hunt/references/templates/Contacto.md +30 -0
  55. package/skills/job-hunt/references/templates/Dashboard.md +45 -0
  56. package/skills/job-hunt/references/templates/Empresa.md +36 -0
  57. package/skills/job-hunt/references/templates/Entrevista.md +44 -0
  58. package/skills/job-hunt/references/templates/Perfil.md +38 -0
  59. package/skills/job-search/SKILL.md +83 -0
  60. package/skills/job-search/references/scoring-rubric.md +43 -0
  61. package/skills/linkedin-optimize/SKILL.md +79 -0
  62. package/skills/master-profile/SKILL.md +69 -0
  63. package/skills/merchant-feed/SKILL.md +85 -0
  64. package/skills/merchant-feed/references/feed-attribute-map.md +47 -0
  65. package/skills/merchant-feed/scripts/feed_validate.py +140 -0
  66. package/skills/network-map/SKILL.md +61 -0
  67. package/skills/network-map/scripts/network_map.py +109 -0
  68. package/skills/order-lifecycle/SKILL.md +86 -0
  69. package/skills/order-lifecycle/references/order-state-machine.md +53 -0
  70. package/skills/payments-architecture/SKILL.md +80 -0
  71. package/skills/personal-brand/SKILL.md +54 -0
  72. package/skills/personal-brand/references/post-pillars.md +66 -0
  73. package/skills/portfolio-site/SKILL.md +59 -0
  74. package/skills/product-listing/SKILL.md +84 -0
  75. package/skills/promotions-discounts/SKILL.md +80 -0
  76. package/skills/shipping-tax/SKILL.md +85 -0
  77. package/skills/storefront-architecture/SKILL.md +80 -0
  78. package/skills/subscription-billing/SKILL.md +81 -0
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: interview-prep
3
+ description: "Prepare for a job interview: company research, likely question bank by role, STAR answers built from your real experience, smart questions to ask, and red flags to watch for. Triggers: preparar entrevista, interview prep, preguntas de entrevista, respuestas STAR, que preguntar en una entrevista, mock interview, red flags entrevista."
4
+ argument-hint: "[application-note | company + role + round]"
5
+ category: "career"
6
+ user-invocable: true
7
+ allowed-tools: Read, Glob, Grep, Write, Edit, WebFetch
8
+ ---
9
+
10
+ # Interview Prep — Preparación de entrevista
11
+
12
+ Preparás al usuario para una entrevista concreta: research de la empresa, banco de preguntas probable según rol y ronda, respuestas **STAR** construidas desde su experiencia real, preguntas inteligentes para hacer, y red flags a detectar. El output queda en una nota de `06-Entrevistas/`.
13
+
14
+ ## Inputs
15
+
16
+ - **Aplicación / empresa / rol** (`03-Aplicaciones/`, `04-Empresas/`) y la **ronda** (recruiter screen, técnica, system design, hiring manager, cultural, final).
17
+ - **Perfil maestro** (`01-Perfiles/`) — de ahí salen las historias para las respuestas STAR.
18
+ - **Entrevistadores** si se conocen (research de background ayuda).
19
+
20
+ ## Qué producís
21
+
22
+ ### 1. Research de la empresa
23
+ - Qué hacen, producto, modelo de negocio, etapa, tamaño.
24
+ - Cultura y valores (de su sitio, blog, reviews).
25
+ - Noticias recientes / financiación / lanzamientos.
26
+ - Stack técnico conocido.
27
+ - Cómo conectar tu perfil con su contexto.
28
+
29
+ ### 2. Banco de preguntas por ronda
30
+ - **Recruiter screen:** motivación, expectativas salariales, disponibilidad, "contame de vos".
31
+ - **Técnica:** según stack del JD — fundamentos, problemas, debugging, code review.
32
+ - **System design** (si aplica): patrones, trade-offs, escala.
33
+ - **Hiring manager / comportamiento:** liderazgo, conflicto, fracaso, impacto.
34
+ - **Cultural:** valores, formas de trabajo, por qué esta empresa.
35
+ - Marcar las **3–5 más probables** para este rol específico.
36
+
37
+ ### 3. Respuestas STAR
38
+ - Construir respuestas con el método **STAR** (Situación, Tarea, Acción, Resultado) usando logros reales del perfil maestro.
39
+ - Cada respuesta: concreta, con métrica, 60–90 segundos hablada.
40
+ - Ver `references/star-framework.md`.
41
+
42
+ ### 4. Preguntas para hacer
43
+ - 5–7 preguntas inteligentes que demuestran research y filtran si la empresa te conviene (equipo, expectativas de los primeros 90 días, cómo miden éxito, deuda técnica, proceso).
44
+
45
+ ### 5. Red flags a detectar
46
+ - Señales de mala empresa/equipo durante la entrevista (proceso caótico, evasión sobre cultura/turnover, expectativas irreales, falta de claridad de rol, hostilidad).
47
+ - Qué preguntar para sacarlas a la luz.
48
+
49
+ ## Salario / negociación (si la ronda lo toca)
50
+
51
+ - No dar número primero si se puede evitar; preguntar rango.
52
+ - Anclar en research de mercado + tu valor (logros).
53
+ - Tener un rango (mínimo aceptable / objetivo / ambicioso) listo.
54
+
55
+ ## Proceso
56
+
57
+ 1. Leer aplicación + empresa + perfil. WebFetch del sitio/notas de la empresa.
58
+ 2. Crear nota en `06-Entrevistas/` con el template `Entrevista`.
59
+ 3. Llenar research, banco de preguntas (marcando las top), STAR de las 3–5 historias clave, preguntas a hacer, red flags.
60
+ 4. Ofrecer un **mock**: vos hacés de entrevistador y das feedback sobre las respuestas.
61
+ 5. Post-entrevista: ayudar a registrar feedback y definir próximo paso / follow-up (con `/cold-outreach`).
62
+
63
+ ## Idioma
64
+
65
+ En el idioma de la entrevista. Preparar respuestas en inglés si el rol es internacional, aunque la prep se converse en español.
66
+
67
+ ## Handoff
68
+
69
+ Pedí aprobación (approval) antes de escribir la nota en `06-Entrevistas/`. Cuando la prep está READY, ofrecé un mock; post-entrevista, seguí con `/cold-outreach` para el follow-up.
@@ -0,0 +1,42 @@
1
+ # STAR Framework — Respuestas de comportamiento
2
+
3
+ STAR estructura respuestas a preguntas de comportamiento ("contame de una vez que…") para que sean concretas, completas y memorables. La mayoría de los candidatos divaga; STAR te da una historia con resultado.
4
+
5
+ ## Las 4 partes
6
+
7
+ - **S — Situación:** el contexto, breve. Dónde, cuándo, qué estaba pasando. (1–2 oraciones)
8
+ - **T — Tarea:** tu responsabilidad / el problema a resolver. (1 oración)
9
+ - **A — Acción:** qué hiciste *vos* (no "el equipo"). El grueso de la respuesta. Decisiones concretas. (2–4 oraciones)
10
+ - **R — Resultado:** el impacto, **con número** siempre que se pueda. Qué aprendiste. (1–2 oraciones)
11
+
12
+ Objetivo: 60–90 segundos hablado. Ni telegrama, ni monólogo de 5 minutos.
13
+
14
+ ## Ejemplo
15
+
16
+ > **Pregunta:** "Contame de una vez que mejoraste el rendimiento de un sistema."
17
+ >
18
+ > **S:** En Acme nuestro servicio de matchmaking tenía picos de latencia que cortaban partidas.
19
+ > **T:** Como backend lead, me tocó bajar la latencia sin agregar infra.
20
+ > **A:** Perfilé el hot path, encontré queries N+1 y serialización redundante; introduje caching por sesión y batch de writes, y agregué métricas para validar.
21
+ > **R:** Latencia -25% y estabilidad del server +40%; duplicamos jugadores concurrentes sin sumar costos. Aprendí a medir antes de optimizar.
22
+
23
+ ## Banco de historias (preparar 5–6)
24
+
25
+ Construí 5–6 historias STAR reutilizables desde el perfil maestro, cubriendo:
26
+
27
+ 1. **Logro/impacto** del que estés orgulloso (con métrica).
28
+ 2. **Problema técnico difícil** que resolviste.
29
+ 3. **Conflicto / desacuerdo** con un compañero o stakeholder.
30
+ 4. **Fracaso / error** y qué aprendiste (mostrá ownership, no excusas).
31
+ 5. **Liderazgo / iniciativa** (lideraste algo, mentoreaste, empujaste un cambio).
32
+ 6. **Ambigüedad / cambio de prioridades** que manejaste.
33
+
34
+ La misma historia puede servir para varias preguntas — lo que cambia es qué parte enfatizás.
35
+
36
+ ## Errores comunes
37
+
38
+ - Quedarse en "nosotros" — la entrevista evalúa *tu* aporte. Decí "yo".
39
+ - Saltearse el Resultado, o un resultado sin número.
40
+ - Demasiada Situación, poca Acción.
41
+ - Historias vagas/inventadas que no aguantan repreguntas.
42
+ - No tener la historia de fracaso preparada (la piden casi siempre).
@@ -0,0 +1,86 @@
1
+ ---
2
+ name: inventory-stock
3
+ description: "Design inventory and stock control — availability tracking, optimistic locking to prevent overselling, reservations, multi-location, backorders, and restock forecasting. Includes a safety-stock/reorder-point calculator. Triggers: designing inventory, fixing overselling, forecasting restock."
4
+ argument-hint: "[design | forecast | audit]"
5
+ category: "ecommerce"
6
+ user-invocable: true
7
+ allowed-tools: Read, Glob, Grep, Bash
8
+ ---
9
+
10
+ # Inventory & Stock
11
+
12
+ Stock is where data integrity meets revenue: oversell and you lose trust, over-reserve and you lose sales. Design availability that is correct under concurrency and forecast restocks from real demand — platform-agnostic.
13
+
14
+ ## Before Starting
15
+
16
+ Gather: inventory model (single vs multi-location), sales velocity and lead times, fulfillment style (own stock, dropship, backorder), and goal (design the model, forecast restock, or audit for oversell risk).
17
+
18
+ ## How This Skill Works
19
+
20
+ | Mode | Trigger | Output |
21
+ |------|---------|--------|
22
+ | **Design** | `design` | Availability model + concurrency strategy |
23
+ | **Forecast** | `forecast` | Safety stock + reorder points (via script) |
24
+ | **Audit** | `audit` | Oversell-risk and accuracy review |
25
+
26
+ ---
27
+
28
+ ## Phase 1 — Availability Model
29
+
30
+ Track three numbers per SKU per location, never one:
31
+
32
+ | Quantity | Meaning |
33
+ |----------|---------|
34
+ | **on_hand** | Physically present |
35
+ | **reserved** | Allocated to unfulfilled orders/checkouts |
36
+ | **available** | `on_hand − reserved` — the only number a shopper sees |
37
+
38
+ **Rule:** Reserve at checkout start with a TTL; release on timeout/abandonment. Decrement `on_hand` at fulfillment, not at order placement.
39
+
40
+ ---
41
+
42
+ ## Phase 2 — Preventing Overselling
43
+
44
+ The classic race: two shoppers buy the last unit. Defenses, in order of preference:
45
+
46
+ 1. **Optimistic locking** — version/row check on decrement; retry on conflict. Default choice.
47
+ 2. **Atomic conditional update** — `UPDATE ... WHERE available >= qty` and check rows-affected.
48
+ 3. **Pessimistic lock** — only for high-contention single rows; costs throughput.
49
+
50
+ Always treat "reserve stock" as a transaction that can FAIL and surface that to checkout cleanly. Multi-location adds an allocation step (which location fulfills) before the decrement.
51
+
52
+ For backorder rules, multi-location allocation strategies, and reservation TTL tuning, see the patterns above and hand off to `order-lifecycle` for fulfillment state.
53
+
54
+ ---
55
+
56
+ ## Phase 3 — Restock Forecasting
57
+
58
+ Use the script to turn a sales CSV into reorder points:
59
+
60
+ ```bash
61
+ python skills/inventory-stock/scripts/restock_forecast.py # demo data
62
+ python skills/inventory-stock/scripts/restock_forecast.py sales.csv --lead-time 14 --service-level 0.95
63
+ ```
64
+
65
+ It computes average daily demand, demand variability, **safety stock** (`z × σ_demand × √lead_time`), and **reorder point** (`demand × lead_time + safety_stock`). CSV columns: `sku,date,units_sold`.
66
+
67
+ ---
68
+
69
+ ## Output Artifacts
70
+
71
+ | Request | Output |
72
+ |---------|--------|
73
+ | Design | Availability model + chosen concurrency strategy |
74
+ | Forecast | Per-SKU reorder point + safety stock table |
75
+ | Audit | Oversell-risk findings: PASS / FAIL per check |
76
+
77
+ An inventory design **PASSES** when shoppers only see `available`, reservations expire, decrements are atomic/versioned, and forecasts drive reorder points instead of guesswork.
78
+
79
+ ---
80
+
81
+ ## Related Skills
82
+
83
+ - **commerce-data-model**: defines the SKU/variant that stock hangs off.
84
+ - **order-lifecycle**: consumes reservations and triggers decrements at fulfillment.
85
+ - **cart-checkout**: starts the reservation when checkout begins.
86
+ - **commerce-analytics**: sell-through and turnover metrics that feed forecasts.
@@ -0,0 +1,173 @@
1
+ """
2
+ restock_forecast.py — Safety stock & reorder points from a sales history CSV.
3
+
4
+ Turns daily sales into per-SKU reorder signals using the classic
5
+ reorder-point model. No external dependencies (stdlib only), cross-platform.
6
+
7
+ Usage:
8
+ python restock_forecast.py # built-in demo data
9
+ python restock_forecast.py sales.csv # your data, defaults
10
+ python restock_forecast.py sales.csv --lead-time 14 --service-level 0.95
11
+ python restock_forecast.py sales.csv --on-hand on_hand.csv # flag what to reorder
12
+
13
+ CSV format (header required):
14
+ sku,date,units_sold
15
+ ACME-TEE-RED-M,2026-05-01,4
16
+ ACME-TEE-RED-M,2026-05-02,2
17
+ ...
18
+
19
+ Optional on-hand CSV (header required): sku,on_hand
20
+
21
+ Model:
22
+ avg_daily_demand = mean(units_sold per day)
23
+ sigma_demand = stdev(units_sold per day)
24
+ safety_stock = z(service_level) * sigma_demand * sqrt(lead_time)
25
+ reorder_point = avg_daily_demand * lead_time + safety_stock
26
+
27
+ When on-hand is provided, a SKU is flagged REORDER when on_hand <= reorder_point.
28
+ """
29
+
30
+ import argparse
31
+ import csv
32
+ import math
33
+ import sys
34
+ from collections import defaultdict
35
+
36
+
37
+ # Embedded demo data: two SKUs, ~3 weeks of daily sales.
38
+ DEMO_ROWS = [
39
+ ("ACME-TEE-RED-M", d, u)
40
+ for d, u in zip(
41
+ [f"2026-05-{n:02d}" for n in range(1, 22)],
42
+ [4, 2, 5, 3, 6, 8, 7, 3, 4, 5, 2, 6, 9, 7, 4, 3, 5, 6, 8, 4, 5],
43
+ )
44
+ ] + [
45
+ ("ACME-MUG-BLUE", d, u)
46
+ for d, u in zip(
47
+ [f"2026-05-{n:02d}" for n in range(1, 22)],
48
+ [1, 0, 2, 1, 1, 3, 2, 0, 1, 1, 0, 2, 1, 2, 1, 0, 1, 2, 3, 1, 1],
49
+ )
50
+ ]
51
+ DEMO_ON_HAND = {"ACME-TEE-RED-M": 40, "ACME-MUG-BLUE": 60}
52
+
53
+
54
+ def z_for_service_level(p):
55
+ """Inverse standard-normal CDF (Acklam's rational approximation)."""
56
+ if not 0.0 < p < 1.0:
57
+ raise ValueError("service-level must be between 0 and 1 (exclusive)")
58
+ a = [-3.969683028665376e+01, 2.209460984245205e+02, -2.759285104469687e+02,
59
+ 1.383577518672690e+02, -3.066479806614716e+01, 2.506628277459239e+00]
60
+ b = [-5.447609879822406e+01, 1.615858368580409e+02, -1.556989798598866e+02,
61
+ 6.680131188771972e+01, -1.328068155288572e+01]
62
+ c = [-7.784894002430293e-03, -3.223964580411365e-01, -2.400758277161838e+00,
63
+ -2.549732539343734e+00, 4.374664141464968e+00, 2.938163982698783e+00]
64
+ d = [7.784695709041462e-03, 3.224671290700398e-01, 2.445134137142996e+00,
65
+ 3.754408661907416e+00]
66
+ plow, phigh = 0.02425, 1 - 0.02425
67
+ if p < plow:
68
+ q = math.sqrt(-2 * math.log(p))
69
+ return (((((c[0]*q+c[1])*q+c[2])*q+c[3])*q+c[4])*q+c[5]) / \
70
+ ((((d[0]*q+d[1])*q+d[2])*q+d[3])*q+1)
71
+ if p > phigh:
72
+ q = math.sqrt(-2 * math.log(1 - p))
73
+ return -(((((c[0]*q+c[1])*q+c[2])*q+c[3])*q+c[4])*q+c[5]) / \
74
+ ((((d[0]*q+d[1])*q+d[2])*q+d[3])*q+1)
75
+ q = p - 0.5
76
+ r = q * q
77
+ return (((((a[0]*r+a[1])*r+a[2])*r+a[3])*r+a[4])*r+a[5])*q / \
78
+ (((((b[0]*r+b[1])*r+b[2])*r+b[3])*r+b[4])*r+1)
79
+
80
+
81
+ def load_sales(path):
82
+ rows = []
83
+ with open(path, newline="", encoding="utf-8") as f:
84
+ reader = csv.DictReader(f)
85
+ required = {"sku", "date", "units_sold"}
86
+ if not required.issubset({c.strip() for c in (reader.fieldnames or [])}):
87
+ print(f"[ERROR] {path}: header must include sku,date,units_sold")
88
+ sys.exit(1)
89
+ for r in reader:
90
+ try:
91
+ rows.append((r["sku"].strip(), r["date"].strip(), float(r["units_sold"])))
92
+ except (KeyError, ValueError):
93
+ print(f"[WARN] skipping malformed row: {r}")
94
+ return rows
95
+
96
+
97
+ def load_on_hand(path):
98
+ out = {}
99
+ with open(path, newline="", encoding="utf-8") as f:
100
+ for r in csv.DictReader(f):
101
+ try:
102
+ out[r["sku"].strip()] = float(r["on_hand"])
103
+ except (KeyError, ValueError):
104
+ pass
105
+ return out
106
+
107
+
108
+ def stdev(xs):
109
+ if len(xs) < 2:
110
+ return 0.0
111
+ mean = sum(xs) / len(xs)
112
+ return math.sqrt(sum((x - mean) ** 2 for x in xs) / (len(xs) - 1))
113
+
114
+
115
+ def forecast(rows, lead_time, service_level, on_hand):
116
+ z = z_for_service_level(service_level)
117
+ by_sku = defaultdict(list)
118
+ for sku, _date, units in rows:
119
+ by_sku[sku].append(units)
120
+
121
+ results = []
122
+ for sku in sorted(by_sku):
123
+ daily = by_sku[sku]
124
+ avg = sum(daily) / len(daily)
125
+ sigma = stdev(daily)
126
+ safety = z * sigma * math.sqrt(lead_time)
127
+ rop = avg * lead_time + safety
128
+ oh = on_hand.get(sku)
129
+ flag = ""
130
+ if oh is not None:
131
+ flag = "REORDER" if oh <= rop else "OK"
132
+ results.append((sku, avg, sigma, safety, rop, oh, flag))
133
+ return results
134
+
135
+
136
+ def main():
137
+ ap = argparse.ArgumentParser(description="Safety stock & reorder points from sales CSV.")
138
+ ap.add_argument("csv", nargs="?", help="sales CSV (sku,date,units_sold). Omit for demo.")
139
+ ap.add_argument("--lead-time", type=float, default=14, help="supplier lead time in days (default 14)")
140
+ ap.add_argument("--service-level", type=float, default=0.95, help="0-1 target fill rate (default 0.95)")
141
+ ap.add_argument("--on-hand", help="optional CSV (sku,on_hand) to flag what to reorder")
142
+ args = ap.parse_args()
143
+
144
+ if args.csv:
145
+ rows = load_sales(args.csv)
146
+ on_hand = load_on_hand(args.on_hand) if args.on_hand else {}
147
+ else:
148
+ print("[INFO] No CSV given - using built-in demo data.\n")
149
+ rows = DEMO_ROWS
150
+ on_hand = DEMO_ON_HAND
151
+
152
+ if not rows:
153
+ print("[ERROR] No sales rows to analyze.")
154
+ sys.exit(1)
155
+
156
+ results = forecast(rows, args.lead_time, args.service_level, on_hand)
157
+
158
+ z = z_for_service_level(args.service_level)
159
+ print(f"Lead time: {args.lead_time:g}d | Service level: {args.service_level:g} (z={z:.2f})\n")
160
+ header = f"{'SKU':<20} {'avg/day':>8} {'sigma':>7} {'safety':>8} {'reorder_pt':>11} {'on_hand':>8} {'flag':>8}"
161
+ print(header)
162
+ print("-" * len(header))
163
+ for sku, avg, sigma, safety, rop, oh, flag in results:
164
+ oh_s = f"{oh:g}" if oh is not None else "-"
165
+ print(f"{sku:<20} {avg:>8.2f} {sigma:>7.2f} {safety:>8.1f} {rop:>11.1f} {oh_s:>8} {flag:>8}")
166
+
167
+ reorder = [r for r in results if r[6] == "REORDER"]
168
+ if on_hand:
169
+ print(f"\n{'PASS' if not reorder else 'ACTION'}: {len(reorder)} SKU(s) at/below reorder point.")
170
+
171
+
172
+ if __name__ == "__main__":
173
+ main()
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: job-hunt
3
+ description: "Entry point for the job-search skillset. Scaffolds and manages a portable career workspace (profiles, CVs, applications, companies, contacts, interviews) and routes to the right skill. Triggers: job hunt, busqueda laboral, buscar trabajo, organizar postulaciones, setup career workspace."
4
+ argument-hint: "[setup | status | next]"
5
+ category: "career"
6
+ user-invocable: true
7
+ allowed-tools: Read, Glob, Grep, Bash, Write, Edit
8
+ ---
9
+
10
+ # Job Hunt — Career Workspace Orchestrator
11
+
12
+ Eres el punto de entrada de la suite de búsqueda laboral. Tu trabajo es: detectar (o crear) el **career workspace**, entender en qué etapa está el usuario, y rutear al skill correcto. No hacés todo vos — orquestás.
13
+
14
+ ## Idioma
15
+
16
+ Comunicación con el usuario en **español**. Los **outputs** (CV, LinkedIn, cover letters) van en el idioma del rol objetivo: **inglés** para roles internacionales/remotos globales, **español** cuando la oferta o empresa lo pidan. Preguntá si hay ambigüedad.
17
+
18
+ ## El career workspace
19
+
20
+ Todo el sistema vive en una carpeta portable (default: `career-workspace/` en la raíz del proyecto; configurable). Estructura:
21
+
22
+ ```
23
+ career-workspace/
24
+ 00-Dashboard.md índice + aplicaciones activas + próximos pasos
25
+ 01-Perfiles/ perfil maestro + perfiles por rol
26
+ 02-CVs/ CV base por perfil + CV custom por postulación
27
+ exports/ PDFs ATS generados
28
+ 03-Aplicaciones/ una nota por postulación
29
+ 04-Empresas/ research de empresas
30
+ 05-Contactos/ recruiters, referidos, hiring managers
31
+ 06-Entrevistas/ prep y feedback por ronda
32
+ 07-Recursos/ cover letters reutilizables, links
33
+ portfolio/ datos source-of-truth del portfolio web
34
+ Templates/ plantillas con frontmatter
35
+ tools/ cv_export.py (lo instala /cv-ats-export)
36
+ ```
37
+
38
+ Es **portable y agnóstico de Obsidian**: usa `[[wikilinks]]` (funcionan en Obsidian si el usuario lo usa, y son legibles en texto plano), frontmatter YAML, y prefijos numéricos para ordenar carpetas. No requiere Obsidian instalado.
39
+
40
+ ## Modos
41
+
42
+ ### `setup` — Crear el workspace
43
+ 1. Preguntar dónde crear el workspace (default `./career-workspace/`) y el/los rol(es) objetivo.
44
+ 2. Crear el árbol de carpetas completo.
45
+ 3. Copiar los 7 templates desde `references/templates/` a `Templates/` del workspace.
46
+ 4. Crear `00-Dashboard.md` desde `references/templates/Dashboard.md`.
47
+ 5. Sugerir el siguiente paso: `/master-profile` para construir el perfil maestro.
48
+
49
+ ### `status` — Dónde estoy
50
+ 1. Leer `00-Dashboard.md` y escanear `03-Aplicaciones/`.
51
+ 2. Resumir: aplicaciones activas por prioridad, próximas entrevistas, ofertas que cierran pronto, gaps (aplicaciones sin CV/cover letter).
52
+ 3. Recomendar la acción de mayor impacto.
53
+
54
+ ### `next` — Qué hago ahora
55
+ Según el estado del workspace, recomendar el skill siguiente (ver routing).
56
+
57
+ ## Routing
58
+
59
+ | Situación | Skill |
60
+ |-----------|-------|
61
+ | No hay workspace | `/job-hunt setup` |
62
+ | Falta perfil maestro | `/master-profile` |
63
+ | Encontrar/scorear ofertas, plan de búsqueda | `/job-search` |
64
+ | Adaptar CV a una oferta | `/cv-tailor` |
65
+ | Exportar CV a PDF ATS | `/cv-ats-export` |
66
+ | Escribir cover letter / mensaje de aplicación | `/cover-letter` |
67
+ | Mensaje en frío a recruiter/hiring manager | `/cold-outreach` |
68
+ | Optimizar perfil de LinkedIn | `/linkedin-optimize` |
69
+ | Crear/actualizar portfolio web | `/portfolio-site` |
70
+ | Preparar una entrevista | `/interview-prep` |
71
+
72
+ ## Workflow estándar para una nueva oportunidad
73
+
74
+ 1. `/job-search` → encontrar y scorear la oferta, crear nota en `03-Aplicaciones/` + `04-Empresas/`.
75
+ 2. Identificar contacto objetivo → nota en `05-Contactos/`.
76
+ 3. `/cv-tailor` → CV custom partiendo del perfil base + research.
77
+ 4. `/cv-ats-export` → PDF ATS a `02-CVs/exports/`.
78
+ 5. `/cover-letter` → mensaje de aplicación custom.
79
+ 6. `/cold-outreach` → si hay contacto al que escribirle directo.
80
+ 7. Cuando haya entrevista → `/interview-prep`.
81
+
82
+ ## Reglas
83
+
84
+ - Nunca reorganizar carpetas ni renombrar notas sin preguntar — rompe `[[wikilinks]]` en silencio.
85
+ - Nunca commitear datos sensibles (CV con teléfono/dirección, salarios, emails de recruiters) a un remoto sin confirmación explícita.
86
+ - Si una categoría necesita un template que no existe, proponerlo antes de inventarlo.
87
+ - Preservar los prefijos numéricos al crear archivos dentro de las carpetas ordenadas.
88
+ - Máximo accionable: el usuario siempre termina sabiendo qué skill correr next.
89
+
90
+ ## Handoff
91
+
92
+ Pedí aprobación al usuario (approval) antes de escribir o sobrescribir archivos del workspace. Cuando el workspace queda READY, el siguiente paso es `/master-profile` para construir el perfil maestro.
@@ -0,0 +1,48 @@
1
+ ---
2
+ tipo: aplicacion
3
+ empresa:
4
+ perfil:
5
+ cv_usado:
6
+ estado: interesado
7
+ score:
8
+ fecha_aplicacion:
9
+ fecha_actualizacion: {{date:YYYY-MM-DD}}
10
+ link_oferta:
11
+ contacto_principal:
12
+ salario_rango:
13
+ modalidad:
14
+ ubicacion:
15
+ prioridad: media
16
+ ---
17
+
18
+ # {{title}}
19
+
20
+ ## Puesto y empresa
21
+ - **Empresa:** [[]]
22
+ - **Rol:**
23
+ - **Link oferta:**
24
+
25
+ ## Por qué me interesa
26
+
27
+
28
+ ## Match con mi perfil
29
+ - Perfil base: [[]]
30
+ - Qué de mi experiencia alinea con lo que piden:
31
+ -
32
+
33
+ ## A quién escribirle / contacto principal
34
+ - [[]]
35
+ - Canal (LinkedIn / mail / formulario):
36
+ - Ángulo del mensaje:
37
+
38
+ ## CV custom usado
39
+ - [[]]
40
+
41
+ ## Timeline / seguimiento
42
+ - {{date:YYYY-MM-DD}} — creada la nota
43
+
44
+ ## Entrevistas
45
+ -
46
+
47
+ ## Notas
48
+
@@ -0,0 +1,53 @@
1
+ ---
2
+ tipo: cv_custom
3
+ perfil_base:
4
+ aplicacion:
5
+ empresa:
6
+ contacto_objetivo:
7
+ fecha: {{date:YYYY-MM-DD}}
8
+ archivo_pdf:
9
+ archivo_final:
10
+ ---
11
+
12
+ # CV custom — {{title}}
13
+
14
+ ## Contexto de la postulación
15
+ - **Aplicación:** [[]]
16
+ - **Empresa:** [[]]
17
+ - **Perfil base del que parto:** [[]]
18
+ - **Contacto objetivo (quién va a leer esto):** [[]]
19
+
20
+ ## Investigación previa
21
+ > Qué sabemos del contacto objetivo y del equipo: background, senioridad, qué valora, en qué proyectos está.
22
+
23
+ -
24
+
25
+ ## Keywords de la oferta
26
+ > Extraídas literales del job description para matchear con filtros automáticos (ATS) y lectura humana.
27
+
28
+ -
29
+
30
+ ## Qué resaltar en este CV (y qué bajar el volumen)
31
+ - Resaltar:
32
+ -
33
+ - Reducir / omitir:
34
+ -
35
+
36
+ ## Highlights reescritos para esta postulación
37
+ > Logros del perfil base reordenados / reescritos con el vocabulario de la oferta.
38
+
39
+ -
40
+
41
+ ## Proyectos destacados para este rol
42
+ -
43
+
44
+ ## Cover letter / mensaje de aplicación
45
+ > El mensaje que acompaña el CV, custom para el contacto.
46
+
47
+ ```
48
+
49
+ ```
50
+
51
+ ## Archivo final exportado
52
+ - Ruta:
53
+ - Fecha de export:
@@ -0,0 +1,30 @@
1
+ ---
2
+ tipo: contacto
3
+ empresa:
4
+ rol:
5
+ linkedin:
6
+ email:
7
+ telefono:
8
+ tipo_contacto:
9
+ primer_contacto: {{date:YYYY-MM-DD}}
10
+ ultima_interaccion: {{date:YYYY-MM-DD}}
11
+ ---
12
+
13
+ # {{title}}
14
+
15
+ ## Sobre esta persona
16
+ > Qué hace, a qué equipo pertenece, cómo apareció en el radar, qué background tiene.
17
+
18
+ -
19
+
20
+ ## Por qué le escribo / qué busco de este contacto
21
+
22
+
23
+ ## Historial de interacciones
24
+ - {{date:YYYY-MM-DD}} — creada la nota
25
+
26
+ ## Mensajes intercambiados
27
+
28
+
29
+ ## Aplicaciones vinculadas
30
+ - [[]]
@@ -0,0 +1,45 @@
1
+ ---
2
+ tipo: dashboard
3
+ ---
4
+
5
+ # Dashboard — Búsqueda laboral
6
+
7
+ > Índice del workspace. Cuando haya datos (aplicaciones, entrevistas), estas secciones pueden convertirse en queries dinámicas con Bases/Dataview si usás Obsidian.
8
+
9
+ ## Aplicaciones activas
10
+ **Prioridad alta:**
11
+ -
12
+
13
+ **Prioridad media:**
14
+ -
15
+
16
+ **Cerradas / descartadas:**
17
+ -
18
+
19
+ ## Próximas entrevistas
20
+ -
21
+
22
+ ## A seguir esta semana
23
+ -
24
+
25
+ ## Perfiles
26
+ -
27
+
28
+ ## Accesos rápidos por carpeta
29
+ - `01-Perfiles/` — perfiles profesionales base + perfil maestro
30
+ - `02-CVs/` — versiones de CV (incluye CVs custom por postulación)
31
+ - `03-Aplicaciones/` — una nota por postulación
32
+ - `04-Empresas/` — research de empresas
33
+ - `05-Contactos/` — recruiters, referidos, hiring managers
34
+ - `06-Entrevistas/` — prep y feedback por ronda
35
+ - `07-Recursos/` — cover letters reutilizables, links útiles
36
+ - `portfolio/` — source-of-truth del portfolio web
37
+ - `Templates/` — plantillas con frontmatter
38
+
39
+ ## Workflow estándar para una nueva oportunidad
40
+ 1. `/job-search` — encontrar y scorear la oferta → nota en `03-Aplicaciones/` + `04-Empresas/`.
41
+ 2. Identificar contacto objetivo → nota en `05-Contactos/`.
42
+ 3. `/cv-tailor` — CV custom desde el perfil base + research.
43
+ 4. `/cv-ats-export` — PDF ATS a `02-CVs/exports/`.
44
+ 5. `/cover-letter` — mensaje de aplicación custom.
45
+ 6. `/interview-prep` — cuando haya entrevista.
@@ -0,0 +1,36 @@
1
+ ---
2
+ tipo: empresa
3
+ industria:
4
+ tamaño:
5
+ ubicacion:
6
+ website:
7
+ linkedin:
8
+ stack_conocido: []
9
+ modalidad:
10
+ fuente:
11
+ ---
12
+
13
+ # {{title}}
14
+
15
+ ## Qué hacen
16
+
17
+
18
+ ## Cultura / valores
19
+
20
+
21
+ ## Stack técnico conocido
22
+ -
23
+
24
+ ## Proceso de contratación (si lo conozco)
25
+
26
+
27
+ ## Contactos en la empresa
28
+ - [[]]
29
+
30
+ ## Aplicaciones vinculadas
31
+ - [[]]
32
+
33
+ ## Research / notas
34
+ > Contexto para custom-izar CV y mensajes de acercamiento.
35
+
36
+ -