@jaimevalasek/aioson 1.17.2 → 1.18.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 (65) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +85 -51
  3. package/docs/en/3-recipes/full-feature-with-sheldon.md +1 -1
  4. package/docs/en/5-reference/cli-reference.md +4 -4
  5. package/docs/en/5-reference/qa-browser.md +2 -2
  6. package/docs/en/README.md +1 -1
  7. package/docs/en/deyvin-subtask-scout/how-to-use.md +2 -2
  8. package/docs/en/deyvin-subtask-scout/sub-task-scout.md +3 -3
  9. package/docs/en/deyvin-subtask-scout/troubleshooting.md +1 -1
  10. package/docs/pt/3-receitas/publicar-no-aioson-com.md +17 -0
  11. package/docs/pt/5-referencia/comandos-cli.md +2 -2
  12. package/docs/pt/5-referencia/inteligencia-adaptativa.md +3 -3
  13. package/docs/pt/5-referencia/skills.md +1 -1
  14. package/docs/pt/5-referencia/web3.md +3 -3
  15. package/docs/pt/README.md +1 -1
  16. package/docs/pt/_arquivo/README.md +1 -1
  17. package/docs/pt/_arquivo/cenarios.md +31 -31
  18. package/docs/pt/_arquivo/design-hybrid-forge.md +5 -5
  19. package/docs/pt/_arquivo/guia-engineer.md +1 -1
  20. package/docs/pt/_arquivo/profiler-system.md +1 -1
  21. package/docs/pt/_arquivo/site-forge.md +16 -16
  22. package/docs/pt/_arquivo/squad-genome.md +2 -2
  23. package/docs/pt/agentes.md +37 -37
  24. package/docs/pt/deyvin-subtask-scout/como-usar.md +2 -2
  25. package/docs/pt/deyvin-subtask-scout/sub-task-scout.md +1 -1
  26. package/docs/pt/deyvin-subtask-scout/troubleshooting.md +1 -1
  27. package/docs/pt/living-memory/README.md +1 -1
  28. package/docs/pt/living-memory/memoria-viva.md +2 -2
  29. package/docs/pt/living-memory/reflexao-in-harness.md +1 -1
  30. package/docs/pt/living-memory/troubleshooting.md +6 -6
  31. package/package.json +4 -2
  32. package/src/commands/gate-approve.js +56 -1
  33. package/src/commands/live.js +81 -54
  34. package/src/commands/op-capture.js +27 -2
  35. package/src/commands/op-list.js +33 -1
  36. package/src/commands/store-system.js +104 -12
  37. package/src/commands/tool-capabilities.js +14 -10
  38. package/src/commands/workflow-heal.js +47 -1
  39. package/src/i18n/messages/en.js +6 -5
  40. package/src/i18n/messages/pt-BR.js +6 -5
  41. package/src/lib/dev-resume.js +6 -1
  42. package/src/lib/tool-capabilities.js +64 -37
  43. package/src/operator-memory/decision.js +11 -4
  44. package/src/operator-memory/proposal.js +11 -7
  45. package/src/session-handoff.js +52 -1
  46. package/template/.aioson/agents/analyst.md +34 -2
  47. package/template/.aioson/agents/architect.md +33 -1
  48. package/template/.aioson/agents/briefing.md +26 -1
  49. package/template/.aioson/agents/copywriter.md +1 -1
  50. package/template/.aioson/agents/dev.md +2 -2
  51. package/template/.aioson/agents/deyvin.md +12 -12
  52. package/template/.aioson/agents/neo.md +74 -74
  53. package/template/.aioson/agents/orchestrator.md +26 -0
  54. package/template/.aioson/agents/pentester.md +66 -14
  55. package/template/.aioson/agents/pm.md +18 -1
  56. package/template/.aioson/agents/product.md +12 -1
  57. package/template/.aioson/agents/qa.md +3 -3
  58. package/template/.aioson/agents/sheldon.md +24 -4
  59. package/template/.aioson/agents/tester.md +115 -2
  60. package/template/.aioson/docs/briefing/briefing-craft.md +16 -0
  61. package/template/.aioson/docs/deyvin/runtime-handoffs.md +1 -1
  62. package/template/.aioson/docs/handoff-persistence.md +7 -7
  63. package/template/.aioson/docs/pentester/browser-dast-playbook.md +398 -0
  64. package/template/.aioson/rules/agent-structural-contract.md +139 -0
  65. package/template/.aioson/skills/process/decision-presentation/SKILL.md +2 -2
