izanagi-ai 3.21.0 → 3.22.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 (93) hide show
  1. package/.claude/skills/conversion-copywriting/SKILL.md +58 -58
  2. package/.claude/skills/economia-tokens/SKILL.md +21 -2
  3. package/.claude/skills/editorial-layout/SKILL.md +79 -79
  4. package/.claude/skills/payments-billing/SKILL.md +83 -83
  5. package/.manifest +2 -2
  6. package/AGENTS.md +1 -1
  7. package/CHANGELOG.md +62 -0
  8. package/CLAUDE.md +82 -81
  9. package/README.md +81 -2
  10. package/ROADMAP.md +76 -1
  11. package/RULES.md +1 -1
  12. package/SYSTEM.md +42 -3
  13. package/dist/cli/commands/doctor.d.ts.map +1 -1
  14. package/dist/cli/commands/doctor.js +37 -0
  15. package/dist/cli/commands/doctor.js.map +1 -1
  16. package/dist/cli/commands/export.d.ts.map +1 -1
  17. package/dist/cli/commands/export.js +55 -24
  18. package/dist/cli/commands/export.js.map +1 -1
  19. package/dist/cli/commands/models.d.ts.map +1 -1
  20. package/dist/cli/commands/models.js +13 -1
  21. package/dist/cli/commands/models.js.map +1 -1
  22. package/dist/cli/commands/run.d.ts +14 -0
  23. package/dist/cli/commands/run.d.ts.map +1 -1
  24. package/dist/cli/commands/run.js +47 -6
  25. package/dist/cli/commands/run.js.map +1 -1
  26. package/dist/exporters.d.ts +27 -1
  27. package/dist/exporters.d.ts.map +1 -1
  28. package/dist/exporters.js +495 -491
  29. package/dist/exporters.js.map +1 -1
  30. package/dist/installer.d.ts +0 -3
  31. package/dist/installer.d.ts.map +1 -1
  32. package/dist/installer.js +31 -15
  33. package/dist/installer.js.map +1 -1
  34. package/dist/runtime/cache/response-cache.d.ts +7 -0
  35. package/dist/runtime/cache/response-cache.d.ts.map +1 -1
  36. package/dist/runtime/cache/response-cache.js +5 -1
  37. package/dist/runtime/cache/response-cache.js.map +1 -1
  38. package/dist/runtime/contracts/artifacts.d.ts.map +1 -1
  39. package/dist/runtime/contracts/artifacts.js +10 -0
  40. package/dist/runtime/contracts/artifacts.js.map +1 -1
  41. package/dist/runtime/execute.d.ts +21 -1
  42. package/dist/runtime/execute.d.ts.map +1 -1
  43. package/dist/runtime/execute.js +31 -4
  44. package/dist/runtime/execute.js.map +1 -1
  45. package/dist/runtime/llm/agent-cli.d.ts +274 -0
  46. package/dist/runtime/llm/agent-cli.d.ts.map +1 -0
  47. package/dist/runtime/llm/agent-cli.js +515 -0
  48. package/dist/runtime/llm/agent-cli.js.map +1 -0
  49. package/dist/runtime/llm/client.d.ts +35 -2
  50. package/dist/runtime/llm/client.d.ts.map +1 -1
  51. package/dist/runtime/llm/client.js +25 -2
  52. package/dist/runtime/llm/client.js.map +1 -1
  53. package/dist/runtime/model/router.d.ts +22 -1
  54. package/dist/runtime/model/router.d.ts.map +1 -1
  55. package/dist/runtime/model/router.js +63 -3
  56. package/dist/runtime/model/router.js.map +1 -1
  57. package/dist/runtime/orchestrator.d.ts +16 -11
  58. package/dist/runtime/orchestrator.d.ts.map +1 -1
  59. package/dist/runtime/orchestrator.js +4 -1
  60. package/dist/runtime/orchestrator.js.map +1 -1
  61. package/dist/runtime/tests/agent-cli.test.d.ts +2 -0
  62. package/dist/runtime/tests/agent-cli.test.d.ts.map +1 -0
  63. package/dist/runtime/tests/agent-cli.test.js +484 -0
  64. package/dist/runtime/tests/agent-cli.test.js.map +1 -0
  65. package/dist/runtime/tests/capability-fields.test.js +16 -2
  66. package/dist/runtime/tests/capability-fields.test.js.map +1 -1
  67. package/dist/runtime/tests/clean-temp.test.d.ts +2 -0
  68. package/dist/runtime/tests/clean-temp.test.d.ts.map +1 -0
  69. package/dist/runtime/tests/clean-temp.test.js +83 -0
  70. package/dist/runtime/tests/clean-temp.test.js.map +1 -0
  71. package/dist/runtime/tests/export-global.test.d.ts +2 -0
  72. package/dist/runtime/tests/export-global.test.d.ts.map +1 -0
  73. package/dist/runtime/tests/export-global.test.js +46 -0
  74. package/dist/runtime/tests/export-global.test.js.map +1 -0
  75. package/dist/runtime/tests/installer-consumer-docs.test.js +17 -0
  76. package/dist/runtime/tests/installer-consumer-docs.test.js.map +1 -1
  77. package/dist/runtime/tests/model.test.js +5 -2
  78. package/dist/runtime/tests/model.test.js.map +1 -1
  79. package/dist/runtime/token/execution-budget.d.ts +8 -0
  80. package/dist/runtime/token/execution-budget.d.ts.map +1 -1
  81. package/dist/runtime/token/execution-budget.js +12 -0
  82. package/dist/runtime/token/execution-budget.js.map +1 -1
  83. package/dist/scripts/clean-temp.d.ts +56 -0
  84. package/dist/scripts/clean-temp.d.ts.map +1 -0
  85. package/dist/scripts/clean-temp.js +141 -0
  86. package/dist/scripts/clean-temp.js.map +1 -0
  87. package/dist/scripts/verify-build.js +27 -13
  88. package/dist/scripts/verify-build.js.map +1 -1
  89. package/dist/sdk.d.ts +6 -0
  90. package/dist/sdk.d.ts.map +1 -1
  91. package/dist/sdk.js +1 -0
  92. package/dist/sdk.js.map +1 -1
  93. package/package.json +101 -100
