@profile-as-code/cli 0.3.0 → 0.3.5

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@profile-as-code/cli",
3
- "version": "0.3.0",
4
- "description": "pasco — the profile-as-code CLI: init, validate, build, diff, status + partial refine (task template), check (offline rules M6–M8; catalog ships M3/M4), skills:install (prints the projection command). Consumes @profile-as-code/core; never re-implements load/drift/geo/compile.",
3
+ "version": "0.3.5",
4
+ "description": "pasco — the profile-as-code CLI: init, validate, build, diff, status + partial refine (task template), check (offline rules M6–M8; catalog ships M3/M4), skills:export (copies the platform skills this package ships). Consumes @profile-as-code/core; never re-implements load/drift/geo/compile.",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "bin": {
@@ -26,13 +26,15 @@
26
26
  "json-schema"
27
27
  ],
28
28
  "files": [
29
- "dist"
29
+ "dist",
30
+ "skills"
30
31
  ],
31
32
  "scripts": {
32
- "build": "pnpm --filter \"@profile-as-code/cli^...\" build && tsup && node -e \"process.platform !== 'win32' && require('node:fs').chmodSync('dist/index.js', 0o755)\"",
33
+ "build": "pnpm --filter \"@profile-as-code/cli^...\" build && tsup && node scripts/bundle-skills.mjs && node -e \"process.platform !== 'win32' && require('node:fs').chmodSync('dist/index.js', 0o755)\"",
33
34
  "verify:pack": "node scripts/verify-pack.mjs",
34
35
  "guard:release": "node scripts/release-guard.mjs",
35
36
  "prepublishOnly": "publint",
37
+ "prepack": "node scripts/bundle-skills.mjs",
36
38
  "typecheck": "tsc -p tsconfig.test.json",
37
39
  "test": "pnpm build && vitest run",
38
40
  "test:watch": "vitest"
@@ -42,10 +44,13 @@
42
44
  },
43
45
  "dependencies": {
44
46
  "yaml": "^2.9.1",
45
- "zod": "^4.6.5"
47
+ "zod": "^4.6.7"
46
48
  },
47
49
  "devDependencies": {
50
+ "@profile-as-code/artifact": "workspace:*",
48
51
  "@profile-as-code/core": "workspace:*",
52
+ "@profile-as-code/github": "workspace:*",
53
+ "@profile-as-code/paste": "workspace:*",
49
54
  "@profile-as-code/renderers-buymeacoffee": "workspace:*",
50
55
  "@profile-as-code/renderers-github-org": "workspace:*",
51
56
  "@profile-as-code/renderers-github-readme": "workspace:*",
@@ -54,9 +59,9 @@
54
59
  "@profile-as-code/renderers-kofi": "workspace:*",
55
60
  "@profile-as-code/renderers-liberapay": "workspace:*",
56
61
  "@profile-as-code/renderers-payhip": "workspace:*",
57
- "@types/node": "^26.6.4",
62
+ "@types/node": "^26.6.5",
58
63
  "tsup": "^8.5.1",
59
64
  "typescript": "^7.0.2",
60
- "vitest": "^5.0.3"
65
+ "vitest": "^5.0.5"
61
66
  }
62
67
  }