@@ -78,7 +78,7 @@ Regras do fluxo:
78
78
 
79
79
  **Como ativar:**
80
80
  ```
81
- /setup
81
+ /aioson:agent:setup
82
82
  ```
83
83
 
84
84
  **O que ele pergunta:**
@@ -135,7 +135,7 @@ O `@product` detecta esses arquivos automaticamente e pergunta se deve usá-los
135
135
 
136
136
  **Como ativar:**
137
137
  ```
138
- /product
138
+ /aioson:agent:product
139
139
  ```
140
140
 
141
141
  **Entrega:** Arquivo `.aioson/context/prd.md` ou `.aioson/context/prd-{slug}.md` com:
@@ -179,12 +179,12 @@ O `@product` detecta esses arquivos automaticamente e pergunta se deve usá-los
179
179
 
180
180
  **Como ativar:**
181
181
  ```
182
- /deyvin
182
+ /aioson:agent:deyvin
183
183
  ```
184
184
 
185
185
  Alias compativel:
186
186
  ```text
187
- @pair
187
+ /aioson:agent:pair
188
188
  ```
189
189
 
190
190
  **Exemplos bons de uso:**
@@ -224,7 +224,7 @@ Alias compativel:
224
224
 
225
225
  **Como ativar:**
226
226
  ```
227
- /analyst
227
+ /aioson:agent:analyst
228
228
  ```
229
229
 
230
230
  **Exemplo de perguntas que ele faz:**
@@ -265,7 +265,7 @@ Em **modo feature**, entrega adicionalmente:
265
265
 
266
266
  **Como ativar:**
267
267
  ```
268
- @discovery-design-doc
268
+ /aioson:agent:discovery-design-doc
269
269
  ```
270
270
 
271
271
  **Entrega:**
@@ -297,7 +297,7 @@ Em **modo feature**, entrega adicionalmente:
297
297
 
298
298
  **Como ativar:**
299
299
  ```
300
- /architect
300
+ /aioson:agent:architect
301
301
  ```
302
302
 
303
303
  **Estruturas que ele propõe (exemplo Laravel SMALL):**
@@ -338,16 +338,16 @@ tests/
338
338
 
339
339
  **Como ativar o agente UI/UX:**
340
340
  ```
341
- /ux-ui
341
+ /aioson:agent:ux-ui
342
342
  ```
343
343
 
344
344
  **Submodos disponíveis:**
345
345
  ```
346
- /ux-ui research → pesquisa visual e hipóteses de direção
347
- /ux-ui audit → auditoria com inventário, achados por severidade e plano de consolidação
348
- /ux-ui tokens → contrato formal de design tokens (primitivos, semânticos, escalas)
349
- /ux-ui component-map → mapeamento de componentes (Atomic Design), gap analysis
350
- /ux-ui a11y → auditoria WCAG focada, integração com @qa
346
+ /aioson:agent:ux-ui research → pesquisa visual e hipóteses de direção
347
+ /aioson:agent:ux-ui audit → auditoria com inventário, achados por severidade e plano de consolidação
348
+ /aioson:agent:ux-ui tokens → contrato formal de design tokens (primitivos, semânticos, escalas)
349
+ /aioson:agent:ux-ui component-map → mapeamento de componentes (Atomic Design), gap analysis
350
+ /aioson:agent:ux-ui a11y → auditoria WCAG focada, integração com @qa
351
351
  ```
352
352
 
353
353
  **Entrega principal:** Arquivo `.aioson/context/ui-spec.md` com:
@@ -381,7 +381,7 @@ tests/
381
381
 
382
382
  **Como ativar:**
383
383
  ```
384
- /pm
384
+ /aioson:agent:pm
385
385
  ```
386
386
 
387
387
  **Regra de ouro do @pm:** O documento deve ter no máximo 2 páginas. Se passar disso, corte funcionalidades do MVP.
@@ -407,7 +407,7 @@ tests/
407
407
 
408
408
  **Como ativar:**
409
409
  ```
410
- /orchestrator
410
+ /aioson:agent:orchestrator
411
411
  ```
412
412
 
413
413
  **Ou via CLI para preparar os arquivos:**
@@ -452,7 +452,7 @@ npx @jaimevalasek/aioson parallel:status
452
452
 
453
453
  **Como ativar:**
454
454
  ```
455
- @squad
455
+ /aioson:agent:squad
456
456
  ```
457
457
 
458
458
  **Entrega:**
@@ -478,7 +478,7 @@ npx @jaimevalasek/aioson parallel:status
478
478
 
479
479
  **Como ativar:**
480
480
  ```
481
- @genome
481
+ /aioson:agent:genome
482
482
  ```
483
483
 
484
484
  **Entrega:**
@@ -514,7 +514,7 @@ Depois disso, ela passa a ser parte real do pacote local da squad e deve ser con
514
514
 
515
515
  **Como ativar:**
516
516
  ```
517
- /dev
517
+ /aioson:agent:dev
518
518
  ```
519
519
 
520
520
  **Princípios que ele aplica em qualquer stack:**
@@ -567,7 +567,7 @@ Se o usuário pedir para pular o teste, o `@dev` resiste, explica, e só cede ap
567
567
 
568
568
  **Como ativar:**
569
569
  ```
570
- /qa
570
+ /aioson:agent:qa
571
571
  ```
572
572
 
573
573
  **Entrega:**
@@ -631,7 +631,7 @@ O root de `.aioson/context/` fica limpo automaticamente. O desenvolvedor não pr
631
631
 
632
632
  **Como ativar:**
633
633
  ```
634
- /tester
634
+ /aioson:agent:tester
635
635
  ```
636
636
 
637
637
  **Entrega:**
@@ -660,13 +660,13 @@ O root de `.aioson/context/` fica limpo automaticamente. O desenvolvedor não pr
660
660
 
661
661
  | Modo | Como ativar | O que faz |
662
662
  |---|---|---|
663
- | A — Enriquecimento (padrão) | `/sheldon` | Analisa o PRD alvo e sugere melhorias prioritárias |
664
- | B — Revisão Global | `/sheldon` + "revisão geral" | Escaneia todos os PRDs e planos ativos |
665
- | C — Validação Completa | `/sheldon` + "validar" ou "preparar para dev" | Auditoria completa + checklist final antes de codar |
663
+ | A — Enriquecimento (padrão) | `/aioson:agent:sheldon` | Analisa o PRD alvo e sugere melhorias prioritárias |
664
+ | B — Revisão Global | `/aioson:agent:sheldon` + "revisão geral" | Escaneia todos os PRDs e planos ativos |
665
+ | C — Validação Completa | `/aioson:agent:sheldon` + "validar" ou "preparar para dev" | Auditoria completa + checklist final antes de codar |
666
666
 
667
667
  **Como ativar:**
668
668
  ```
669
- /sheldon
669
+ /aioson:agent:sheldon
670
670
  ```
671
671
 
672
672
  **Entrega:**
@@ -695,7 +695,7 @@ Agentes que nao fazem parte do fluxo principal de entrega, mas entram sob demand
695
695
 
696
696
  **Como ativar:**
697
697
  ```
698
- @committer
698
+ /aioson:agent:committer
699
699
  ```
700
700
 
701
701
  **Entrega:**
@@ -716,7 +716,7 @@ Agentes que nao fazem parte do fluxo principal de entrega, mas entram sob demand
716
716
 
717
717
  **Como ativar:**