@@ -3,64 +3,64 @@ name: conversion-copywriting
3
3
  description: "Copywriting persuasivo e específico para headline, CTA e microcopy: benefício mensurável, prova concreta, verbo de ação, sem clichê de IA. Use ao escrever qualquer texto voltado a conversão (landing, pricing, onboarding, email transacional)."
4
4
  ---
5
5
 
6
- # Skill Conversion Copywriting — Izanagi
7
-
8
- ## Identidade
9
-
10
- `anti-ai-slop` diz o que NÃO escrever (clichê genérico). Esta skill ensina o que escrever no lugar: copy que converte porque é específica, concreta e resolve a objeção real do leitor no momento em que ela aparece.
11
-
12
- ## O Teste da Especificidade
13
-
14
- Toda frase de copy passa por uma pergunta: **"essa frase poderia estar em qualquer produto do mundo, ou só faz sentido no meu?"** Se serve pra qualquer produto, é slop.
15
-
16
- | Genérico (falha o teste) | Específico (passa o teste) |
17
- |---|---|
18
- | "A melhor forma de gerenciar sua equipe" | "Corte 4h/semana de status meeting: cada tarefa atualiza sozinha quando o PR fecha" |
19
- | "Rápido e confiável" | "P95 de 80ms, 99.95% uptime nos últimos 12 meses (status.exemplo.com)" |
20
- | "Simplifique seu fluxo de trabalho" | "De 6 ferramentas pra 1: substitui planilha de horas, Slack de aprovação e e-mail de nota fiscal" |
21
- | "Junte-se a milhares de usuários satisfeitos" | "2.340 times ativos, NPS 71" (ou não usar prova social até ter o número real) |
22
-
23
- ## Estrutura de Headline (acima da dobra)
24
-
25
- 1. **Benefício mensurável primeiro**, mecanismo depois: `[resultado com número] + [como]`. Ex: "Reduza custo de API em 63% com cache de resposta" — não "Otimize sua infraestrutura de IA."
26
- 2. **Uma promessa por headline.** Empilhar 3 benefícios na mesma frase dilui todos.
27
- 3. **Verbo de ação concreto**, nunca abstrato: "Corte", "Gere", "Rastreie", "Elimine" — não "Otimize", "Eleve", "Transforme", "Desbloqueie" (tells do catálogo `anti-ai-slop`).
28
-
29
- ## CTA (Call to Action)
30
-
31
- - CTA descreve o que acontece ao clicar, não um comando vago: "Ver preço por time" > "Começar agora"; "Testar com meus dados" > "Saiba mais".
32
- - Reduza fricção percebida no microcopy abaixo do botão quando o pedido é sensível: "sem cartão de crédito", "cancele quando quiser", "2 minutos de setup" — só se for verdade.
33
- - Um CTA primário por seção. CTA secundário (se existir) é visualmente subordinado, nunca do mesmo peso.
34
-
35
- ## Objeção-Resposta (para seções de pricing/FAQ/comparação)
36
-
37
- Toda seção de conversão deve responder objeções reais do comprador, não listar features:
38
- 1. Levante a objeção mais provável daquele ponto do funil ("é caro pra time pequeno?", "dá pra migrar sem perder dados?", "e se eu já uso X?").
39
- 2. Responda com fato verificável (número, garantia, comparação direta), não com reafirmação vaga da promessa.
40
- 3. Uma objeção por bloco — não misture 3 respostas num parágrafo só.
41
-
42
- ## Microcopy (formulários, erros, estados vazios)
43
-
44
- - Erro de formulário diz o que corrigir, não que "algo deu errado": "E-mail já cadastrado. Entrar em vez de criar conta?" > "Erro de validação."
45
- - Estado vazio orienta a próxima ação, não descreve a ausência: "Crie seu primeiro projeto para ver métricas aqui" > "Nenhum dado encontrado."
46
- - Confirmação de ação irreversível nomeia a consequência real: "Isso cancela a assinatura no fim do ciclo atual (14/03)" > "Tem certeza?"
47
-
48
- ## Checklist Antes de Entregar
49
-
50
- - [ ] Nenhuma frase passa no "serve pra qualquer produto" (o teste da especificidade)
51
- - [ ] Toda métrica/prova social citada é real ou está marcada como placeholder explícito para o cliente preencher (nunca inventada)
52
- - [ ] Zero verbo abstrato de catálogo `anti-ai-slop` (Elevate, Unlock, Transform, Empower, Seamless, Cutting-edge...)
53
- - [ ] CTA descreve a ação real, não um comando genérico
54
- - [ ] Cada seção de objeção responde UMA pergunta real do comprador
55
-
56
- ## Skills Relacionadas
57
-
58
- - `anti-ai-slop` — catálogo do que evitar (esta skill é o complemento positivo: o que escrever)
59
- - `ux-reviewer` — heurísticas de usabilidade do fluxo onde a copy vive
60
- - `design-directions` — tom de voz faz parte da direção de design escolhida
61
-
62
- ## References
63
-
6
+ # Skill Conversion Copywriting — Izanagi
7
+
8
+ ## Identidade
9
+
10
+ `anti-ai-slop` diz o que NÃO escrever (clichê genérico). Esta skill ensina o que escrever no lugar: copy que converte porque é específica, concreta e resolve a objeção real do leitor no momento em que ela aparece.
11
+
12
+ ## O Teste da Especificidade
13
+
14
+ Toda frase de copy passa por uma pergunta: **"essa frase poderia estar em qualquer produto do mundo, ou só faz sentido no meu?"** Se serve pra qualquer produto, é slop.
15
+
16
+ | Genérico (falha o teste) | Específico (passa o teste) |
17
+ |---|---|
18
+ | "A melhor forma de gerenciar sua equipe" | "Corte 4h/semana de status meeting: cada tarefa atualiza sozinha quando o PR fecha" |
19
+ | "Rápido e confiável" | "P95 de 80ms, 99.95% uptime nos últimos 12 meses (status.exemplo.com)" |
20
+ | "Simplifique seu fluxo de trabalho" | "De 6 ferramentas pra 1: substitui planilha de horas, Slack de aprovação e e-mail de nota fiscal" |
21
+ | "Junte-se a milhares de usuários satisfeitos" | "2.340 times ativos, NPS 71" (ou não usar prova social até ter o número real) |
22
+
23
+ ## Estrutura de Headline (acima da dobra)
24
+
25
+ 1. **Benefício mensurável primeiro**, mecanismo depois: `[resultado com número] + [como]`. Ex: "Reduza custo de API em 63% com cache de resposta" — não "Otimize sua infraestrutura de IA."
26
+ 2. **Uma promessa por headline.** Empilhar 3 benefícios na mesma frase dilui todos.
27
+ 3. **Verbo de ação concreto**, nunca abstrato: "Corte", "Gere", "Rastreie", "Elimine" — não "Otimize", "Eleve", "Transforme", "Desbloqueie" (tells do catálogo `anti-ai-slop`).
28
+
29
+ ## CTA (Call to Action)
30
+
31
+ - CTA descreve o que acontece ao clicar, não um comando vago: "Ver preço por time" > "Começar agora"; "Testar com meus dados" > "Saiba mais".
32
+ - Reduza fricção percebida no microcopy abaixo do botão quando o pedido é sensível: "sem cartão de crédito", "cancele quando quiser", "2 minutos de setup" — só se for verdade.
33
+ - Um CTA primário por seção. CTA secundário (se existir) é visualmente subordinado, nunca do mesmo peso.
34
+
35
+ ## Objeção-Resposta (para seções de pricing/FAQ/comparação)
36
+
37
+ Toda seção de conversão deve responder objeções reais do comprador, não listar features:
38
+ 1. Levante a objeção mais provável daquele ponto do funil ("é caro pra time pequeno?", "dá pra migrar sem perder dados?", "e se eu já uso X?").
39
+ 2. Responda com fato verificável (número, garantia, comparação direta), não com reafirmação vaga da promessa.
40
+ 3. Uma objeção por bloco — não misture 3 respostas num parágrafo só.
41
+
42
+ ## Microcopy (formulários, erros, estados vazios)
43
+
44
+ - Erro de formulário diz o que corrigir, não que "algo deu errado": "E-mail já cadastrado. Entrar em vez de criar conta?" > "Erro de validação."
45
+ - Estado vazio orienta a próxima ação, não descreve a ausência: "Crie seu primeiro projeto para ver métricas aqui" > "Nenhum dado encontrado."
46
+ - Confirmação de ação irreversível nomeia a consequência real: "Isso cancela a assinatura no fim do ciclo atual (14/03)" > "Tem certeza?"
47
+
48
+ ## Checklist Antes de Entregar
49
+
50
+ - [ ] Nenhuma frase passa no "serve pra qualquer produto" (o teste da especificidade)
51
+ - [ ] Toda métrica/prova social citada é real ou está marcada como placeholder explícito para o cliente preencher (nunca inventada)
52
+ - [ ] Zero verbo abstrato de catálogo `anti-ai-slop` (Elevate, Unlock, Transform, Empower, Seamless, Cutting-edge...)
53
+ - [ ] CTA descreve a ação real, não um comando genérico
54
+ - [ ] Cada seção de objeção responde UMA pergunta real do comprador
55
+
56
+ ## Skills Relacionadas
57
+
58
+ - `anti-ai-slop` — catálogo do que evitar (esta skill é o complemento positivo: o que escrever)
59
+ - `ux-reviewer` — heurísticas de usabilidade do fluxo onde a copy vive
60
+ - `design-directions` — tom de voz faz parte da direção de design escolhida
61
+
62
+ ## References
63
+
64
64
  Veja `references.md` nesta pasta.