@@ -0,0 +1,62 @@
1
+ # Skills por plataforma
2
+
3
+ Cada plataforma tiene UNA skill: el conocimiento operacional SOTA de esa red,
4
+ versionado y contribuible. Las skills son la capa de *juicio* que complementa
5
+ al renderer (capa determinista de código).
6
+
7
+ ## Estructura de una skill
8
+
9
+ ```
10
+ skills/<plataforma>/
11
+ ├── SKILL.md # frontmatter (nombre, descripción, modelo sugerido) + flujo
12
+ ├── research/ # investigación versionada, con fuentes fechadas
13
+ │ └── SOTA-<año>.md
14
+ ├── playbook.md # pasos de deploy manual + verificación post-pega
15
+ └── checks.yaml # criterios machine-readable que ejecuta `pasco check`
16
+ ```
17
+
18
+ ## División de responsabilidades
19
+
20
+ | Capa | Qué garantiza |
21
+ |---|---|
22
+ | **Renderer** (`packages/renderers/<plataforma>`) | Consistencia: el mismo hecho nunca se contradice entre redes. Determinista, snapshot-tested. |
23
+ | **Skill** (`skills/<plataforma>/`) | Juicio y actualidad: límites oficiales, ranking/SEO, ángulos por audiencia, trampas, checks. |
24
+
25
+ ## Reglas
26
+
27
+ 1. **Evidencia:** toda afirmación cuantitativa lleva fuente + fecha. Sin fuente → no entra.
28
+ 2. **Distinción de fuentes:** `[OFICIAL]` docs de la plataforma · `[EXPERTO]` artículo de autor reconocido ·
29
+ `[BENCHMARK]` patrón observado en perfiles reales · `[?]` sin confirmar.
30
+ 3. **Frontmatter con modelo sugerido:** las skills declaran qué nivel de modelo requieren
31
+ (mecánico = modelo pequeño; juicio = modelo grande) para el refinamiento vía `pasco refine`.
32
+ 4. **GEO obligatorio por skill:** además de SEO, cada skill documenta cómo los LLM leen/citan
33
+ esa plataforma (p. ej. LinkedIn vía agentes, X vía citas, GitHub README como contexto de agente)
34
+ y qué checks de consistencia factual aplican.
35
+ 5. **i18n por skill:** la política de idioma de cada plataforma (qué `lang` prioriza y por qué).
36
+ 6. **Contribución:** PR de skills para plataformas que no cubrimos. Toda skill pasa por
37
+ sanitización + security scan + test de comportamiento antes de aceptarse.
38
+ 7. **No optimizar engagement vacío:** la prioridad es credibilidad + conversión real
39
+ (reclutador, cliente), no métricas superficiales.
40
+
41
+ ## Plataformas objetivo (orden de prioridad)
42
+
43
+ 1. `github-readme` — la única superficie 100% automatizable (git/API)
44
+ 2. `linkedin` — trayectoria profesional
45
+ 3. `upwork` — servicio/cliente
46
+ 4. `x` — visibilidad
47
+ 5. `researchgate` — ciencia
48
+ 6. `substack` — newsletter/audiencia propia (superficie de contenido + perfil)
49
+
50
+ ## Brand flavor (M6, §17)
51
+
52
+ `github-org` — README del GitHub **org** para workspaces `flavor: brand`: voz de
53
+ marca (≠ voz personal), handle-matrix checks (`handle-claimed`/`handle-consistent`,
54
+ offline en `pasco check`), trademark/impersonación. Ver `skills/github-org/`.
55
+
56
+ ## Post skills (MVP, #264)
57
+
58
+ The week-1 post experiment uses a **different shape** from the profile skills:
59
+ `skills/<platform>/post.md` (judgment) + `skills/<platform>/posting.yaml`
60
+ (machine-readable limits/settings). `pasco post` reads them; `pasco refine` keeps
61
+ reading `SKILL.md`. They cover two channels only (`linkedin`, `x`) and are not
62
+ projected to harnesses yet — see `docs/post-mvp.md`.
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: github-org-readme
3
+ description: >
4
+ Transforma los HECHOS del SSOT de un workspace brand (flavor: brand —
5
+ profile-data-topia/content/*.yaml) en el README del GitHub ORG con estrategia
6
+ comunicativa de marca — NO un CV ni un dump de surfaces. Patrón: editorial
7
+ press / high-epistemic (research/SOTA-2026.md). El agente ejecutante produce N
8
+ variantes en prosa; el humano elige; la elegida se registra como variante
9
+ activa (content/active.yaml). La voz de marca NO es la voz personal.
10
+ model: juicio (frontier) — la voz de marca y la estrategia editorial no son delegables
11
+ applies_to: github-org
12
+ projection: agent-agnostic (AionUi, OpenHands, Claude Code, Cursor, pi…)
13
+ version: 0.1.0
14
+ status: draft (M6)
15
+ sources: skills/github-org/research/SOTA-2026.md
16
+ ---
17
+
18
+ # GitHub Org README — skill de marca (flavor brand, §17)
19
+
20
+ ## Misión
21
+
22
+ Convertir los HECHOS del workspace brand (SSOT) en la página de aterrizaje del
23
+ org de GitHub: quién es la marca, qué publica, dónde vive (handle matrix), y
24
+ POR QUÉ importa. El dump determinista ya lo produce el renderer
25
+ (`pasco build github-org`) — esta skill es la capa de **juicio y voz** (D4/D5).
26
+
27
+ ## Regla de oro
28
+
29
+ > Los HECHOS son sagrados (byte-idénticos al SSOT); solo la VOZ varía. La voz de
30
+ > marca ≠ voz personal: no escribas como persona, escribí como la marca.
31
+
32
+ - Nombres, fechas, URLs, handles, estados: **idénticos** a `content/*.yaml`.
33
+ - URLs SOLO de `identity.links` + `socialHandles[].url` (regla drift / §17.1).
34
+ - **Impersonación/trademark:** si un dominio o handle homónimo pertenece a una
35
+ empresa viva NO relacionada (p. ej. `topia.com` es una empresa real no
36
+ relacionada con Topia Press), la marca SIEMPRE firma como su nombre completo
37
+ ("Topia Press") y nunca usa el nombre a secas que podría confundirse.
38
+
39
+ ## Fuente de datos (workspace brand)
40
+
41
+ ```
42
+ content/flavor.yaml → flavor: brand (obligatorio para esta skill)
43
+ content/identity.yaml → name, orgName, mission, tagline, brandVoice, established, links
44
+ content/socialHandles.yaml → la handle matrix (status: claimed|pending) — SEED
45
+ content/newsletter.yaml → Substack/Ghost
46
+ content/podcast.yaml → Spotify/RSS
47
+ content/press.yaml → menciones de prensa (fechadas, resolubles)
48
+ content/audiences.yaml → perfiles de lector (no reclutador)
49
+ content/keywords.yaml → SEO + GEO
50
+ ```
51
+
52
+ ## Estrategia comunicativa (editorial press — SOTA-2026 §3)
53
+
54
+ 1. **¿Quién lee?** Lectores de alta exigencia epistémica, suscriptores, prensa,
55
+ LLMs que citan (GEO).
56
+ 2. **¿Qué quiero que hagan?** Suscribirse al newsletter, seguir la marca en sus
57
+ plataformas, citar los ensayos.
58
+ 3. **¿Cuál es mi señal más fuerte?** La consistencia: mismo nombre, misma
59
+ misión, mismos handles en todas las superficies — la marca ES su coherencia
60
+ (handle-claimed / handle-consistent).
61
+
62
+ Liderá con #3: una marca dispersa (handles sin claim, URLs contradictorias) no
63
+ se cita, se ignora.
64
+
65
+ ## Voice matrix (brandVoice → secciones)
66
+
67
+ | Contexto | Voz | Trampa a evitar |
68
+ |---|---|---|
69
+ | Header/misión | editorial, riguroso, esperanzado | doom-scrolling, hype |
70
+ | Newsletter | concreto, de alta señal | prometer "todo sobre X" |
71
+ | Press | factual, modesto | autobombo |
72
+ | Footers/CTAs | UN llamado claro | múltiples CTAs |
73
+
74
+ ## Checklist de deploy (manual + git)
75
+
76
+ 1. `pasco validate` — schema OK y 0 drift warnings en la handle matrix.
77
+ 2. `pasco check` — handle-claimed / handle-consistent OK (offline) + `url-live` de
78
+ cada handle claimed (network, verificación manual).
79
+ 3. `pasco build github-org --lang en` → `profiles/github-org/README.md`.
80
+ 4. Copiar el README al repo del org (deploySpec: git; el humano mergea —
81
+ repo-governance).
82
+ 5. Verificación post-deploy: cada badge/link del README resuelve; los handles
83
+ pending NO figuran como surfaces vivas.
84
+
85
+ ## GEO
86
+
87
+ `schema.org/Organization` JSON-LD con `@id` = el link con `role: identity` (ausente si
88
+ ninguno lo declara) y `sameAs` = los links con `role: realization` + claimed handles
89
+ (v1.6/#103; antes de v1.6 era identity.links completo). El email de contacto
90
+ (`identity.email`, v1.5/#71) sale como propiedad `email`, nunca dentro de `sameAs`. Un LLM que triangule la marca debe encontrar el mismo nombre,
91
+ misión y set de handles en GitHub, X, Bluesky y el newsletter — esa consistencia
92
+ ES la citabilidad.
@@ -0,0 +1,40 @@
1
+ # checks.yaml — criterios machine-readable para `pasco check github-org`
2
+ # (unión con content/checks.yaml del workspace; misma rule catalog que el schema).
3
+ # v1.1/§17: handle-claimed y handle-consistent se EJECUTAN offline en pasco check
4
+ # (drift codes); url-live es la verificación de red (skill, no drift).
5
+
6
+ - id: org-handle-claimed
7
+ platform: github-org
8
+ rule: handle-claimed
9
+ value: true
10
+ note: "Todo handle claimed debe resolver a una URL (offline: drift/handle-claimed-not-linked; live: url-live)."
11
+
12
+ - id: org-handle-consistent
13
+ platform: github-org
14
+ rule: handle-consistent
15
+ value: true
16
+ note: "La handle matrix es el SSOT: una fila por plataforma, hosts correctos (offline: drift/duplicate-handle, drift/handle-host-mismatch)."
17
+
18
+ - id: org-mission-identity
19
+ platform: github-org
20
+ rule: fact-present
21
+ value: true
22
+ note: "name/mission/tagline del README byte-idénticos al SSOT (D4)."
23
+
24
+ - id: org-links-identity
25
+ platform: github-org
26
+ rule: link-in-identity
27
+ value: true
28
+ note: "Toda URL del README vive en identity.links o socialHandles[].url (regla drift, §17.1)."
29
+
30
+ - id: org-jsonld-org
31
+ platform: github-org
32
+ rule: geo-consistent
33
+ value: true
34
+ note: "JSON-LD schema.org/Organization: @id = el link con role: identity (ausente si no hay ninguno), sameAs = links con role: realization + claimed handles (GEO, v1.6/#103, §15.4)."
35
+
36
+ - id: org-cta-one
37
+ platform: github-org
38
+ rule: lang-present
39
+ value: en
40
+ note: "EN requerido (D8/§11); un CTA primario por variante (suscribirse al newsletter)."
@@ -0,0 +1,30 @@
1
+ # Playbook — deploy del GitHub Org README (flavor brand, deploySpec: git)
2
+
3
+ ## Pre-requisitos
4
+
5
+ - Workspace brand (`pasco init --flavor brand`) con `content/` lleno y
6
+ `pasco validate` en verde.
7
+ - Org de GitHub creado (privado hasta pasar el checklist de public-readiness —
8
+ repo-governance).
9
+
10
+ ## Pasos
11
+
12
+ 1. **Handle matrix** — `pasco check` (offline):
13
+ - Cada fila `claimed` tiene `url` o match en `identity.links`.
14
+ - Sin `drift/duplicate-handle`, sin `drift/handle-host-mismatch`.
15
+ 2. **Live check (manual, red):** abrí cada URL `claimed` — debe resolver al
16
+ perfil correcto (verificación `url-live` que el engine no automatiza).
17
+ 3. **Build:** `pasco build github-org --lang en` →
18
+ `profiles/github-org/README.md`.
19
+ 4. **Deploy:** copiá el README al repo `org/org` del GitHub org y commiteá en tu
20
+ branch + PR — el humano mergea (repo-governance §3).
21
+ 5. **Verificación post-deploy:** cada badge y link del README resuelve; los
22
+ handles `pending` NO figuran como surfaces vivas; el JSON-LD `Organization`
23
+ está embebido (GEO §17.1).
24
+
25
+ ## Nota de marca (impersonación)
26
+
27
+ Si un dominio/handle homónimo pertenece a una empresa viva NO relacionada
28
+ (p. ej. `topia.com`), la marca siempre firma con su nombre completo
29
+ ("Topia Press") — nunca el nombre a secas. Checks: `org-mission-identity`,
30
+ `org-cta-one`.
@@ -0,0 +1,39 @@
1
+ # SOTA-2026 — GitHub org README / brand landing (brand flavor, M6)
2
+
3
+ Dated, evidence-tagged sources for the `github-org` skill. Claims without a
4
+ source + date do not enter (regla de evidencia).
5
+
6
+ ## Sources
7
+
8
+ - **[OFICIAL] GitHub docs — "Creating a default community health file" / org
9
+ profiles** (2026, github.com/orgs/community). Org READMEs render on the org
10
+ landing page; they are the first page a visitor (human or LLM agent) sees.
11
+ - **[OFICIAL] schema.org — Organization type** (2026, schema.org/Organization):
12
+ `sameAs`, `logo`, `foundingDate`, `slogan`, `description` are the machine-
13
+ readable fields an LLM triangulates across surfaces.
14
+ - **[BENCHMARK] Handle-consistency pattern** (observado 2026-08-18 en el sweep
15
+ de disponibilidad de handles de Topia Press, operador): la marca vive en 10+
16
+ superficies (X, Bluesky, GitHub org, Substack, Instagram, TikTok, YouTube,
17
+ Reddit, Mastodon, SoundCloud + dominio canónico); el drift manual de esa
18
+ matrix es el problema que el engine resuelve (issue #25).
19
+ - **[EXPERTO] Brand voice vs personal voice** (2026, práctica de agencias de
20
+ marca): una org no "habla como persona" — misión/tagline estables, un CTA
21
+ primario, consistencia sobre autobombo. La voz de marca es la coherencia.
22
+
23
+ ## Implicaciones para el renderer y la skill
24
+
25
+ 1. El README del org es la **primera superficie GEO** de la marca: el JSON-LD
26
+ `Organization` con `sameAs` = links + claimed handles es lo que un LLM cita.
27
+ 2. La **handle matrix es el SSOT** de superficies (más fiable que adivinar de
28
+ `identity.links`): filas `claimed` son surfaces vivas; `pending` no se
29
+ despliegan.
30
+ 3. **Consistencia = citabilidad** (SPEC §8): mismo nombre, misma misión, mismos
31
+ handles en todas las superficies.
32
+ 4. **Impersonación:** homónimos vivos no relacionados (p. ej. `topia.com`) →
33
+ firmar siempre con el nombre completo de la marca.
34
+
35
+ ## Open questions (skill-level)
36
+
37
+ - ¿El org README debe listar repos públicos del org (proyectos de la marca) en
38
+ M6? El renderer v1 no lo hace (los repos del org son surfaces secundarias; el
39
+ newsletter/podcast/prensa son las primarias).
@@ -0,0 +1,114 @@
1
+ ---
2
+ name: github-readme-profile
3
+ description: >
4
+ Transforma los hechos del SSOT (profile-data/content/*.yaml) en un GitHub profile
5
+ README con estrategia comunicativa y estética deliberada — NO un dump de CV.
6
+ Patrón: OSS Maintainer / minimalista senior (research/SOTA-2026.md). El agente
7
+ ejecutante produce N variantes en prosa; el humano elige; la elegida se registra
8
+ como variante activa (content/active.yaml).
9
+ model: juicio (frontier) — la estrategia narrativa no es delegable a modelos pequeños
10
+ applies_to: github-readme
11
+ projection: agent-agnostic (AionUi, OpenHands, Claude Code, Cursor, pi…)
12
+ version: 0.1.0
13
+ status: draft (M3)
14
+ sources: skills/github-readme/research/SOTA-2026.md
15
+ ---
16
+
17
+ # GitHub Profile README — skill de comunicación
18
+
19
+ ## Misión
20
+
21
+ Convertir los HECHOS del workspace (SSOT) en una página de perfil que se lea en
22
+ **30 segundos** con una impresión fuerte: quién sos, qué estás construyendo AHORA,
23
+ por qué importa, y UNA acción posible. El dump exhaustivo ya lo produce el renderer
24
+ determinista (`pasco build`) — esta skill es la capa de **juicio y narrativa** (D4/D5).
25
+
26
+ ## Regla de oro
27
+
28
+ > Los HECHOS son sagrados (byte-idénticos al SSOT); solo la HISTORIA varía.
29
+
30
+ - Nombres, fechas, DOIs, números, URLs: **idénticos** a `content/*.yaml`. Prohibido
31
+ inventar, redondear o reordenar hechos.
32
+ - URLs SOLO de `identity.links` (regla drift). No inventes links.
33
+ - Claims cuantitativos SOLO de `projects[].evidence` o `keywords.geo.claims`.
34
+
35
+ ## Fuente de datos
36
+
37
+ Lee el workspace (ruta del `.pascorc` o `--workspace`):
38
+
39
+ ```
40
+ content/identity.yaml → nombre, ubicación, links canónicos (TU fuente de URLs)
41
+ content/positioning.yaml → statement + ángulos por audiencia + anclas GEO
42
+ content/projects.yaml → qué construís (status + evidence verificable)
43
+ content/publications.yaml → papers/preprints con DOI
44
+ content/skills.yaml → stack con pesos por plataforma
45
+ content/bios.yaml → textos base por plataforma (punto de partida)
46
+ content/keywords.yaml → SEO + GEO (associations/claims)
47
+ ```
48
+
49
+ ## Estrategia comunicativa (framework de 3 preguntas — SOTA-2026 §3)
50
+
51
+ 1. **¿Quién lee?** Contribuidores OSS, sponsors, reclutadores técnicos, pares.
52
+ 2. **¿Qué quiero que hagan?** Explorar los proyectos, sponsor (Patreon/GitHub Sponsors),
53
+ contactar para colaborar/contratar.
54
+ 3. **¿Cuál es mi señal más fuerte?** Para un perfil open-source/soberanía: el trabajo
55
+ público con evidencia (upstream PRs merged, papers con DOI, deployments probados).
56
+
57
+ Liderá con #3 filtrado por #1: **stewardship** (proyectos vivos con proof), no branding.
58
+
59
+ ## Estructura del README (prosa, no dump)
60
+
61
+ 1. **Header**: nombre + one-liner que responde "qué construís" (de `statement`/headlines,
62
+ reescrito en prosa si mejora) + badges canónicas (identity.links) centradas.
63
+ 2. **Hook** (2–3 líneas): quién sos y por qué lo que hacés importa — conectá física +
64
+ sistemas complejos + IA soberana como UNA historia, no como lista. Weave de las
65
+ anclas GEO (`positioning.geo.semanticAssociations`) de forma natural, sin stuffing.
66
+ 3. **Qué estoy construyendo AHORA** (2–3 proyectos con narrativa): nombre, una frase de
67
+ valor (de `description`), UNA evidencia verificable (de `evidence[]`). Prosa corta,
68
+ no bullets de 4 items. Prioridad por `skills[].platformWeights[github-readme]`.
69
+ 4. **Evidencia de stewardship** (una sección corta): upstream PRs (merged/open) y
70
+ papers con DOI — woven como "every merged PR is infrastructure that belongs to
71
+ everyone". Tabla compacta si son varios.
72
+ 5. **Stack como señal**: 4–6 tecnologías reales de `skills` (los keywords de mayor peso),
73
+ no todos los que tocaste. Badges shields.io máximo ~8.
74
+ 6. **UN CTA**: Patreon (soporte al trabajo) + UN link más (CV o contacto). No cinco.
75
+ 7. **Footer**: firma visual (one-liner o ASCII art sutil, coherente con la identidad) +
76
+ `<!-- generated by profile-as-code pasco refine github-readme · variant <id> -->`.
77
+
78
+ ## Estética (SOTA-2026 §6)
79
+
80
+ - **Dark-first**: assets y badges que funcionen en dark mode (GitHub sigue el tema del
81
+ sistema). Nada de fondos claros forzados.
82
+ - **Restraint**: máximo un widget de stats (o ninguno si los repos hablan solos);
83
+ cero typing-animations, cero visitor counters, cero snake games.
84
+ - **Jerarquía visual**: headers claros, whitespace, una sola columna. `<details>`
85
+ accordions para material secundario si hace falta.
86
+ - **Centrado HTML div** para el header/badges en pantallas anchas.
87
+ - Tipografía: sin emojis decorativos; símbolos funcionales (✓ mergeado, ↗ link) como
88
+ máximo.
89
+
90
+ ## Variantes (flujo refine)
91
+
92
+ - Producí **N variantes** (`--variants N`, default 3) con ángulos distintos:
93
+ 1. **Stewardship** (por defecto): lidera con open source + evidencia.
94
+ 2. **Soberanía**: lidera con la tesis (IA soberana, economía agéntica), proyectos como prueba.
95
+ 3. **Investigador**: lidera con publicaciones/DOI, proyectos como aplicación.
96
+ - Cada variante: `variantId` = `gh-<lang>-<n>` (ej. `gh-en-1`).
97
+ - El humano elige; se registra con `pasco refine github-readme --choose <id>` →
98
+ escribe `content/active.yaml`.
99
+
100
+ ## Verificación (checks)
101
+
102
+ - `pasco validate` exit 0 (schema + drift 0 + geo).
103
+ - Facts byte-idénticos: cruzá cada hecho del README contra el YAML.
104
+ - Links ⊆ `identity.links` (más el hecho de contacto: fila `- [Email](mailto:…)` derivada
105
+ de `identity.email`, v1.5/#71 — primero en `## Links`, output-only, nunca en `sameAs`).
106
+ - Length: el README se lee en 30s (SOTA-2026 §1) — si hay más de ~40 líneas, recortá.
107
+ - CTA: exactamente una acción primaria.
108
+
109
+ ## GEO (consistencia = citabilidad)
110
+
111
+ - Los hechos del README deben coincidir byte a byte con el CV y LinkedIn (fechas,
112
+ roles, papers) — un LLM que triangula y encuentra contradicción te descarta.
113
+ - Los anchors semánticos se refuerzan naturalmente en la prosa (no keyword stuffing:
114
+ los LLM lo descuentan, SPEC §8 anti-patterns).
@@ -0,0 +1,32 @@
1
+ # checks.yaml — criterios machine-readable para `pasco check github-readme`
2
+ # (unión con content/checks.yaml del workspace; misma rule catalog que el schema).
3
+
4
+ - id: gh-bio-max
5
+ platform: github-readme
6
+ rule: max-chars
7
+ value: 280
8
+ note: "Bio corta (one-liner) — el README se lee en ~30s (SOTA-2026 §1)."
9
+
10
+ - id: gh-facts-identity
11
+ platform: github-readme
12
+ rule: fact-present
13
+ value: true
14
+ note: "Los hechos del README deben estar byte-idénticos al SSOT (D4)."
15
+
16
+ - id: gh-links-identity
17
+ platform: github-readme
18
+ rule: link-in-identity
19
+ value: true
20
+ note: "Toda URL del README vive en identity.links (regla drift)."
21
+
22
+ - id: gh-geo-consistent
23
+ platform: github-readme
24
+ rule: geo-consistent
25
+ value: true
26
+ note: "Hechos consistentes con las otras superficies (CV, LinkedIn) = citabilidad."
27
+
28
+ - id: gh-cta-one
29
+ platform: github-readme
30
+ rule: lang-present
31
+ value: en
32
+ note: "EN requerido (D8/§11); un CTA primario por variante."
@@ -0,0 +1,36 @@
1
+ # GitHub Profile README — deploy playbook
2
+
3
+ Deploy = git (D9): el README generado se commitea en el repo-perfil
4
+ (`<user>/<user>`, p.ej. `ChristianLuciani/ChristianLuciani`) y GitHub lo muestra.
5
+ Sin pegar a mano, sin API.
6
+
7
+ ## Flujo
8
+
9
+ 1. **Refine**: `pasco refine github-readme --variants 3` → el agente (esta skill)
10
+ produce 3 variantes en prosa. Elegí una:
11
+ `pasco refine github-readme --choose gh-en-2`.
12
+ 2. **Build**: `pasco build github-readme` → si hay una variante activa con cuerpo,
13
+ escribe ese README completo VERBATIM en `profiles/github-readme/README.md`;
14
+ sin variante, regenera el snapshot determinista del SSOT (control de verdad).
15
+ 3. **Deploy**: copiá el artefacto al repo-perfil y commit:
16
+ ```sh
17
+ cp profiles/github-readme/README.md ../<usuario>/README.md
18
+ cd ../<usuario> && git commit -am "docs: profile README (variante activa, desde profile-data)"
19
+ ```
20
+ 4. **Verificar en GitHub**: perfil → se ve el README en dark/light, links clicables,
21
+ facts consistentes con el CV.
22
+
23
+ ## Verificación post-deploy (CHECKLIST)
24
+
25
+ - [ ] README visible en el perfil (repo público con el nombre del usuario)
26
+ - [ ] Dark mode OK (badges y assets legibles)
27
+ - [ ] Todos los links → identity.links (clicables, sin 404)
28
+ - [ ] Facts byte-idénticos al CV (fechas, roles, papers, DOIs)
29
+ - [ ] UN CTA primario (Patreon + un link más)
30
+ - [ ] Se lee en ~30 segundos
31
+ - [ ] `pasco validate` exit 0 con la variante activa registrada
32
+
33
+ ## Rollback
34
+
35
+ Git: `git revert` del último commit del repo-perfil. El SSOT nunca se ve afectado
36
+ (el deploy es un commit normal).
@@ -0,0 +1,105 @@
1
+ # SOTA 2026 — GitHub Profile README
2
+
3
+ > Research fechada para la skill `github-readme` (SPEC §16, M3). Regla de evidencia:
4
+ > toda afirmación cuantitativa lleva fuente + fecha; `[OFICIAL]` docs de la plataforma,
5
+ > `[EXPERTO]` autor reconocido, `[BENCHMARK]` patrón observado en perfiles reales, `[?]` sin confirmar.
6
+
7
+ ## 1. El problema central: señal, no ruido
8
+
9
+ El error N°1 es tratar el README como un **resumen de CV**: listas largas de tecnologías,
10
+ paredes de badges, GIFs animados. Los reclutadores piden "signal, not noise"
11
+ [EXPERTO — Codeboards.io, "GitHub Profile README Guide 2026", 2026].
12
+
13
+ - Un visitante decide en **~6 segundos** si explora más [EXPERTO — Igor Braz, dev.to,
14
+ "Top 10 Hacks... 2026", 2026-08-06].
15
+ - Reclutadores técnicos pasan **30–90 segundos** en un perfil de GitHub; la meta es
16
+ **comprensión en 30 segundos, no completitud** [EXPERTO — Quillly/devbio.me,
17
+ "GitHub Profile README: What to Include in 2026", updated 2026-06].
18
+ - El 82% de las contribuciones ocurren en repos privados [OFICIAL — GitHub Octoverse 2025]
19
+ → el perfil público muestra <20% del output real; el README debe **dirigir a la mejor
20
+ evidencia pública**, no intentar listar todo.
21
+
22
+ ## 2. Los 8 elementos que funcionan (2026)
23
+
24
+ [EXPERTO — Quillly/devbio.me, 2026-06]
25
+
26
+ 1. **Bio de una línea** que responde "qué construís", no el cargo ("passionate developer"
27
+ no funciona).
28
+ 2. **Stack como señal, no como lista**: 3–5 tecnologías en las que sos genuinamente
29
+ experto. TS es #1 en GitHub desde ago 2025 (+66.6% YoY, Octoverse 2025) — decirlo
30
+ explícito si aplica.
31
+ 3. **Un widget de stats** (dark-themed, que matchee el perfil). Ojo: los contadores de
32
+ contribuciones se están inflando por herramientas de IA (1M+ PRs generados por IA
33
+ entre may–sep 2025 [OFICIAL — Octoverse 2025]) → volumen es señal más débil.
34
+ 4. **Heatmap de contribuciones** (consistencia > estallido).
35
+ 5. **Repos pineados con contexto**: una frase de qué hace, no solo el nombre.
36
+ 6. **Qué estás construyendo AHORA** (momentum — da razón concreta para contactar).
37
+ 7. **UN link** deliberado (el que cuente la historia completa más rápido).
38
+ 8. **UN número honesto** (stars, usuarios, deployments) — más credibilidad que prosa.
39
+
40
+ ### Qué NO incluir
41
+
42
+ - Texto animado de typing ("I'm a developer who loves to code…") — el equivalente de un
43
+ spinner; todo generador lo produce [EXPERTO — Quillly, 2026-06].
44
+ - Contadores de visitas (se inflan, no dicen nada).
45
+ - "Currently learning X, Y, Z" (señal de que no estás haciendo bien ninguno).
46
+ - Párrafos largos de bio (nadie los lee).
47
+ - Skills en prosa ("team player") — cero señal.
48
+
49
+ ## 3. El framework de las 3 preguntas (antes de escribir)
50
+
51
+ [EXPERTO — Quillly, "10 Templates (2026)", 2026-06]
52
+
53
+ 1. ¿Quién lee esto? (reclutador, contribuidor OSS, cliente, co-founder)
54
+ 2. ¿Qué quiero que hagan? (contratar, abrir un PR, bookear una llamada, sponsor)
55
+ 3. ¿Cuál es mi señal más fuerte? (años, repos con stars, revenue, papers)
56
+
57
+ El README lidera con la respuesta a #3, filtrada por #1. No se puede hablar a 180M de
58
+ desarrolladores a la vez — **un patrón, una audiencia**.
59
+
60
+ ## 4. Patrón recomendado: The OSS Maintainer (stewardship)
61
+
62
+ Para un perfil alineado a **open source + soberanía tecnológica**, el patrón OSS
63
+ Maintainer es el correcto [EXPERTO — Quillly, Pattern 2, 2026-06]:
64
+
65
+ - Señal de **stewardship**, no branding personal: contribuidores potenciales revisan el
66
+ perfil ANTES del código.
67
+ - Elementos: proyectos activos con descripción de una frase + evidencia; widget de stats
68
+ o heatmap; **CTA de sponsorship** (GitHub Sponsors / Patreon / Polar); links de
69
+ comunidad.
70
+ - "One founder documented how consistent public proof of project activity was the
71
+ turning point from zero to five-figure MRR — the README is the most visible piece of
72
+ that proof" [EXPERTO — Indie Hackers, citado en Quillly, 2026-06].
73
+
74
+ Variante "minimalista senior" [EXPERTO — Quillly, Pattern 5]: tres cosas claras > veinte
75
+ vagas; cada palabra gana su lugar; funciona cuando los repos pineados son fuertes.
76
+
77
+ ## 5. GEO — cómo leen los LLM el perfil de GitHub
78
+
79
+ - El README del perfil es **contexto de agente**: un LLM que triangula una identidad
80
+ cruza GitHub ↔ LinkedIn ↔ web. Hechos inconsistentes = auto-descarte [INF — SPEC §8].
81
+ - La consistencia factual entre superficies ES citabilidad: fechas/roles/papers idénticos.
82
+ - Structured data: el JSON-LD `Person` (sameAs = links canónicos) ayuda a la resolución
83
+ [INF — schema/README.md, geoCheck structured-data readiness].
84
+
85
+ ## 6. Estética (2026, lo que funciona)
86
+
87
+ - **Dark-first**: el widget de stats y los assets deben matchear dark mode
88
+ [EXPERTO — dev.to Igor Braz, hack #9: SVG con media queries de prefers-color-scheme].
89
+ - **Centrado HTML div** para header/badges en pantallas anchas [EXPERTO — dev.to, hack #10].
90
+ - **Accordions `<details>`** para material secundario (setup, certificaciones) — mantiene
91
+ limpio el primer scroll [EXPERTO — dev.to, hack #6].
92
+ - **Restraint**: un solo widget de stats; paredes de badges = señal de optimización en
93
+ vez de construcción [EXPERTO — Quillly, 2026-06].
94
+ - **ASCII art / one-liner** como firma visual funciona si es parte de la identidad
95
+ (perfil senior), no un decorado [BENCHMARK — patrón observado en perfiles técnicos].
96
+
97
+ ## 7. Fuentes
98
+
99
+ | Fuente | Tipo | Fecha |
100
+ |---|---|---|
101
+ | GitHub Octoverse 2025 (82% privado, 1M+ PRs IA, TS #1, 36.2M nuevos) | [OFICIAL] | 2025 |
102
+ | Quillly/devbio.me — "GitHub Profile README: What to Include in 2026" | [EXPERTO] | 2026-06 |
103
+ | Quillly/devbio.me — "10 Patterns (2026)" (framework 3 preguntas, OSS Maintainer) | [EXPERTO] | 2026-06 |
104
+ | Codeboards.io — "Complete Guide 2026" (signal not noise) | [EXPERTO] | 2026 |
105
+ | Igor Braz — dev.to "Top 10 Hacks 2026" (6s, dark-mode, accordions) | [EXPERTO] | 2026-08-06 |