718
718
  ```
719
- @copywriter
719
+ /aioson:agent:copywriter
720
720
  ```
721
721
 
722
722
  **Entrega:**
@@ -738,7 +738,7 @@ Agentes que nao fazem parte do fluxo principal de entrega, mas entram sob demand
738
738
 
739
739
  **Como ativar:**
740
740
  ```
741
- @briefing
741
+ /aioson:agent:briefing
742
742
  ```
743
743
 
744
744
  **Entrega:**
@@ -759,7 +759,7 @@ Agentes que nao fazem parte do fluxo principal de entrega, mas entram sob demand
759
759
 
760
760
  **Como ativar:**
761
761
  ```
762
- @design-hybrid-forge
762
+ /aioson:agent:design-hybrid-forge
763
763
  ```
764
764
 
765
765
  **Entrega:**
@@ -779,7 +779,7 @@ Agentes que nao fazem parte do fluxo principal de entrega, mas entram sob demand
779
779
 
780
780
  **Como ativar:**
781
781
  ```
782
- @discover
782
+ /aioson:agent:discover
783
783
  ```
784
784
 
785
785
  **Ou via CLI:**
@@ -806,7 +806,7 @@ npx @jaimevalasek/aioson scan:project . --folder=src
806
806
 
807
807
  **Como ativar:**
808
808
  ```
809
- @neo
809
+ /aioson:agent:neo
810
810
  ```
811
811
 
812
812
  **Entrega:**
@@ -827,7 +827,7 @@ npx @jaimevalasek/aioson scan:project . --folder=src
827
827
 
828
828
  **Como ativar:**
829
829
  ```
830
- @orache
830
+ /aioson:agent:orache
831
831
  ```
832
832
 
833
833
  **Entrega:**
@@ -849,7 +849,7 @@ npx @jaimevalasek/aioson scan:project . --folder=src
849
849
 
850
850
  **Como ativar:**
851
851
  ```
852
- @pentester
852
+ /aioson:agent:pentester
853
853
  ```
854
854
 
855
855
  **Entrega:**
@@ -870,7 +870,7 @@ npx @jaimevalasek/aioson scan:project . --folder=src
870
870
 
871
871
  **Como ativar:**
872
872
  ```
873
- @profiler-researcher
873
+ /aioson:agent:profiler-researcher
874
874
  ```
875
875
 
876
876
  **Entrega:**
@@ -889,7 +889,7 @@ npx @jaimevalasek/aioson scan:project . --folder=src
889
889
 
890
890
  **Como ativar:**
891
891
  ```
892
- @profiler-enricher
892
+ /aioson:agent:profiler-enricher
893
893
  ```
894
894
 
895
895
  **Entrega:**
@@ -908,7 +908,7 @@ npx @jaimevalasek/aioson scan:project . --folder=src
908
908
 
909
909
  **Como ativar:**
910
910
  ```
911
- @profiler-forge
911
+ /aioson:agent:profiler-forge
912
912
  ```
913
913
 
914
914
  **Entrega:**
@@ -927,7 +927,7 @@ npx @jaimevalasek/aioson scan:project . --folder=src
927
927
 
928
928
  **Como ativar:**
929
929
  ```
930
- @site-forge
930
+ /aioson:agent:site-forge
931
931
  ```
932
932
 
933
933
  **Exemplos de uso:**
@@ -953,7 +953,7 @@ Extraia o design de https://exemplo.com como uma skill
953
953
 
954
954
  **Como ativar:**
955
955
  ```
956
- @validator
956
+ /aioson:agent:validator
957
957
  ```
958
958
 
959
959
  **Entrega:**
@@ -95,7 +95,7 @@ Saída:
95
95
  }
96
96
  ```
97
97
 
98
- Scout persiste com `status: "error"`. `@deyvin` informa o usuário e oferece handoff manual para `/architect` se necessário.
98
+ Scout persiste com `status: "error"`. `@deyvin` informa o usuário e oferece handoff manual para `/aioson:agent:architect` se necessário.
99
99
 
100
100
  ---
101
101
 
@@ -121,7 +121,7 @@ Saída:
121
121
  }
122
122
  ```
