@jaimevalasek/aioson 1.17.3 → 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.
- package/CHANGELOG.md +13 -0
- package/README.md +85 -51
- package/docs/en/3-recipes/full-feature-with-sheldon.md +1 -1
- package/docs/en/5-reference/cli-reference.md +4 -4
- package/docs/en/5-reference/qa-browser.md +2 -2
- package/docs/en/README.md +1 -1
- package/docs/en/deyvin-subtask-scout/how-to-use.md +2 -2
- package/docs/en/deyvin-subtask-scout/sub-task-scout.md +3 -3
- package/docs/en/deyvin-subtask-scout/troubleshooting.md +1 -1
- package/docs/pt/3-receitas/publicar-no-aioson-com.md +17 -0
- package/docs/pt/5-referencia/comandos-cli.md +2 -2
- package/docs/pt/5-referencia/inteligencia-adaptativa.md +3 -3
- package/docs/pt/5-referencia/skills.md +1 -1
- package/docs/pt/5-referencia/web3.md +3 -3
- package/docs/pt/README.md +1 -1
- package/docs/pt/_arquivo/README.md +1 -1
- package/docs/pt/_arquivo/cenarios.md +31 -31
- package/docs/pt/_arquivo/design-hybrid-forge.md +5 -5
- package/docs/pt/_arquivo/guia-engineer.md +1 -1
- package/docs/pt/_arquivo/profiler-system.md +1 -1
- package/docs/pt/_arquivo/site-forge.md +16 -16
- package/docs/pt/_arquivo/squad-genome.md +2 -2
- package/docs/pt/agentes.md +37 -37
- package/docs/pt/deyvin-subtask-scout/como-usar.md +2 -2
- package/docs/pt/deyvin-subtask-scout/sub-task-scout.md +1 -1
- package/docs/pt/deyvin-subtask-scout/troubleshooting.md +1 -1
- package/docs/pt/living-memory/README.md +1 -1
- package/docs/pt/living-memory/memoria-viva.md +2 -2
- package/docs/pt/living-memory/reflexao-in-harness.md +1 -1
- package/docs/pt/living-memory/troubleshooting.md +6 -6
- package/package.json +1 -1
- package/src/commands/gate-approve.js +56 -1
- package/src/commands/live.js +81 -54
- package/src/commands/op-capture.js +27 -2
- package/src/commands/op-list.js +33 -1
- package/src/commands/store-system.js +4 -0
- package/src/commands/tool-capabilities.js +14 -10
- package/src/commands/workflow-heal.js +47 -1
- package/src/i18n/messages/en.js +6 -5
- package/src/i18n/messages/pt-BR.js +6 -5
- package/src/lib/dev-resume.js +6 -1
- package/src/lib/tool-capabilities.js +64 -37
- package/src/operator-memory/decision.js +11 -4
- package/src/operator-memory/proposal.js +11 -7
- package/src/session-handoff.js +52 -1
- package/template/.aioson/agents/analyst.md +33 -1
- package/template/.aioson/agents/architect.md +33 -1
- package/template/.aioson/agents/briefing.md +23 -0
- package/template/.aioson/agents/orchestrator.md +26 -0
- package/template/.aioson/agents/pentester.md +66 -14
- package/template/.aioson/agents/pm.md +18 -1
- package/template/.aioson/agents/product.md +11 -0
- package/template/.aioson/agents/sheldon.md +21 -1
- package/template/.aioson/agents/tester.md +114 -1
- package/template/.aioson/docs/pentester/browser-dast-playbook.md +398 -0
- package/template/.aioson/rules/agent-structural-contract.md +139 -0
- package/template/.aioson/skills/process/decision-presentation/SKILL.md +2 -2
package/docs/pt/agentes.md
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
@@ -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 };
|