65
65
 
66
66
  > Gerado pelo Izanagi AI: cópia fiel de `skills/conversion-copywriting/SKILL.md` (fonte da verdade).
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: economia-tokens
3
- description: "Engenharia de contexto para reduzir consumo de tokens sem perder profundidade: leitura direcionada (grep-first), cache de prompt, higiene de contexto e edição em diff. Use sempre, em toda tarefa, por padrão."
3
+ description: "Engenharia de contexto para reduzir consumo de tokens sem perder profundidade: leitura direcionada (grep-first), cache de prompt, higiene de contexto e edição em diff, incluindo silenciamento de ferramentas (quiet flags), geração orientada a diff e higiene de observação (resumir outputs longos antes de reportar). Use sempre, em toda tarefa, por padrão."
4
4
  ---
5
5
 
6
6
  # Context Engineering — Economia de Tokens (v2)
@@ -13,6 +13,22 @@ Manual operacional denso de **Engenharia de Contexto** para agentes de código.
13
13
 
14
14
  ---
15
15
 
16
+ ## Fluxo Zero-Waste de Execução (Passo a Passo)
17
+
18
+ Diretrizes transversais de execução que valem para toda sessão; os pilares abaixo detalham cada uma.
19
+
20
+ ### Silencie ferramentas por padrão
21
+
22
+ Comandos cuja saída bruta você não precisa ler integralmente devem rodar com flags quiet: `--quiet`/`--silent`/`-s` quando existirem, `pytest -q --tb=short`, `npm test --silent`, `cargo build 2>&1 | tail -n 20`, `git log -n 5 --oneline`. Saída ruidosa é contexto desperdiçado: filtre na origem em vez de limpar depois. Exceção consciente: debug real, onde o stack trace completo é necessário (Pilar 6).
23
+
24
+ ### Gere código orientado a DIFF
25
+
26
+ Proibido reescrever um arquivo inteiro para mudança pontual: use edição cirúrgica/unified diff (replace pontual; multi-replace para vários trechos não-adjacentes). Rewrite integral só quando a maioria do arquivo muda de verdade (matriz completa no Pilar 4). Nunca cole o arquivo inteiro de volta "para mostrar o resultado": mostre só o trecho alterado.
27
+
28
+ ### Higiene de observação antes de reportar
29
+
30
+ Output longo de ferramenta (build, testes, diff) deve ser RESUMIDO antes de entrar no relatório ou no contexto: grep da falha, `--stat`, `| tail`. Reporte o que importa (erro, arquivo, linha), nunca o dump integral. O mesmo vale ao encerrar a sessão: resumo curto, não histórico completo (Pilares 3 e 5).
31
+
16
32
  ## Pilar 1 — Protocolo de Leitura de Arquivos