123
123
 
124
- `@deyvin` superfície a mensagem e pergunta ao usuário como prosseguir: normalmente handoff para `/architect` se os surveys continuarem se multiplicando.
124
+ `@deyvin` superfície a mensagem e pergunta ao usuário como prosseguir: normalmente handoff para `/aioson:agent:architect` se os surveys continuarem se multiplicando.
125
125
 
126
126
  Para aumentar o limite no projeto:
127
127
 
@@ -9,7 +9,7 @@
9
9
  Sem o scout, `@deyvin` tinha duas opções ruins quando uma pergunta precisava inspecionar muitos arquivos:
10
10
 
11
11
  1. **Ler tudo inline** — queima ≥10k tokens no contexto pai, polui a memória de trabalho do agente e força o próximo turno a competir com conteúdo de survey obsoleto.
12
- 2. **Fazer handoff para `/architect` ou pausar** — ultrapassa a necessidade real (a maioria dos surveys não precisa de decisões arquiteturais) e quebra o fluxo da conversa com uma troca completa de agente.
12
+ 2. **Fazer handoff para `/aioson:agent:architect` ou pausar** — ultrapassa a necessidade real (a maioria dos surveys não precisa de decisões arquiteturais) e quebra o fluxo da conversa com uma troca completa de agente.
13
13
 
14
14
  O scout resolve isso: o agente pai mantém o contexto limpo e recebe um relatório estruturado de ~500 tokens em vez dos arquivos brutos.
15
15
 
@@ -81,7 +81,7 @@ Você tem 1 retry (`max_retries_on_malformed_json=1`). Se o segundo também falh
81
81
  **O que fazer:**
82
82
 
83
83
  1. O scout foi persistido com `status: "error"` em `.aioson/runtime/scouts/{id}.json`.
84
- 2. `@deyvin` informa o usuário e oferece handoff para `/architect` ou resposta direta com o que já sabe.
84
+ 2. `@deyvin` informa o usuário e oferece handoff para `/aioson:agent:architect` ou resposta direta com o que já sabe.
85
85
  3. Para aumentar os retries: `{ "max_retries_on_malformed_json": 2 }` no config (raramente necessário — se acontece frequentemente, o prompt template precisa de ajuste).
86
86
 
87
87
  ---
@@ -71,7 +71,7 @@ A feature `living-memory` foi entregue em 5 fases entre 2026-04 e 2026-05:
71
71
 
72
72
  | Fase | Entrega | Status |
73
73
  |---|---|---|
74
- | 0 | Slash `/discover` em todos harnesses + `doctor.js` reconhece slashes | ✅ |
74
+ | 0 | Slash `/aioson:agent:discover` em todos harnesses + `doctor.js` reconhece slashes | ✅ |
75
75
  | 1 | Engine determinístico + `memory:reflect-prepare/commit` + 3 templates | ✅ |
76
76
  | 2 | `autonomy-protocol.json` v1.1 com `tiers` + `permissions-generator` (4 harnesses) + `notify` | ✅ |
77
77
  | 3 | Capability `reflect_memory` nos manifests + hooks em `workflow:next` + `runAgentDone` + agentes com Memory reflection | ✅ |
@@ -17,7 +17,7 @@ O AIOSON guarda quatro tipos de memória, com papéis diferentes:
17
17
 
18
18
  | Camada | O que guarda | Onde mora | Atualização |
19
19
  |---|---|---|---|
20
- | **Bootstrap** (semântica) | Identidade, arquitetura, features, estado atual — em prosa curta | `.aioson/context/bootstrap/*.md` | Reflexão automática + `/discover` manual |
20
+ | **Bootstrap** (semântica) | Identidade, arquitetura, features, estado atual — em prosa curta | `.aioson/context/bootstrap/*.md` | Reflexão automática + `/aioson:agent:discover` manual |
21
21
  | **Devlog** (episódica) | O que aconteceu em cada sessão de cada agente | `aioson-logs/devlog-*.md` + SQLite | Cada agente escreve no final |
