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.
- package/CHANGELOG.md +16 -0
- package/README.md +5 -2
- package/agents/ecommerce/ecommerce-architect.md +60 -0
- package/agents/engineering/dotnet-engineer.md +78 -0
- package/docs/SKILLS-CATALOG.md +45 -3
- package/docs/USER-GUIDE.md +2 -2
- package/package.json +1 -1
- package/profiles/backend-dotnet.yaml +54 -0
- package/profiles/ecommerce.yaml +48 -0
- package/profiles/job-hunt.yaml +35 -0
- package/profiles/unity-design.yaml +1 -0
- package/profiles/unity-dev.yaml +1 -0
- package/rules/dotnet-code.md +64 -0
- package/skills/cart-checkout/SKILL.md +85 -0
- package/skills/cart-checkout/references/checkout-flow-spec.md +50 -0
- package/skills/cold-outreach/SKILL.md +65 -0
- package/skills/cold-outreach/references/recruiter-playbook.md +65 -0
- package/skills/commerce-analytics/SKILL.md +85 -0
- package/skills/commerce-analytics/references/ga4-ecommerce-events.md +63 -0
- package/skills/commerce-analytics/scripts/ga4_ecommerce_validate.py +134 -0
- package/skills/commerce-data-model/SKILL.md +84 -0
- package/skills/commerce-data-model/references/data-model-spec.md +79 -0
- package/skills/cover-letter/SKILL.md +66 -0
- package/skills/cv-ats-export/SKILL.md +64 -0
- package/skills/cv-ats-export/scripts/cv_export.py +306 -0
- package/skills/cv-tailor/SKILL.md +70 -0
- package/skills/cv-tailor/references/ats-keywords.md +46 -0
- package/skills/dotnet-architecture/SKILL.md +66 -0
- package/skills/dotnet-architecture/references/anti-patterns.md +12 -0
- package/skills/dotnet-architecture/references/checklist.md +19 -0
- package/skills/dotnet-architecture/references/patterns.md +118 -0
- package/skills/dotnet-architecture/references/project-structure.md +78 -0
- package/skills/dotnet-best-practices/SKILL.md +76 -0
- package/skills/dotnet-best-practices/references/api-design.md +75 -0
- package/skills/dotnet-best-practices/references/architecture.md +62 -0
- package/skills/dotnet-best-practices/references/async.md +62 -0
- package/skills/dotnet-best-practices/references/database.md +69 -0
- package/skills/dotnet-best-practices/references/dependency-injection.md +73 -0
- package/skills/dotnet-best-practices/references/devops.md +76 -0
- package/skills/dotnet-best-practices/references/error-handling.md +72 -0
- package/skills/dotnet-best-practices/references/performance.md +63 -0
- package/skills/dotnet-best-practices/references/security.md +73 -0
- package/skills/dotnet-best-practices/references/testing.md +76 -0
- package/skills/dotnet-scaffold/SKILL.md +99 -0
- package/skills/install-mcp/SKILL.md +107 -0
- package/skills/install-mcp/references/manual-setup.md +92 -0
- package/skills/interview-prep/SKILL.md +69 -0
- package/skills/interview-prep/references/star-framework.md +42 -0
- package/skills/inventory-stock/SKILL.md +86 -0
- package/skills/inventory-stock/scripts/restock_forecast.py +173 -0
- package/skills/job-hunt/SKILL.md +92 -0
- package/skills/job-hunt/references/templates/Aplicacion.md +48 -0
- package/skills/job-hunt/references/templates/CV Custom.md +53 -0
- package/skills/job-hunt/references/templates/Contacto.md +30 -0
- package/skills/job-hunt/references/templates/Dashboard.md +45 -0
- package/skills/job-hunt/references/templates/Empresa.md +36 -0
- package/skills/job-hunt/references/templates/Entrevista.md +44 -0
- package/skills/job-hunt/references/templates/Perfil.md +38 -0
- package/skills/job-search/SKILL.md +83 -0
- package/skills/job-search/references/scoring-rubric.md +43 -0
- package/skills/linkedin-optimize/SKILL.md +79 -0
- package/skills/master-profile/SKILL.md +69 -0
- package/skills/merchant-feed/SKILL.md +85 -0
- package/skills/merchant-feed/references/feed-attribute-map.md +47 -0
- package/skills/merchant-feed/scripts/feed_validate.py +140 -0
- package/skills/network-map/SKILL.md +61 -0
- package/skills/network-map/scripts/network_map.py +109 -0
- package/skills/order-lifecycle/SKILL.md +86 -0
- package/skills/order-lifecycle/references/order-state-machine.md +53 -0
- package/skills/payments-architecture/SKILL.md +80 -0
- package/skills/personal-brand/SKILL.md +54 -0
- package/skills/personal-brand/references/post-pillars.md +66 -0
- package/skills/portfolio-site/SKILL.md +59 -0
- package/skills/product-listing/SKILL.md +84 -0
- package/skills/promotions-discounts/SKILL.md +80 -0
- package/skills/shipping-tax/SKILL.md +85 -0
- package/skills/storefront-architecture/SKILL.md +80 -0
- 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
|
+
-
|