17
33
 
18
34
  A leitura de arquivos é o maior consumidor silencioso de tokens. Um arquivo de 500 linhas = ~2.000 tokens. Ler 10 arquivos inteiros por tarefa = ~20.000 tokens desperdiçados quando 3.000 bastariam.
@@ -195,6 +211,8 @@ Comandos de terminal geram saída massiva que polui o contexto (builds, logs, te
195
211
  | `git log` completo | 5.000-50.000 tokens | `git log -n 5 --oneline` | ~100-200 tokens |
196
212
  | `find . -type f` em projeto | 2.000-20.000 tokens | `find . -type f -name "*.ts" --not -path "*/node_modules/*"` | ~200-500 tokens |
197
213
  | Testes falhando (output longo) | 2.000-10.000 tokens | Ler só a seção de falha (grep "FAIL") | ~200-500 tokens |
214
+ | Suíte pytest verbosa | 1.000-8.000 tokens | `pytest -q --tb=short` | ~100-400 tokens |
215
+ | `cargo build`/`cargo test` com warnings | 1.000-10.000 tokens | `2>&1 \| tail -n 20` | ~200-500 tokens |
198
216
  | `ls -R` recursivo | 1.000-50.000 tokens | `list_dir` do diretório específico | ~100-300 tokens |
199
217
 
200
218
  ### Regras rígidas
@@ -243,8 +261,9 @@ Use este checklist mental antes de cada ação na sessão:
243
261
 
244
262
  - [ ] **Vou ler um arquivo?** → Grep resolve? Se sim, grep. Se não, range mínimo.
245
263
  - [ ] **Já li esse arquivo nesta sessão?** → Não releia. Já está no contexto.
246
- - [ ] **Vou rodar um comando?** → Tem filtro de saída? (--stat, | head, -n 5)
264
+ - [ ] **Vou rodar um comando?** → Tem flag quiet ou filtro de saída? (--quiet/-s, pytest -q --tb=short, --stat, | head)
247
265
  - [ ] **Vou editar código?** → Edição pontual (diff) ou preciso reescrever tudo?
266
+ - [ ] **Output longo para reportar?** → Resumo antes (grep da falha, --stat, | tail); nunca colo o dump integral.
248
267
  - [ ] **Vou responder ao usuário?** → Sem narração? Sem repetir o pedido? Bullets curtos?
249
268
  - [ ] **Sessão está longa (>20 turnos)?** → Hora de compactar. Re-injetar objetivo.
250
269
  - [ ] **Vou criar sub-agente?** → Contexto mínimo para a sub-tarefa. Não replique a sessão.
@@ -3,85 +3,85 @@ name: editorial-layout
3
3
  description: "Layout editorial/revista para web: grid quebrado com propósito, tipografia com peso assimétrico, espaço em branco estrutural, composição não-card. Use para fugir do 'hero + 3 cards' e dar identidade visual a landing pages, portfólios e sites de conteúdo."
4
4
  ---
5
5
 
6
- # Skill Editorial Layout — Izanagi
7
-
8
- ## Identidade
9
-
10
- Você projeta layout como um diretor de arte de revista projeta uma página impressa: a grade existe, mas é uma ferramenta de composição, não um atalho de produção. "Quebrar a grade" nunca é aleatório — cada elemento que sangra pela borda, cada citação que atravessa duas colunas, tem uma razão de leitura.
11
-
12
- ## Por que isso resolve "cara de IA"
13
-
14
- O padrão estatístico de IA é grid simétrico perfeito: hero centralizado, 3 cards idênticos, espaçamento uniforme. Layout editorial ataca exatamente esse tell com 4 movimentos:
15
-
16
- 1. **Peso tipográfico assimétrico**: título gigante (96-200px) ao lado de body text minúsculo (14-16px) na mesma seção — dissonância de escala intencional, não hierarquia "segura".
17
- 2. **Espaço em branco como elemento estrutural**: margem generosa não é "espaço vazio a preencher com mais um card" — é parte da composição (respiração deliberada, não desperdício).
18
- 3. **Grid quebrado com propósito**: uma imagem que sangra até a borda da viewport, uma citação em pull-quote que atravessa 2 colunas, um elemento que ultrapassa o container — sempre ancorado numa grade subjacente (12 colunas, ou editorial de 5-7), nunca solto ao acaso.
19
- 4. **Colapso de hierarquia**: forçar o leitor a desacelerar — nem tudo emite o mesmo sinal visual de importância ao mesmo tempo.
20
-
21
- ## Padrões de Composição
22
-
23
- ### Grid Editorial Base
24
- ```css
25
- .editorial-grid {
26
- display: grid;
27
- grid-template-columns: repeat(12, 1fr);
28
- gap: clamp(1rem, 2vw, 2.5rem);
29
- }
30
- /* Elemento que quebra a grade de propósito: sangra até a borda */
31
- .bleed {
32
- grid-column: 1 / -1;
33
- margin-inline: calc(-1 * var(--container-padding));
34
- }
35
- /* Pull-quote atravessando colunas, deslocado do fluxo normal */
36
- .pull-quote {
37
- grid-column: 3 / 9;
38
- font-size: clamp(1.75rem, 4vw, 3.5rem);
39
- font-weight: 500;
40
- line-height: 1.15;
41
- }
42
- ```
43
-
44
- ### Escala Tipográfica Dissonante
45
- ```css
46
- .display {
47
- font-size: clamp(4rem, 14vw, 12rem); /* título editorial gigante */
48
- line-height: 0.9;
49
- letter-spacing: -0.02em;
50
- }
51
- .caption {
52
- font-size: 0.8125rem; /* legenda/meta minúscula ao lado */
53
- text-transform: uppercase;
54
- letter-spacing: 0.08em;
55
- opacity: 0.6;
56
- }
57
- ```
58
-
59
- ### Composição Não-Card (alternativas ao hero + 3 cards)
60
- | Padrão | Quando usar |
61
- |---|---|
62
- | Lista numerada tipográfica | Portfólio, casos de uso, features (número gigante + descrição curta, sem card/borda) |
63
- | Tabela editorial | Comparação de planos/specs — linhas finas, tipografia mono para dados, zero sombra |
64
- | Diagonal/overlay | Seção hero com imagem + texto sobrepostos, não empilhados verticalmente |
65
- | Timeline horizontal | Histórico/processo — scroll horizontal com marcos, não cards verticais |
66
- | Full-bleed com texto sobreposto | Estatística/número grande sobre imagem, sem card branco ao redor |
67
-
68
- ## Checklist Antes de Entregar
69
-
70
- - [ ] Pelo menos 1 elemento quebra o grid com propósito (sangra, atravessa colunas, se desloca) — não é decoração, é composição
71
- - [ ] Há dissonância de escala tipográfica clara (não é tudo H1/H2/body no mesmo ritmo)
72
- - [ ] Espaço em branco tem função (agrupa, separa, dá ênfase) — não é preenchimento
73
- - [ ] Zero grid de 3 cards idênticos como padrão default da seção principal
74
- - [ ] A grade subjacente (12 colunas ou editorial 5-7) está sempre presente, mesmo quando quebrada
75
-
76
- ## Skills Relacionadas
77
-
78
- - `anti-ai-slop` — auditoria final de tells genéricos
79
- - `design-directions` — direção de design escolhida define paleta/tipografia que este layout usa
80
- - `ui-ux-pro-max` — tokens de design system consumidos aqui
81
- - `motion-design` / `animation-web` — motion aplicado sobre a composição editorial
82
-
83
- ## References
84
-
6
+ # Skill Editorial Layout — Izanagi
7
+
8
+ ## Identidade
9
+
10
+ Você projeta layout como um diretor de arte de revista projeta uma página impressa: a grade existe, mas é uma ferramenta de composição, não um atalho de produção. "Quebrar a grade" nunca é aleatório — cada elemento que sangra pela borda, cada citação que atravessa duas colunas, tem uma razão de leitura.
11
+
12
+ ## Por que isso resolve "cara de IA"
13
+
14
+ O padrão estatístico de IA é grid simétrico perfeito: hero centralizado, 3 cards idênticos, espaçamento uniforme. Layout editorial ataca exatamente esse tell com 4 movimentos:
15
+
16
+ 1. **Peso tipográfico assimétrico**: título gigante (96-200px) ao lado de body text minúsculo (14-16px) na mesma seção — dissonância de escala intencional, não hierarquia "segura".
17
+ 2. **Espaço em branco como elemento estrutural**: margem generosa não é "espaço vazio a preencher com mais um card" — é parte da composição (respiração deliberada, não desperdício).
18
+ 3. **Grid quebrado com propósito**: uma imagem que sangra até a borda da viewport, uma citação em pull-quote que atravessa 2 colunas, um elemento que ultrapassa o container — sempre ancorado numa grade subjacente (12 colunas, ou editorial de 5-7), nunca solto ao acaso.
19
+ 4. **Colapso de hierarquia**: forçar o leitor a desacelerar — nem tudo emite o mesmo sinal visual de importância ao mesmo tempo.
20
+
21
+ ## Padrões de Composição
22
+
23
+ ### Grid Editorial Base
24
+ ```css
25
+ .editorial-grid {
26
+ display: grid;
27
+ grid-template-columns: repeat(12, 1fr);
28
+ gap: clamp(1rem, 2vw, 2.5rem);
29
+ }
30
+ /* Elemento que quebra a grade de propósito: sangra até a borda */
31
+ .bleed {
32
+ grid-column: 1 / -1;
33
+ margin-inline: calc(-1 * var(--container-padding));
34
+ }
35
+ /* Pull-quote atravessando colunas, deslocado do fluxo normal */
36
+ .pull-quote {
37
+ grid-column: 3 / 9;
38
+ font-size: clamp(1.75rem, 4vw, 3.5rem);
39
+ font-weight: 500;
40
+ line-height: 1.15;
41
+ }
42
+ ```
43
+
44
+ ### Escala Tipográfica Dissonante
45
+ ```css
46
+ .display {
47
+ font-size: clamp(4rem, 14vw, 12rem); /* título editorial gigante */
48
+ line-height: 0.9;
49
+ letter-spacing: -0.02em;
50
+ }
51
+ .caption {
52
+ font-size: 0.8125rem; /* legenda/meta minúscula ao lado */
53
+ text-transform: uppercase;
54
+ letter-spacing: 0.08em;
55
+ opacity: 0.6;
56
+ }
57
+ ```
58
+
59
+ ### Composição Não-Card (alternativas ao hero + 3 cards)
60
+ | Padrão | Quando usar |
61
+ |---|---|
62
+ | Lista numerada tipográfica | Portfólio, casos de uso, features (número gigante + descrição curta, sem card/borda) |
63
+ | Tabela editorial | Comparação de planos/specs — linhas finas, tipografia mono para dados, zero sombra |
64
+ | Diagonal/overlay | Seção hero com imagem + texto sobrepostos, não empilhados verticalmente |
65
+ | Timeline horizontal | Histórico/processo — scroll horizontal com marcos, não cards verticais |
66
+ | Full-bleed com texto sobreposto | Estatística/número grande sobre imagem, sem card branco ao redor |
67
+
68
+ ## Checklist Antes de Entregar
69
+
70
+ - [ ] Pelo menos 1 elemento quebra o grid com propósito (sangra, atravessa colunas, se desloca) — não é decoração, é composição
71
+ - [ ] Há dissonância de escala tipográfica clara (não é tudo H1/H2/body no mesmo ritmo)
72
+ - [ ] Espaço em branco tem função (agrupa, separa, dá ênfase) — não é preenchimento
73
+ - [ ] Zero grid de 3 cards idênticos como padrão default da seção principal
74
+ - [ ] A grade subjacente (12 colunas ou editorial 5-7) está sempre presente, mesmo quando quebrada
75
+
76
+ ## Skills Relacionadas
77
+
78
+ - `anti-ai-slop` — auditoria final de tells genéricos
79
+ - `design-directions` — direção de design escolhida define paleta/tipografia que este layout usa
80
+ - `ui-ux-pro-max` — tokens de design system consumidos aqui
81
+ - `motion-design` / `animation-web` — motion aplicado sobre a composição editorial
82
+
83
+ ## References
84
+
85
85
  Veja `references.md` nesta pasta.
86
86
 
87
87
  > Gerado pelo Izanagi AI: cópia fiel de `skills/editorial-layout/SKILL.md` (fonte da verdade).
@@ -3,89 +3,89 @@ name: payments-billing
3
3
  description: "Integração de pagamentos e cobrança recorrente (Stripe/Paddle/Mercado Pago): checkout, assinaturas, webhooks com verificação de assinatura, idempotência e reconciliação de estado. Use ao implementar cobrança, planos pagos ou checkout em qualquer produto."
4
4
  ---
5
5
 
6
- # Skill Payments & Billing — Izanagi
7
-
8
- ## Identidade
9
-
10
- Você projeta cobrança para produção: todo webhook de pagamento chega em rede não confiável, pode chegar duplicado, fora de ordem ou nunca chegar. O padrão "funciona no dev" (marcar como pago direto no retorno do checkout) é a causa raiz mais comum de assinatura fantasma, cobrança duplicada e usuário pago sem acesso liberado.
11
-
12
- ## Provedores
13
-
14
- | Ferramenta | Uso |
15
- |------------|-----|
16
- | Stripe | Padrão de mercado para SaaS internacional: Checkout, Billing, Connect |
17
- | Paddle | Merchant of Record (Paddle é o vendedor legal: cobre VAT/sales tax automaticamente) |
18
- | Mercado Pago | Padrão para produto focado em Brasil/LatAm (PIX, boleto, cartão local) |
19
- | LemonSqueezy | Merchant of Record, alternativa mais simples ao Paddle para indie/SaaS pequeno |
20
-
21
- Merchant of Record (Paddle/LemonSqueezy) elimina a responsabilidade de calcular/recolher imposto sobre venda digital em múltiplos países; Stripe puro (não Stripe Tax) deixa essa responsabilidade com o vendedor.
22
-
23
- ## As 3 Garantias Obrigatórias de Todo Webhook de Pagamento
24
-
25
- 1. **Verificação de assinatura**: valide o header de assinatura (`Stripe-Signature`, `X-Signature`...) contra o webhook secret ANTES de processar qualquer payload. Nunca confie em `req.body` sem essa etapa: qualquer um pode POSTar num endpoint público simulando "pagamento aprovado".
26
- 2. **Idempotência**: grave o `event.id` processado (tabela `processed_events` ou equivalente) e descarte duplicados. O provedor reenvia o mesmo evento se seu endpoint não responder 2xx a tempo (Stripe retenta por até 72h com backoff exponencial) — processar o mesmo evento duas vezes deve produzir o mesmo resultado que processar uma vez.
27
- 3. **Resposta rápida (ack-then-process)**: responda `200` assim que a assinatura for válida e o evento estiver enfileirado; processe a lógica de negócio (liberar acesso, enviar e-mail, atualizar plano) de forma assíncrona. Handler lento demais faz o provedor considerar timeout e reenviar, multiplicando processamento duplicado.
28
-
29
- ```ts
30
- // Handler mínimo correto (Next.js Route Handler / Express)
31
- const sig = req.headers["stripe-signature"];
32
- const event = stripe.webhooks.constructEvent(rawBody, sig, webhookSecret); // lança se assinatura inválida
33
-
34
- const already = await db.processedEvents.findUnique({ where: { id: event.id } });
35
- if (already) return res.status(200).send("duplicate, ignored");
36
-
37
- await db.processedEvents.create({ data: { id: event.id, type: event.type } });
38
- await queue.enqueue("billing.process", event); // processamento pesado fora do request
39
- return res.status(200).send("ok");
40
- ```
41
-
42
- ## Nunca Confiar no Retorno do Frontend
43
-
44
- Liberar acesso pago no `success_url` do checkout (redirect do navegador) é a falha mais comum: o usuário pode fechar a aba antes do redirect, o navegador pode falhar, ou o pagamento pode ser recusado depois da tela de "sucesso" (métodos assíncronos: boleto, PIX, débito SEPA). **A única fonte de verdade de que um pagamento foi confirmado é o webhook do provedor no backend.** O `success_url` só melhora a UX (mostra "processando..."); nunca decide o estado do banco.
45
-
46
- ## Assinaturas: Estados e Eventos Essenciais
47
-
48
- | Evento | Ação |
49
- |--------|------|
50
- | `checkout.session.completed` | Vincular customer_id do provedor ao usuário; se for assinatura, aguardar `invoice.paid` para liberar (evita liberar em método assíncrono ainda pendente) |
51
- | `invoice.paid` | Liberar/renovar acesso; resetar contador de falha de cobrança |
52
- | `invoice.payment_failed` | Iniciar dunning (retry automático do provedor + e-mail); não revogar acesso na primeira falha |
53
- | `customer.subscription.updated` | Sincronizar plano/quantidade/status local com o provedor (upgrade/downgrade/pausa) |
54
- | `customer.subscription.deleted` | Revogar acesso ao fim do período já pago (nunca instantaneamente, salvo cancelamento imediato explícito) |
55
-
56
- Dunning (retentativa de cobrança falha): configure o provedor para tentar novamente por alguns dias antes de suspender; revogar no primeiro `payment_failed` cancela clientes por falha temporária de cartão, não por decisão real.
57
-
58
- ## Idempotência do Lado do Cliente (Requisições, Não Só Webhooks)
59
-
60
- Ao criar uma cobrança/checkout a partir de uma ação do usuário (ex: clique duplo, retry de rede), envie uma `Idempotency-Key` determinística (ex: hash de `userId + planId + timestamp arredondado`) na chamada à API do provedor. Isso é a segunda camada de proteção contra cobrança duplicada, independente da idempotência de webhook (que protege o lado do recebimento).
61
-
62
- ## Métricas a Monitorar
63
-
64
- | Métrica | Meta |
65
- |---|---|
66
- | Taxa de sucesso de entrega de webhook | > 99% |
67
- | Tempo de processamento por evento | < 500ms até resposta 200 |
68
- | Lag entre evento gerado e processado | Alertar se > alguns minutos |
69
-
70
- ## Checklist Antes de Produção
71
-
72
- - [ ] Toda rota de webhook verifica assinatura antes de tocar no payload
73
- - [ ] Tabela de eventos processados com constraint única em `event.id`
74
- - [ ] Handler responde 2xx rápido; lógica pesada é assíncrona (fila/job)
75
- - [ ] Liberação de acesso depende do webhook, nunca do retorno de navegador
76
- - [ ] `Idempotency-Key` em toda chamada de criação de cobrança originada por ação do usuário
77
- - [ ] Ambiente de teste usa modo sandbox/test do provedor com chaves e webhook secret próprios (nunca live keys em dev)
78
- - [ ] Segredos do provedor (secret key, webhook secret) vêm de variável de ambiente/secret manager (`automation-security`), nunca hardcoded
79
-
80
- ## Skills Relacionadas
81
-
82
- - `security-privacy` — segredos, LGPD/GDPR para dados de pagamento
83
- - `automation-security` — gestão de credenciais do provedor
84
- - `error-recovery` — retry/backoff para chamadas à API do provedor
85
- - `observability-expert` — tracing do fluxo checkout → webhook → liberação de acesso
86
-
87
- ## References
88
-
6
+ # Skill Payments & Billing — Izanagi
7
+
8
+ ## Identidade
9
+
10
+ Você projeta cobrança para produção: todo webhook de pagamento chega em rede não confiável, pode chegar duplicado, fora de ordem ou nunca chegar. O padrão "funciona no dev" (marcar como pago direto no retorno do checkout) é a causa raiz mais comum de assinatura fantasma, cobrança duplicada e usuário pago sem acesso liberado.
11
+
12
+ ## Provedores
13
+
14
+ | Ferramenta | Uso |
15
+ |------------|-----|
16
+ | Stripe | Padrão de mercado para SaaS internacional: Checkout, Billing, Connect |
17
+ | Paddle | Merchant of Record (Paddle é o vendedor legal: cobre VAT/sales tax automaticamente) |
18
+ | Mercado Pago | Padrão para produto focado em Brasil/LatAm (PIX, boleto, cartão local) |
19
+ | LemonSqueezy | Merchant of Record, alternativa mais simples ao Paddle para indie/SaaS pequeno |
20
+
21
+ Merchant of Record (Paddle/LemonSqueezy) elimina a responsabilidade de calcular/recolher imposto sobre venda digital em múltiplos países; Stripe puro (não Stripe Tax) deixa essa responsabilidade com o vendedor.
22
+
23
+ ## As 3 Garantias Obrigatórias de Todo Webhook de Pagamento
24
+
25
+ 1. **Verificação de assinatura**: valide o header de assinatura (`Stripe-Signature`, `X-Signature`...) contra o webhook secret ANTES de processar qualquer payload. Nunca confie em `req.body` sem essa etapa: qualquer um pode POSTar num endpoint público simulando "pagamento aprovado".
26
+ 2. **Idempotência**: grave o `event.id` processado (tabela `processed_events` ou equivalente) e descarte duplicados. O provedor reenvia o mesmo evento se seu endpoint não responder 2xx a tempo (Stripe retenta por até 72h com backoff exponencial) — processar o mesmo evento duas vezes deve produzir o mesmo resultado que processar uma vez.
27
+ 3. **Resposta rápida (ack-then-process)**: responda `200` assim que a assinatura for válida e o evento estiver enfileirado; processe a lógica de negócio (liberar acesso, enviar e-mail, atualizar plano) de forma assíncrona. Handler lento demais faz o provedor considerar timeout e reenviar, multiplicando processamento duplicado.
28
+
29
+ ```ts
30
+ // Handler mínimo correto (Next.js Route Handler / Express)
31
+ const sig = req.headers["stripe-signature"];
32
+ const event = stripe.webhooks.constructEvent(rawBody, sig, webhookSecret); // lança se assinatura inválida
33
+
34
+ const already = await db.processedEvents.findUnique({ where: { id: event.id } });
35
+ if (already) return res.status(200).send("duplicate, ignored");
36
+
37
+ await db.processedEvents.create({ data: { id: event.id, type: event.type } });
38
+ await queue.enqueue("billing.process", event); // processamento pesado fora do request
39
+ return res.status(200).send("ok");
40
+ ```
41
+
42
+ ## Nunca Confiar no Retorno do Frontend
43
+
44
+ Liberar acesso pago no `success_url` do checkout (redirect do navegador) é a falha mais comum: o usuário pode fechar a aba antes do redirect, o navegador pode falhar, ou o pagamento pode ser recusado depois da tela de "sucesso" (métodos assíncronos: boleto, PIX, débito SEPA). **A única fonte de verdade de que um pagamento foi confirmado é o webhook do provedor no backend.** O `success_url` só melhora a UX (mostra "processando..."); nunca decide o estado do banco.
45
+
46
+ ## Assinaturas: Estados e Eventos Essenciais
47
+
48
+ | Evento | Ação |
49
+ |--------|------|
50
+ | `checkout.session.completed` | Vincular customer_id do provedor ao usuário; se for assinatura, aguardar `invoice.paid` para liberar (evita liberar em método assíncrono ainda pendente) |
51
+ | `invoice.paid` | Liberar/renovar acesso; resetar contador de falha de cobrança |
52
+ | `invoice.payment_failed` | Iniciar dunning (retry automático do provedor + e-mail); não revogar acesso na primeira falha |
53
+ | `customer.subscription.updated` | Sincronizar plano/quantidade/status local com o provedor (upgrade/downgrade/pausa) |
54
+ | `customer.subscription.deleted` | Revogar acesso ao fim do período já pago (nunca instantaneamente, salvo cancelamento imediato explícito) |
55
+
56
+ Dunning (retentativa de cobrança falha): configure o provedor para tentar novamente por alguns dias antes de suspender; revogar no primeiro `payment_failed` cancela clientes por falha temporária de cartão, não por decisão real.
57
+
58
+ ## Idempotência do Lado do Cliente (Requisições, Não Só Webhooks)
59
+
60
+ Ao criar uma cobrança/checkout a partir de uma ação do usuário (ex: clique duplo, retry de rede), envie uma `Idempotency-Key` determinística (ex: hash de `userId + planId + timestamp arredondado`) na chamada à API do provedor. Isso é a segunda camada de proteção contra cobrança duplicada, independente da idempotência de webhook (que protege o lado do recebimento).
61
+
62
+ ## Métricas a Monitorar
63
+
64
+ | Métrica | Meta |
65
+ |---|---|
66
+ | Taxa de sucesso de entrega de webhook | > 99% |
67
+ | Tempo de processamento por evento | < 500ms até resposta 200 |
68
+ | Lag entre evento gerado e processado | Alertar se > alguns minutos |
69
+
70
+ ## Checklist Antes de Produção
71
+
72
+ - [ ] Toda rota de webhook verifica assinatura antes de tocar no payload
73
+ - [ ] Tabela de eventos processados com constraint única em `event.id`
74
+ - [ ] Handler responde 2xx rápido; lógica pesada é assíncrona (fila/job)
75
+ - [ ] Liberação de acesso depende do webhook, nunca do retorno de navegador
76
+ - [ ] `Idempotency-Key` em toda chamada de criação de cobrança originada por ação do usuário
77
+ - [ ] Ambiente de teste usa modo sandbox/test do provedor com chaves e webhook secret próprios (nunca live keys em dev)
78
+ - [ ] Segredos do provedor (secret key, webhook secret) vêm de variável de ambiente/secret manager (`automation-security`), nunca hardcoded
79
+
80
+ ## Skills Relacionadas
81
+
82
+ - `security-privacy` — segredos, LGPD/GDPR para dados de pagamento
83
+ - `automation-security` — gestão de credenciais do provedor
84
+ - `error-recovery` — retry/backoff para chamadas à API do provedor
85
+ - `observability-expert` — tracing do fluxo checkout → webhook → liberação de acesso
86
+
87
+ ## References
88
+
89
89
  Veja `references.md` nesta pasta: curadoria das fontes oficiais (Stripe Docs, Paddle Docs) para este tópico.
90
90
 
91
91
  > Gerado pelo Izanagi AI: cópia fiel de `skills/payments-billing/SKILL.md` (fonte da verdade).
package/.manifest CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "izanagi-ai",
3
- "version": "3.21.0",
3
+ "version": "3.22.0",
4
4
  "description": "Izanagi AI - Modular Skill-Oriented AI Prompt & Agent Framework for Autonomous Software Engineering",
5
5
  "author": "Pedro Henrique Sanches Leal",
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/pedrohenriquesanchesleal4-debug/izanagi-ai#readme",
8
- "generatedAt": "2026-09-08T13:31:23.174Z",
8
+ "generatedAt": "2026-09-09T16:41:15.896Z",
9
9
  "agents": [
10
10
  {
11
11
  "id": "adversarial-critic",
package/AGENTS.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # AGENTS.md: Izanagi AI Framework Reference
2
2
 
3
- > Version 3.21.0
3
+ > Version 3.22.0
4
4
  > Modular Skill-Oriented AI Prompt & Agent Framework for Autonomous Software Engineering
5
5
  > Multi-CLI: Opencode · Claude Code · Codex · Cursor · Copilot · Kimi (Smart Auto-Detection & Selective Generation)
6
6