22
22
  | **Brain** (procedural) | Padrões reutilizáveis que ganharam qualidade alta | `.aioson/brains/*.brain.json` | Promoção semi-automática de devlogs |
23
23
  | **Runtime** (telemetria) | Eventos minuto-a-minuto: handoffs, gates, reflexões, notifies | `.aioson/runtime/aios.sqlite` | CLI grava em todo comando relevante |
@@ -92,7 +92,7 @@ A heurística é determinística e está no `src/memory-reflect-engine.js`. Verd
92
92
 
93
93
  Caso contrário: `verdict=skip` — a sessão foi sobre CSS, typo, refactor de testes etc. e não muda nada no resumo semântico.
94
94
 
95
- A heurística é conservadora pelo lado dos *falsos positivos* (custa pouco — só atrasa 5s na geração do manifest), mas o doctor (Fase 4) é o backstop: se bootstrap ficar > 30 dias sem update, ele emite warning na próxima sessão sugerindo `/discover` manual.
95
+ A heurística é conservadora pelo lado dos *falsos positivos* (custa pouco — só atrasa 5s na geração do manifest), mas o doctor (Fase 4) é o backstop: se bootstrap ficar > 30 dias sem update, ele emite warning na próxima sessão sugerindo `/aioson:agent:discover` manual.
96
96
 
97
97
  ## Como verificar o estado da memória
98
98
 
@@ -173,7 +173,7 @@ ls: cannot access: No such file or directory
173
173
  | Cenário | Comportamento |
174
174
  |---|---|
175
175
  | Git não disponível no projeto | Engine retorna `verdict=skip`, prepare loga `skipped` e não escreve manifest |
176
- | `bootstrap/` não existe | Prepare retorna `missing_bootstrap`, sugere `/discover` |
176
+ | `bootstrap/` não existe | Prepare retorna `missing_bootstrap`, sugere `/aioson:agent:discover` |
177
177
  | Diff range inválido (`HEAD~3` não existe — projeto novo) | Fallback para `git diff HEAD` (working tree). Se ainda assim vazio: skip |
178
178
  | Agente edita arquivo fora de `allowed_paths` | Commit rejeita, emite `memory_reflect_failed` com erro `outside allowed_paths` |
179
179
  | Agente esquece de atualizar `generated_at` | Reject com `generated_at not updated` |
@@ -15,11 +15,11 @@
15
15
 
16
16
  **Diagnóstico:** `.aioson/context/bootstrap/` está vazio ou faltando arquivos. O agente está caindo no fallback de varrer o repo, e isso consome contexto + perde nuances.
17
17
 
18
- **Fix:** rode `/discover` no harness ativo. Esse é o único caminho — bootstrap é **semântico**, precisa do LLM analisando o projeto. `doctor --fix` **não** popula bootstrap (a hint deixa isso explícito).
18
+ **Fix:** rode `/aioson:agent:discover` no harness ativo. Esse é o único caminho — bootstrap é **semântico**, precisa do LLM analisando o projeto. `doctor --fix` **não** popula bootstrap (a hint deixa isso explícito).
19
19
 
20
20
  ```bash
21
21
  # Em qualquer harness:
22
- /discover
22
+ /aioson:agent:discover
23
23
 
24
24
  # O agente vai:
25
25
  # - Ler o código real
@@ -49,7 +49,7 @@ aioson memory:status .
49
49
 
50
50
  (Repare: cobertura 4/4 mas advisório por estar antigo — a hint detecta via `generated_at`.)
51
51
 
52
- **Fix:** rode `/discover` novamente — ele sobrescreve com a foto atual. Alternativa para refresh parcial: faça uma sessão de `/dev` que mexa em rotas ou models — a reflexão automática vai atualizar `how-it-works.md` e `current-state.md`.
52
+ **Fix:** rode `/aioson:agent:discover` novamente — ele sobrescreve com a foto atual. Alternativa para refresh parcial: faça uma sessão de `/aioson:agent:dev` que mexa em rotas ou models — a reflexão automática vai atualizar `how-it-works.md` e `current-state.md`.
53
53
 
54
54
  ---
55
55
 
@@ -152,7 +152,7 @@ O fix chama `permissions-generator` automaticamente. Os arquivos anteriores fica
152
152
  Hint: Missing: .claude/commands/aioson/agent/discover.md. Run `aioson doctor . --fix` to restore them from the template.
153
153
  ```
154
154
 
155
- **Diagnóstico:** `.claude/commands/aioson/agent/<nome>.md` não existe. Os 4 obrigatórios são `setup.md`, `dev.md`, `qa.md`, `discover.md`. Sem o slash, o usuário não consegue invocar `/discover`, `/dev`, etc. em Claude Code.
155
+ **Diagnóstico:** `.claude/commands/aioson/agent/<nome>.md` não existe. Os 4 obrigatórios são `setup.md`, `dev.md`, `qa.md`, `discover.md`. Sem o slash, o usuário não consegue invocar `/aioson:agent:discover`, `/aioson:agent:dev`, etc. em Claude Code.
156
156
 
157
157
  **Fix:**
158
158
 
@@ -215,7 +215,7 @@ Cria o diretório vazio. Dossiês são populados pelos agentes (`@product`, `@de
215
215
 
216
216
  3. **Agente não está lendo `reflect-prompt.json`?** A seção "Memory reflection" em `dev.md`/`qa.md`/`deyvin.md` instrui ele. Se o agente que você está usando é custom (`.aioson/my-agents/`), adicione a seção lá também.
217
217
 
218
- 4. **Bootstrap não existe?** Reflexão pula silenciosamente quando `bootstrap/` não está presente — rode `/discover` primeiro.
218
+ 4. **Bootstrap não existe?** Reflexão pula silenciosamente quando `bootstrap/` não está presente — rode `/aioson:agent:discover` primeiro.
219
219
 
220
220
  ---
221
221
 
@@ -274,7 +274,7 @@ O hook do installer regenera as 4 permissões nativas. Próxima invocação do c
274
274
  | Forçar reflexão manual | `aioson memory:reflect-prepare . --agent=dev --force` |
275
275
  | Apagar manifest pendente | `rm .aioson/runtime/reflect-prompt.json` |
276
276
  | Reset full: reinstalar template | `aioson update --all .` (backup automático em `.aioson/backups/`) |
277
- | Reseed bootstrap | `/discover` no harness ativo |
277
+ | Reseed bootstrap | `/aioson:agent:discover` no harness ativo |
278
278
 
279
279
  ---
280
280
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jaimevalasek/aioson",
3
- "version": "1.17.2",
3
+ "version": "1.18.0",
4
4
  "description": "AI operating framework for hyper-personalized software.",
5
5
  "keywords": [
6
6
  "ai",
@@ -46,6 +46,8 @@
46
46
  "ci": "npm run lint && npm test"
47
47
  },
48
48
  "dependencies": {
49
- "better-sqlite3": "^12.6.2"
49
+ "archiver": "^8.0.0",
50
+ "better-sqlite3": "^12.6.2",
51
+ "terser": "^5.48.0"
50
52
  }
51
53
  }
@@ -20,13 +20,18 @@ const {
20
20
  contextDir,
21
21
  readFileSafe,
22
22
  fileExists,
23
+ fileStat,
23
24
  parseFrontmatter,
24
25
  parseGatesFromSpec,
25
26
  GATE_NAMES,
26
27
  GATE_ALIASES
27
28
  } = require('../preflight-engine');
29
+ const { ensureDir } = require('../utils');
28
30
  const { runGateCheck } = require('./gate-check');
29
31
 
32
+ const CHECKPOINTS_DIR = '.aioson/runtime/checkpoints';
33
+ const CHECKPOINT_MAX_BYTES = 5120;
34
+
30
35
  const BAR = '━'.repeat(45);
31
36
 
32
37
  const GATE_FLAT_FIELDS = {
@@ -88,6 +93,13 @@ async function runGateApprove({ args, options = {}, logger }) {
88
93
  return { ok: false };
89
94
  }
90
95
 
96
+ // SF-AO-01: reject slugs with path traversal characters
97
+ if (slug.includes('/') || slug.includes('\\') || slug.includes('..')) {
98
+ if (options.json) return { ok: false, reason: 'invalid_feature_slug' };
99
+ logger.log('--feature slug must not contain path separators (/ \\) or .. segments.');
100
+ return { ok: false };
101
+ }
102
+
91
103
  if (!gateLetter) {
92
104
  if (options.json) return { ok: false, reason: 'missing_gate' };
93
105
  logger.log('--gate=<A|B|C|D> is required.');
@@ -165,6 +177,48 @@ async function runGateApprove({ args, options = {}, logger }) {
165
177
 
166
178
  await fs.writeFile(specFile, content, 'utf8');
167
179
 
180
+ // M1 checkpoint-at-gate: best-effort checkpoint write (BR-AO-01)
181
+ let checkpointWritten = false;
182
+ try {
183
+ const checkpointDir = path.join(targetDir, CHECKPOINTS_DIR);
184
+ await ensureDir(checkpointDir);
185
+
186
+ const artifactEvidence = (check.evidence || []).filter((e) => e.type === 'artifact' && e.ok);
187
+ const snapshot = [];
188
+ for (const ev of artifactEvidence) {
189
+ const filePath = path.join(contextDir(targetDir), ev.file);
190
+ const stat = await fileStat(filePath);
191
+ if (stat) {
192
+ snapshot.push({ file: ev.file, mtime: stat.mtime.toISOString() });
193
+ }
194
+ }
195
+
196
+ const checkpoint = {
197
+ gate: gateLetter,
198
+ slug,
199
+ agent: options.agent ? String(options.agent) : 'unknown',
200
+ timestamp: new Date().toISOString(),
201
+ prerequisites_snapshot: snapshot,
202
+ gate_check_result: check,
203
+ decision_log: []
204
+ };
205
+
206
+ // BR-AO-03: size cap — truncate decision_log if > 5KB
207
+ let payload = JSON.stringify(checkpoint, null, 2);
208
+ if (Buffer.byteLength(payload, 'utf8') > CHECKPOINT_MAX_BYTES) {
209
+ checkpoint.decision_log = checkpoint.decision_log.slice(-3);
210
+ checkpoint.decision_log.unshift('[truncated]');
211
+ payload = JSON.stringify(checkpoint, null, 2);
212
+ }
213
+
214
+ const checkpointFile = path.join(checkpointDir, `gate-${gateLetter}-${slug}.json`);
215
+ await fs.writeFile(checkpointFile, payload + '\n', 'utf8');
216
+ checkpointWritten = true;
217
+ } catch (err) {
218
+ // EC-AO-01: checkpoint failure never blocks gate:approve
219
+ process.stderr.write(`[gate:approve] checkpoint write failed: ${err.message}\n`);
220
+ }
221
+
168
222
  const nextInfo = GATE_NEXT_AGENTS[gateLetter];
169
223
  const result = {
170
224
  ok: true,
@@ -173,6 +227,7 @@ async function runGateApprove({ args, options = {}, logger }) {
173
227
  feature: slug,
174
228
  field_written: specFieldName,
175
229
  spec_file: `.aioson/context/spec-${slug}.md`,
230
+ checkpoint_written: checkpointWritten,
176
231
  next_agent: nextInfo.agent,
177
232
  next_action: nextInfo.action,
178
233
  why: nextInfo.why
@@ -195,4 +250,4 @@ async function runGateApprove({ args, options = {}, logger }) {
195
250
  return result;
196
251
  }
197
252
 
198
- module.exports = { runGateApprove };
253
+ module.exports = { runGateApprove, CHECKPOINTS_DIR };