wendkeep 0.72.0 → 0.73.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 +66 -3
- package/README.en.md +28 -11
- package/README.md +28 -11
- package/docs/en/commands/changes-and-verification.md +10 -5
- package/docs/en/commands/maintenance-and-diagnostics.md +17 -9
- package/docs/en/commands/observer.md +18 -12
- package/docs/en/commands/operating-profiles.md +28 -3
- package/docs/en/commands/sessions-and-import.md +4 -4
- package/docs/pt-BR/commands/changes-and-verification.md +10 -5
- package/docs/pt-BR/commands/maintenance-and-diagnostics.md +12 -5
- package/docs/pt-BR/commands/observer.md +18 -12
- package/docs/pt-BR/commands/operating-profiles.md +28 -3
- package/docs/pt-BR/commands/sessions-and-import.md +4 -4
- package/hooks/brain-inject.mjs +6 -6
- package/hooks/change-context.mjs +11 -0
- package/hooks/change-core.mjs +53 -21
- package/hooks/change-warn.mjs +2 -0
- package/hooks/harness-doctor.mjs +13 -5
- package/hooks/understand-inject.mjs +1 -1
- package/hooks/vault-health.mjs +2 -2
- package/package.json +5 -4
- package/packages/cli/src/index.mjs +12 -2
- package/packages/integrations/src/host-hooks.mjs +1 -1
- package/packages/vault/src/memory-store.mjs +17 -4
- package/src/change.mjs +10 -4
- package/src/delivery.mjs +303 -0
- package/src/doctor.mjs +47 -10
- package/src/init.mjs +2 -2
- package/src/observer-auth.mjs +10 -0
- package/src/observer-memory-publish.mjs +13 -8
- package/src/observer-privacy.mjs +23 -0
- package/src/observer-publish.mjs +10 -7
- package/src/observer-server.mjs +51 -0
- package/src/observer-sql-publish.mjs +72 -31
- package/src/observer-sql-store.mjs +33 -2
- package/src/observer.mjs +10 -3
- package/src/release-changelog.mjs +1 -1
- package/src/release-provenance.mjs +115 -0
- package/src/skills-seed.mjs +25 -9
- package/src/sync-defs.mjs +5 -2
- package/src/sync.mjs +2 -2
- package/src/taxonomy.mjs +1 -1
- package/src/vault-readme.mjs +2 -2
- package/src/work-kind.mjs +62 -0
|
@@ -23,7 +23,7 @@ Execute na raiz do projeto ou informe `--project`/`--vault` explicitamente.
|
|
|
23
23
|
## Sintaxe
|
|
24
24
|
|
|
25
25
|
```bash
|
|
26
|
-
npx --no-install wendkeep doctor [--vault <cofre>]
|
|
26
|
+
npx --no-install wendkeep doctor [--vault <cofre>] [--scope all|core|runtime] [--strict]
|
|
27
27
|
npx --no-install wendkeep memory curate --vault <cofre>
|
|
28
28
|
npx --no-install wendkeep sync-defs [--check|--reseed] --vault <cofre> --project <raiz>
|
|
29
29
|
npx --no-install wendkeep theme sync --vault <cofre>
|
|
@@ -33,7 +33,10 @@ npx --no-install wendkeep --help
|
|
|
33
33
|
|
|
34
34
|
## Opções e códigos de saída
|
|
35
35
|
|
|
36
|
-
- `doctor` é read-only
|
|
36
|
+
- `doctor` é read-only. Por padrão, exit não zero indica erro estrutural; `--strict` também torna
|
|
37
|
+
atenção de workflow, dívida reparável e memória degradada apropriadas para gate de CI/release.
|
|
38
|
+
- `--scope core` verifica somente instalação, identidade, sessão e memória; `sync` usa esse escopo
|
|
39
|
+
e não falha por change ainda em andamento. `--scope runtime` isola harness/governança.
|
|
37
40
|
- O `doctor` usa saída em formato humano, com blocos `[integridade]` e `[memória]`, categorias
|
|
38
41
|
amigáveis e uma próxima ação copiável. O hook `vault-health.mjs` continua sendo a superfície JSON
|
|
39
42
|
para automações; nenhum dos dois aplica curadoria.
|
|
@@ -44,8 +47,9 @@ npx --no-install wendkeep --help
|
|
|
44
47
|
event IDs e checkpoint) com outbox, ledger e SHARED; não inferem saúde só pela revision atual.
|
|
45
48
|
- `revision: 0` após migração válida, sem attempt v2, é saudável. Attempt `degraded` cujos eventos
|
|
46
49
|
continuam duráveis na outbox/ledger é warning recuperável.
|
|
47
|
-
-
|
|
48
|
-
|
|
50
|
+
- Conflito semântico é `degraded` e omite somente as chaves afetadas; não bloqueia o Core. Attempt
|
|
51
|
+
causal ambíguo, event ID perdido, ledger corrompido, boundary insegura ou checkpoint divergente
|
|
52
|
+
continuam sendo falhas estruturais bloqueantes.
|
|
49
53
|
- Para observabilidade de sessão, `legacy`, `degraded`, `stale` e `manifest-unproven` exigem
|
|
50
54
|
reconciliação ou evidência adicional. Somente `none` fresco e `complete` fresco são saudáveis:
|
|
51
55
|
frontier, checkpoint, root stat e source manifest precisam concordar.
|
|
@@ -63,6 +67,8 @@ Checklist pós-atualização:
|
|
|
63
67
|
npx --no-install wendkeep --version
|
|
64
68
|
npx --no-install wendkeep sync-defs --check --vault .MeuApp-vault --project .
|
|
65
69
|
npx --no-install wendkeep doctor --vault .MeuApp-vault
|
|
70
|
+
npx --no-install wendkeep doctor --scope core --vault .MeuApp-vault
|
|
71
|
+
npx --no-install wendkeep doctor --scope runtime --strict --vault .MeuApp-vault
|
|
66
72
|
npx --no-install wendkeep memory status --gate --vault .MeuApp-vault
|
|
67
73
|
npx --no-install wendkeep memory curate --vault .MeuApp-vault
|
|
68
74
|
npx --no-install wendkeep memory candidates --active --vault .MeuApp-vault
|
|
@@ -72,7 +78,8 @@ npx --no-install wendkeep cost rebuild --session <id> --json --vault .MeuApp-vau
|
|
|
72
78
|
|
|
73
79
|
## Resultado esperado
|
|
74
80
|
|
|
75
|
-
O doctor
|
|
81
|
+
O doctor separa `structural error`, `workflow attention`, `repairable debt` e `semantic ambiguity`,
|
|
82
|
+
e nomeia sessões, registry, links, notas, preços, derivadas e memória como saudáveis ou
|
|
76
83
|
fornece um comando específico de diagnóstico/reparo. Na memória, ele distingue vazio inicial
|
|
77
84
|
válido, replay pendente recuperável e lifecycle perdido/divergente. Nenhum reparo é aplicado
|
|
78
85
|
implicitamente nem o conteúdo privado do erro do projector é reproduzido no relatório. Na
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
O Observer consolida a observabilidade de vários projetos WendKeep em um serviço local. O volume
|
|
8
8
|
Docker mantém o SQLite `/data/observer.sqlite` como autoridade única para documentos, sessões,
|
|
9
|
-
agentes, uso
|
|
9
|
+
agentes, uso e chamadas. Transcripts completos são opcionais e exigem captura explícita. O conteúdo fica disponível para navegação e busca
|
|
10
10
|
no próprio container, sem depender do Obsidian para consulta.
|
|
11
11
|
|
|
12
12
|
## Quando usar
|
|
@@ -24,8 +24,9 @@ pelos hooks e pelo WendKeep local.
|
|
|
24
24
|
|
|
25
25
|
## Pré-requisitos
|
|
26
26
|
|
|
27
|
-
Tenha
|
|
28
|
-
|
|
27
|
+
Tenha Node.js 22.13 ou mais recente para executar o Observer SQL. O Keep Core e os demais comandos
|
|
28
|
+
continuam compatíveis com Node.js 18 ou mais recente. Registre explicitamente cada projeto e defina
|
|
29
|
+
`WENDKEEP_OBSERVER_TOKEN`; leituras no loopback permanecem abertas, mas toda mutação exige Bearer.
|
|
29
30
|
|
|
30
31
|
## Sintaxe
|
|
31
32
|
|
|
@@ -33,8 +34,8 @@ iniciar o servidor HTTP. No modo local padrão não há token para configurar.
|
|
|
33
34
|
npx wendkeep observer status --data-dir <diretório> --json
|
|
34
35
|
npx wendkeep observer register --project <projeto> --vault <vault> --data-dir <diretório>
|
|
35
36
|
npx wendkeep observer publish --project <projeto> --vault <vault> --data-dir <diretório>
|
|
36
|
-
npx wendkeep observer memory import --project <projeto> --vault <vault> --url http://127.0.0.1:8787 --json
|
|
37
|
-
npx wendkeep observer serve --host 127.0.0.1 --port 8787 --data-dir <diretório>
|
|
37
|
+
npx wendkeep observer memory import --project <projeto> --vault <vault> --url http://127.0.0.1:8787 --token <token> --json
|
|
38
|
+
npx wendkeep observer serve --host 127.0.0.1 --port 8787 --data-dir <diretório> --token <token>
|
|
38
39
|
```
|
|
39
40
|
|
|
40
41
|
## Opções e códigos de saída
|
|
@@ -44,8 +45,9 @@ npx wendkeep observer serve --host 127.0.0.1 --port 8787 --data-dir <diretório>
|
|
|
44
45
|
- `--project` e `--vault` identificam o projeto nos comandos `register`, `publish` e `memory import`.
|
|
45
46
|
- `--host` aceita somente `127.0.0.1`, `localhost` ou `::1`; outros hosts são recusados antes do
|
|
46
47
|
listen.
|
|
47
|
-
-
|
|
48
|
-
|
|
48
|
+
- `--token` ou `WENDKEEP_OBSERVER_TOKEN` autentica mutações; `--allow-non-loopback` falha sem token.
|
|
49
|
+
- `WENDKEEP_OBSERVER_CAPTURE_LEVEL` aceita `metadata` (padrão, sem mensagens), `messages` ou
|
|
50
|
+
`full-transcript`. Caminhos locais absolutos nunca são publicados.
|
|
49
51
|
- Exit `0` indica sucesso; exit `1` indica falha de configuração ou operação; o hook publisher
|
|
50
52
|
também retorna `0` quando o Observer está indisponível.
|
|
51
53
|
|
|
@@ -53,7 +55,8 @@ npx wendkeep observer serve --host 127.0.0.1 --port 8787 --data-dir <diretório>
|
|
|
53
55
|
|
|
54
56
|
```powershell
|
|
55
57
|
npx wendkeep observer register --project C:\GitHub\WendKeep --vault C:\GitHub\WendKeep\.WendKeep-vault --data-dir C:\WendKeepObserver
|
|
56
|
-
|
|
58
|
+
$env:WENDKEEP_OBSERVER_TOKEN = '<token-local-forte>'
|
|
59
|
+
npx wendkeep observer serve --host 127.0.0.1 --port 8787 --data-dir C:\WendKeepObserver --token $env:WENDKEEP_OBSERVER_TOKEN
|
|
57
60
|
$env:WENDKEEP_OBSERVER_URL = 'http://127.0.0.1:8787'
|
|
58
61
|
```
|
|
59
62
|
|
|
@@ -66,14 +69,14 @@ docker compose -f docker/wendkeep-observer/compose.yaml up -d --build
|
|
|
66
69
|
## Painel web local
|
|
67
70
|
|
|
68
71
|
Com o servidor em execução, abra [http://127.0.0.1:8787/](http://127.0.0.1:8787/) no navegador.
|
|
69
|
-
O painel é servido pelo mesmo processo e abre diretamente, sem formulário ou token. A porta fica
|
|
72
|
+
O painel é servido pelo mesmo processo e abre diretamente para consultas, sem formulário ou token. A porta fica
|
|
70
73
|
presa ao loopback do computador; não coloque o endereço em uma interface de rede.
|
|
71
74
|
|
|
72
75
|
O painel mostra a lista multi-projeto, versão, saúde, sessão mais recente, change ativa, contagem
|
|
73
76
|
de changes e data da última captura. Ao abrir um projeto, o workspace oferece Overview, Consumo,
|
|
74
77
|
Sessões, Memória, Changes e Sincronização. A aba Consumo mostra custo total, tokens por categoria,
|
|
75
78
|
agentes principais, subagentes, provedores, modelos, tendência diária, cobertura histórica e
|
|
76
|
-
chamadas
|
|
79
|
+
chamadas conforme o nível de captura escolhido. Os estados de carregamento, vazio, servidor
|
|
77
80
|
indisponível, conflito, modelo sem tarifa e dados desatualizados ficam visíveis, e a atualização
|
|
78
81
|
pode ser manual ou automática a cada 15 segundos.
|
|
79
82
|
|
|
@@ -85,7 +88,8 @@ Se o navegador mostrar a tela mas a lista falhar, confirme a saúde em
|
|
|
85
88
|
`register` grava `project_id`, nome, versão e data de registro. `publish` lê o vault local,
|
|
86
89
|
produz o snapshot e envia eventos idempotentes para o SQLite com o conteúdo integral das sessões,
|
|
87
90
|
decisões, bugs, aprendizados, specs, changes, CORE, DIGEST, SHARED_MEMORY, estado do brain,
|
|
88
|
-
sessões de agentes, rollups de custo
|
|
91
|
+
sessões de agentes, rollups de custo e chamadas. Mensagens e transcripts só são enviados nos
|
|
92
|
+
níveis de captura que os habilitam. O container grava tudo em
|
|
89
93
|
`/data/observer.sqlite`; não monta `C:\GitHub` nem qualquer `.WendKeep-vault`. Markdown é aceito
|
|
90
94
|
somente como conteúdo de uma coluna SQL e volta a existir como arquivo apenas pela exportação
|
|
91
95
|
read-only sob demanda. `memory import` faz a carga inicial e retorna a paridade por arquivo e hash.
|
|
@@ -106,7 +110,9 @@ corpo antes de ingerir. O outbox é transporte temporário, não autoridade.
|
|
|
106
110
|
- `project_not_registered`: rode `observer register` antes de publicar.
|
|
107
111
|
- `host loopback`: troque `0.0.0.0` ou endereço LAN por `127.0.0.1`.
|
|
108
112
|
- Outbox pendente: o serviço estava indisponível; preserve `.brain/observer-outbox/` e
|
|
109
|
-
`.brain/observer-sql-outbox/` e repita o publisher.
|
|
113
|
+
`.brain/observer-sql-outbox/` e repita o publisher. Adicione também
|
|
114
|
+
`.brain/observer-sql-state.json` e `.brain/observer-sql-outbox/` ao ignore do Vault. Não apague eventos manualmente.
|
|
115
|
+
- `WENDKEEP_OBSERVER_NODE_UNSUPPORTED`: execute o Observer em Node.js 22.13 ou mais recente.
|
|
110
116
|
- Se a memória ou o consumo ficarem incompletos, verifique a tela Sincronização, preserve o
|
|
111
117
|
outbox e rode `observer memory import` para reconstruir a carga a partir do vault.
|
|
112
118
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Perfis de Operação e
|
|
1
|
+
# Perfis de Operação, work kind, FLOW e delivery
|
|
2
2
|
|
|
3
3
|
**PT-BR** · [English](../../en/commands/operating-profiles.md)
|
|
4
4
|
|
|
@@ -17,6 +17,8 @@ deliberado e executa as validações e gates próprios daquele comando.
|
|
|
17
17
|
Use `profile use` para uma seleção humana persistente e `profile route` para o harness registrar a
|
|
18
18
|
rota temporária da implementação atual. Use `FLOW` para manutenção local, reversível e com
|
|
19
19
|
`spec_impact:none` que caiba num microcontrato Executar → Validar, sem change.
|
|
20
|
+
Use `delivery` para merge, push, tag e publicação de comportamento já aprovado: risco operacional
|
|
21
|
+
exige autorização/receipt, não uma nova change ou spec.
|
|
20
22
|
|
|
21
23
|
## Quando não usar
|
|
22
24
|
|
|
@@ -55,6 +57,10 @@ npx wendkeep flow status [<id>]
|
|
|
55
57
|
npx wendkeep flow show <id> [--session <id>]
|
|
56
58
|
npx wendkeep flow finish <id> [--session <id>]
|
|
57
59
|
npx wendkeep flow promote <id> [--change-slug <slug>] [--session <id>]
|
|
60
|
+
npx wendkeep delivery start [id] --allow <capability> [--source-change <slug>] [--source-commit <sha>]
|
|
61
|
+
npx wendkeep delivery status [id]
|
|
62
|
+
npx wendkeep delivery finish [id] [--target <ref>] [--ci-url <url>] [--version <x.y.z>] [--npm-integrity <sha512>] [--release-url <url>]
|
|
63
|
+
npx wendkeep delivery abandon [id] --reason <texto>
|
|
58
64
|
```
|
|
59
65
|
|
|
60
66
|
Todos os subcomandos FLOW também aceitam `--project <path>`, `--vault <path>` e `--json`.
|
|
@@ -85,7 +91,7 @@ independentes.
|
|
|
85
91
|
|---|---|---|
|
|
86
92
|
| `OFF` | harness nativo da LLM | Governança automática desligada; Keep Core e comandos explícitos disponíveis. |
|
|
87
93
|
| `FLOW` | E → V | Microcontrato com baseline Git, allowlist, sensores e recibo, sem change. |
|
|
88
|
-
| `GUIDE` | P → E → V |
|
|
94
|
+
| `GUIDE` | P → E → V | `change new --guide`; objetivo, aceite, áreas, testes e resultado; sem design/spec/ADR automático quando `contract_impact:none`. |
|
|
89
95
|
| `GOVERN` | P → R → E → V | Loop a2 atual e fallback conservador. |
|
|
90
96
|
| `ASSURE` | P → R → E → V → C | Governança acrescida de confirmação e handoff. |
|
|
91
97
|
|
|
@@ -163,6 +169,14 @@ harness nativo da LLM.
|
|
|
163
169
|
dono; contrato, reserva, attempts, recibo e origem permanecem semanticamente vinculados. O
|
|
164
170
|
perdedor permanece ativo e pode repetir com `--change-slug`. Retries retomam idempotentemente a
|
|
165
171
|
mesma promoção em vez de criar outra change. Não existe `--force` no FLOW.
|
|
172
|
+
- Work kind (`inspection`, `maintenance`, `implementation`, `delivery`, `recovery`), perfil,
|
|
173
|
+
`contract_impact` e `operation_risk` são dimensões independentes. `delivery start` captura repo,
|
|
174
|
+
branch/worktree, SHA, change de origem e capabilities em `.brain/runtime/deliveries/`; não cria
|
|
175
|
+
pasta em `08-Mudanças`, delta, spec ou ADR.
|
|
176
|
+
- `delivery finish` exige working tree limpa, comprova que o target contém o commit de origem e,
|
|
177
|
+
para capability `publish`, exige CI, versão, integridade npm e GitHub Release. O receipt é
|
|
178
|
+
append-only em `.brain/runtime/delivery-receipts.jsonl`. Se código/config precisar mudar, a
|
|
179
|
+
delivery para com `WENDKEEP_DELIVERY_IMPLEMENTATION_REQUIRED` e o trabalho volta a implementation.
|
|
166
180
|
- Exit `0` indica consulta ou transição concluída; exit `1` indica política/sensor vermelho; exit
|
|
167
181
|
`2` indica perfil, sessão, flow ou argumentos inválidos, sem mutação parcial.
|
|
168
182
|
|
|
@@ -228,13 +242,22 @@ novamente com um destino explícito:
|
|
|
228
242
|
npx wendkeep flow promote $flowId --change-slug outro-slug
|
|
229
243
|
```
|
|
230
244
|
|
|
245
|
+
Entregar uma versão já aprovada sem fabricar outra change:
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
npx wendkeep delivery start release-0-73-0 --source-change governanca-proporcional --allow git:merge --allow git:push --allow publish
|
|
249
|
+
npx wendkeep delivery status release-0-73-0
|
|
250
|
+
npx wendkeep delivery finish release-0-73-0 --target v0.73.0 --ci-url <run> --version 0.73.0 --npm-integrity <sha512> --release-url <release>
|
|
251
|
+
```
|
|
252
|
+
|
|
231
253
|
## Resultado esperado
|
|
232
254
|
|
|
233
255
|
Trocar o perfil não cria outra sessão nem interrompe o Vault. Em `OFF`, a memória e as lessons
|
|
234
256
|
continuam injetadas e o Stop continua persistindo sessão/memória, mas router, skill gate,
|
|
235
257
|
change context/warn/nag/guard e captura de plano automáticos ficam inativos. Os comandos explícitos
|
|
236
258
|
continuam disponíveis e executam seus próprios contratos. Um FLOW concluído deixa recibo durável e
|
|
237
|
-
consultável; um FLOW promovido passa a seguir o lifecycle normal de change.
|
|
259
|
+
consultável; um FLOW promovido passa a seguir o lifecycle normal de change. Uma delivery concluída
|
|
260
|
+
deixa receipt sem gerar ADR; GUIDE compacto arquiva o resultado sem spec/design/ADR artificiais.
|
|
238
261
|
|
|
239
262
|
## Erros comuns e diagnóstico
|
|
240
263
|
|
|
@@ -253,6 +276,8 @@ consultável; um FLOW promovido passa a seguir o lifecycle normal de change.
|
|
|
253
276
|
repita `flow finish` ou `flow promote`; o marcador idempotente impede duplicação.
|
|
254
277
|
- Sujeira anterior apareceu no diff: ela deve coincidir com o fingerprint inicial e nunca pode ser
|
|
255
278
|
atribuída silenciosamente ao FLOW.
|
|
279
|
+
- Delivery sem `--allow`, working tree suja ou evidência de publish incompleta: retome a
|
|
280
|
+
implementation real ou forneça os receipts; não crie uma change apenas para publicar.
|
|
256
281
|
|
|
257
282
|
## Próximos passos
|
|
258
283
|
|
|
@@ -26,11 +26,11 @@ Claude/Codex e um vault vinculado ao projeto correto.
|
|
|
26
26
|
## Sintaxe
|
|
27
27
|
|
|
28
28
|
```bash
|
|
29
|
-
npx wendkeep hook <nome>
|
|
29
|
+
npx --no-install wendkeep hook <nome>
|
|
30
30
|
npx wendkeep session list
|
|
31
31
|
npx wendkeep session show <id>
|
|
32
32
|
npx wendkeep session use <id>
|
|
33
|
-
npx wendkeep hook session-backfill --session <id> [--write]
|
|
33
|
+
npx --no-install wendkeep hook session-backfill --session <id> [--write]
|
|
34
34
|
npx wendkeep import [opções]
|
|
35
35
|
```
|
|
36
36
|
|
|
@@ -95,8 +95,8 @@ npx wendkeep import [opções]
|
|
|
95
95
|
```bash
|
|
96
96
|
npx wendkeep session list
|
|
97
97
|
npx wendkeep session show 019abc-session-id
|
|
98
|
-
npx wendkeep hook session-backfill --session 019abc-session-id
|
|
99
|
-
npx wendkeep hook session-backfill --session 019abc-session-id --write
|
|
98
|
+
npx --no-install wendkeep hook session-backfill --session 019abc-session-id
|
|
99
|
+
npx --no-install wendkeep hook session-backfill --session 019abc-session-id --write
|
|
100
100
|
npx wendkeep import --source codex --since 2026-07-01 --dry-run --json
|
|
101
101
|
```
|
|
102
102
|
|
package/hooks/brain-inject.mjs
CHANGED
|
@@ -29,9 +29,9 @@ function processRouter(localeId) {
|
|
|
29
29
|
if (localeId === 'en') {
|
|
30
30
|
return [
|
|
31
31
|
'<wk_process>',
|
|
32
|
-
'
|
|
33
|
-
'1.
|
|
34
|
-
'2.
|
|
32
|
+
'Proportional process: INVOKE the wk-workflow Skill BEFORE editing any file.',
|
|
33
|
+
'1. Classify work kind independently from profile: inspection, maintenance, implementation, delivery, or recovery.',
|
|
34
|
+
'2. Delivery of approved code uses `wendkeep delivery start/finish` and a receipt, without a new change/spec. For implementation, use wk-brainstorming + wk-planning, declare spec_impact, then select FLOW, `wendkeep change new --guide`, or GOVERN/ASSURE according to contract impact.',
|
|
35
35
|
'3. Implement: wk-tdd per task; tick `- [x]` as you finish. Something broke? wk-debugging.',
|
|
36
36
|
'4. Close: `wendkeep verify` (+ `--deep` + the wk-verify Skill) → `wendkeep change archive`.',
|
|
37
37
|
'NEVER `archive --force` on your own — a red gate means pending work; --force is the user\'s call, not yours. Dead end? `wendkeep change abandon`.',
|
|
@@ -40,9 +40,9 @@ function processRouter(localeId) {
|
|
|
40
40
|
}
|
|
41
41
|
return [
|
|
42
42
|
'<wk_process>',
|
|
43
|
-
'Processo
|
|
44
|
-
'1.
|
|
45
|
-
'2.
|
|
43
|
+
'Processo proporcional: INVOQUE a Skill wk-workflow ANTES de editar qualquer arquivo.',
|
|
44
|
+
'1. Classifique work kind independentemente do perfil: inspection, maintenance, implementation, delivery ou recovery.',
|
|
45
|
+
'2. Entrega de código aprovado usa `wendkeep delivery start/finish` e receipt, sem nova change/spec. Em implementation, use wk-brainstorming + wk-planning, declare spec_impact e escolha FLOW, `wendkeep change new --guide` ou GOVERN/ASSURE conforme impacto de contrato.',
|
|
46
46
|
'3. Implementar: wk-tdd por tarefa; marque `- [x]` ao concluir. Quebrou algo? wk-debugging.',
|
|
47
47
|
'4. Fechar: `wendkeep verify` (+ `--deep` + Skill wk-verify) → `wendkeep change archive`.',
|
|
48
48
|
'PROIBIDO `archive --force` por conta própria — gate vermelho significa trabalho pendente; --force é decisão do usuário, não sua. Beco sem saída? `wendkeep change abandon`.',
|
package/hooks/change-context.mjs
CHANGED
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
profileSentinelId,
|
|
15
15
|
resolveHookOperatingProfile,
|
|
16
16
|
} from './operating-profile-runtime.mjs';
|
|
17
|
+
import { activeDelivery } from '../src/delivery.mjs';
|
|
17
18
|
|
|
18
19
|
// Conservador de propósito: verbos de tarefa comuns (pt+en) + tamanho mínimo. Falso-negativo
|
|
19
20
|
// custa só o nudge; falso-positivo em pergunta curta viraria ruído.
|
|
@@ -29,6 +30,16 @@ export function buildChangePing(vaultBase, sessionId, prompt = '', changeSlug =
|
|
|
29
30
|
const policy = hookProfilePolicy(profile);
|
|
30
31
|
if (!policy.harness) return null;
|
|
31
32
|
const sentinelId = profileSentinelId(sessionId, profile);
|
|
33
|
+
const delivery = activeDelivery(vaultBase);
|
|
34
|
+
if (delivery) {
|
|
35
|
+
const hash = `delivery:${delivery.id}`;
|
|
36
|
+
if (readSentinel(vaultBase, 'ctx', sentinelId) === hash) return null;
|
|
37
|
+
writeSentinel(vaultBase, 'ctx', sentinelId, hash);
|
|
38
|
+
return {
|
|
39
|
+
context: `<active_delivery>Delivery ${delivery.id} ativa; capabilities: ${delivery.route.operation_risk.join(', ')}. Risco operacional autorizado sem nova change/spec.</active_delivery>`,
|
|
40
|
+
hash,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
32
43
|
const st = changeCtxState(vaultBase);
|
|
33
44
|
if (st) {
|
|
34
45
|
if (readSentinel(vaultBase, 'ctx', sentinelId) === st.hash) return null;
|
package/hooks/change-core.mjs
CHANGED
|
@@ -18,12 +18,15 @@ export function changeDirRel(slug, vaultBase) {
|
|
|
18
18
|
return join(getLocale(vaultBase).folders.changes, slug);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
export function renderChangeScaffold({ slug, sessionRel, dateStr, locale = 'pt-BR', simple = false }) {
|
|
21
|
+
export function renderChangeScaffold({ slug, sessionRel, dateStr, locale = 'pt-BR', simple = false, guide = false }) {
|
|
22
22
|
const en = locale === 'en';
|
|
23
23
|
const source = sessionRel ? `\n - "${wikilinkFromRel(sessionRel)}"` : ' []';
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
|
|
24
|
+
const compact = simple || guide;
|
|
25
|
+
const impact = compact ? 'none' : 'pending';
|
|
26
|
+
const impactReason = compact
|
|
27
|
+
? (guide
|
|
28
|
+
? (en ? 'Compact GUIDE change with no product-contract impact.' : 'Change GUIDE compacta sem impacto no contrato do produto.')
|
|
29
|
+
: (en ? 'Simple change with no product-contract impact.' : 'Mudança simples sem impacto no contrato do produto.'))
|
|
27
30
|
: '';
|
|
28
31
|
const proposta = `---
|
|
29
32
|
type: change
|
|
@@ -34,14 +37,18 @@ cssclasses:
|
|
|
34
37
|
tags:
|
|
35
38
|
- mudanca
|
|
36
39
|
source:${source}
|
|
37
|
-
spec_impact: ${impact}
|
|
40
|
+
${guide ? 'work_kind: implementation\nprofile: GUIDE\ncontract_impact: none\n' : ''}spec_impact: ${impact}
|
|
38
41
|
spec_impact_reason: ${JSON.stringify(impactReason)}
|
|
39
42
|
specs: []
|
|
40
43
|
---
|
|
41
44
|
|
|
42
45
|
# ${slug}
|
|
43
46
|
|
|
44
|
-
${
|
|
47
|
+
${guide
|
|
48
|
+
? (en
|
|
49
|
+
? '## Objective\n\n(objective)\n\n## Acceptance criteria\n\n- [ ] (acceptance criterion)\n\n## Affected areas\n\n(affected areas)'
|
|
50
|
+
: '## Objetivo\n\n(objetivo)\n\n## Critérios de aceite\n\n- [ ] (critério de aceite)\n\n## Áreas afetadas\n\n(áreas afetadas)')
|
|
51
|
+
: (en ? '## Why\n\n(reason for the change)\n\n## What changes\n\n(scope of the change)' : '## Por quê\n\n(motivo da mudança)\n\n## O que muda\n\n(escopo da mudança)')}
|
|
45
52
|
`;
|
|
46
53
|
// Hub backlink: design/tarefas link the change's proposta so no generated artifact is a
|
|
47
54
|
// graph island. Full-path (never basename — proposta/design exist in every change) so the
|
|
@@ -54,11 +61,13 @@ ${hubLink}
|
|
|
54
61
|
|
|
55
62
|
${en ? '## Approach\n\n(technical approach)' : '## Abordagem\n\n(abordagem técnica)'}
|
|
56
63
|
`;
|
|
57
|
-
const tarefas = `# ${slug} — ${en ? 'tasks' : 'tarefas'}
|
|
64
|
+
const tarefas = `# ${slug} — ${guide ? (en ? 'validation' : 'validação') : (en ? 'tasks' : 'tarefas')}
|
|
58
65
|
|
|
59
66
|
${hubLink}
|
|
60
67
|
|
|
61
|
-
|
|
68
|
+
${guide
|
|
69
|
+
? `${en ? '## Tests' : '## Testes'}\n\n- [ ] 1.1 ${en ? '(test or validation)' : '(teste ou validação)'}\n\n${en ? '## Result' : '## Resultado'}\n\n${en ? '(result)' : '(resultado)'}`
|
|
70
|
+
: `- [ ] 1.1 ${en ? '(first task)' : '(primeira tarefa)'}`}
|
|
62
71
|
`;
|
|
63
72
|
const reqHeading = en ? 'Requirement' : 'Requisito';
|
|
64
73
|
const specDelta = `## ADDED Requirements
|
|
@@ -76,11 +85,29 @@ ${en ? '(behaviour / scenarios)' : '(comportamento / cenários)'}
|
|
|
76
85
|
// proposta/design/tarefas still carry these was never actually planned — archiving it mints a
|
|
77
86
|
// bogus ADR and pollutes _arquivo (seen in production). The archive gate blocks on them.
|
|
78
87
|
const SCAFFOLD_MARKERS = [
|
|
79
|
-
['proposta.md', [
|
|
88
|
+
['proposta.md', [
|
|
89
|
+
'(motivo da mudança)', '(escopo da mudança)', '(reason for the change)', '(scope of the change)',
|
|
90
|
+
'(objetivo)', '(objective)', '(critério de aceite)', '(acceptance criterion)',
|
|
91
|
+
'(áreas afetadas)', '(affected areas)',
|
|
92
|
+
]],
|
|
80
93
|
['design.md', ['(abordagem técnica)', '(technical approach)']],
|
|
81
|
-
['tarefas.md', [
|
|
94
|
+
['tarefas.md', [
|
|
95
|
+
'(primeira tarefa)', '(first task)', '(teste ou validação)', '(test or validation)',
|
|
96
|
+
'(resultado)', '(result)',
|
|
97
|
+
]],
|
|
82
98
|
];
|
|
83
99
|
|
|
100
|
+
export function isGuideCompactChange(dir) {
|
|
101
|
+
try {
|
|
102
|
+
const proposal = readFileSync(join(dir, 'proposta.md'), 'utf8');
|
|
103
|
+
return /^profile:\s*GUIDE\s*$/mi.test(proposal)
|
|
104
|
+
&& /^contract_impact:\s*none\s*$/mi.test(proposal)
|
|
105
|
+
&& /^spec_impact:\s*none\s*$/mi.test(proposal);
|
|
106
|
+
} catch {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
84
111
|
export function scaffoldPlaceholders(dir) {
|
|
85
112
|
const found = [];
|
|
86
113
|
for (const [file, markers] of SCAFFOLD_MARKERS) {
|
|
@@ -164,12 +191,13 @@ export function assertChangeScaffoldTargetsSafe(vaultBase, slug, {
|
|
|
164
191
|
return { dir, rel: changeDirRel(slug, vaultBase) };
|
|
165
192
|
}
|
|
166
193
|
|
|
167
|
-
export function newChange(vaultBase, slug, { sessionRel = '', dateStr, simple = false }) {
|
|
194
|
+
export function newChange(vaultBase, slug, { sessionRel = '', dateStr, simple = false, guide = false }) {
|
|
195
|
+
const compact = simple || guide;
|
|
168
196
|
const loc = getLocale(vaultBase);
|
|
169
|
-
const { dir } = assertChangeScaffoldTargetsSafe(vaultBase, slug, { simple });
|
|
197
|
+
const { dir } = assertChangeScaffoldTargetsSafe(vaultBase, slug, { simple: compact });
|
|
170
198
|
const existed = existsSync(join(dir, 'proposta.md'));
|
|
171
199
|
mkdirVaultPath(vaultBase, dir, { label: 'destino da change' });
|
|
172
|
-
const files = renderChangeScaffold({ slug, sessionRel, dateStr, locale: loc.id, simple });
|
|
200
|
+
const files = renderChangeScaffold({ slug, sessionRel, dateStr, locale: loc.id, simple: compact, guide });
|
|
173
201
|
const write = (name, content) => {
|
|
174
202
|
const f = join(dir, name);
|
|
175
203
|
const checked = assertVaultPathSafe(vaultBase, f, {
|
|
@@ -186,7 +214,7 @@ export function newChange(vaultBase, slug, { sessionRel = '', dateStr, simple =
|
|
|
186
214
|
// No `specs/exemplo` placeholder: it was pure noise (always hand-deleted). When a change
|
|
187
215
|
// resolves `spec_impact: required`, the author writes `specs/<capability>/spec.md` directly
|
|
188
216
|
// — the delta format lives in the wk-workflow skill (and `renderChangeScaffold().specDelta`).
|
|
189
|
-
if (!
|
|
217
|
+
if (!compact) {
|
|
190
218
|
write('design.md', files.design);
|
|
191
219
|
}
|
|
192
220
|
if (!existed) captureSpecBaseline(vaultBase, dir);
|
|
@@ -512,6 +540,7 @@ export function archiveChange(vaultBase, slug, { gate = gateGreen, dateStr, adrN
|
|
|
512
540
|
const loc = getLocale(vaultBase);
|
|
513
541
|
const chDir = loc.folders.changes;
|
|
514
542
|
const src = join(vaultBase, chDir, slug);
|
|
543
|
+
const createAdr = !isGuideCompactChange(src);
|
|
515
544
|
const verdict = gate(src);
|
|
516
545
|
if (!verdict.ok) return { ok: false, failing: verdict.failing || [] };
|
|
517
546
|
|
|
@@ -524,14 +553,17 @@ export function archiveChange(vaultBase, slug, { gate = gateGreen, dateStr, adrN
|
|
|
524
553
|
const adrRel = join(adrDirRel, `ADR-${num}-${slug}.md`);
|
|
525
554
|
|
|
526
555
|
// Validate every later mutation target before spec promotion can change living state.
|
|
527
|
-
const
|
|
556
|
+
const mutationTargets = [
|
|
528
557
|
{ path: src, allowMissing: false, expectedType: 'directory', label: 'change a arquivar' },
|
|
529
558
|
{ path: destAbs, expectedType: 'directory', label: 'destino da change arquivada' },
|
|
530
559
|
{ path: archiveRoot, expectedType: 'directory', label: 'raiz de changes arquivadas' },
|
|
531
|
-
{ path: join(vaultBase, adrDirRel), expectedType: 'directory', label: 'pasta mensal de ADR' },
|
|
532
|
-
{ path: join(vaultBase, adrRel), expectedType: 'file', label: 'ADR da change arquivada' },
|
|
533
560
|
{ path: join(vaultBase, POINTER), expectedType: 'file', label: 'ponteiro CURRENT_CHANGE.md' },
|
|
534
|
-
|
|
561
|
+
...(createAdr ? [
|
|
562
|
+
{ path: join(vaultBase, adrDirRel), expectedType: 'directory', label: 'pasta mensal de ADR' },
|
|
563
|
+
{ path: join(vaultBase, adrRel), expectedType: 'file', label: 'ADR da change arquivada' },
|
|
564
|
+
] : []),
|
|
565
|
+
];
|
|
566
|
+
const [checkedSource, checkedDestination] = assertVaultPathsSafe(vaultBase, mutationTargets);
|
|
535
567
|
assertVaultPathsSafe(vaultBase, [
|
|
536
568
|
{ path: join(checkedSource.target, 'proposta.md'), expectedType: 'file', label: 'proposta da change' },
|
|
537
569
|
{ path: join(checkedSource.target, 'tarefas.md'), expectedType: 'file', label: 'tarefas da change' },
|
|
@@ -597,7 +629,7 @@ export function archiveChange(vaultBase, slug, { gate = gateGreen, dateStr, adrN
|
|
|
597
629
|
|
|
598
630
|
// ADR goes in the same dated month folder as session-derived decisions (04-Decisões/ano/MM-MMM/)
|
|
599
631
|
// — not the year root — so all ADRs sit together in the vault's convention.
|
|
600
|
-
mkdirVaultPath(vaultBase, join(vaultBase, adrDirRel), { label: 'pasta mensal de ADR' });
|
|
632
|
+
if (createAdr) mkdirVaultPath(vaultBase, join(vaultBase, adrDirRel), { label: 'pasta mensal de ADR' });
|
|
601
633
|
const capLine = promoted.length
|
|
602
634
|
? `\n\nCapabilities: ${promoted.map((c) => wikilinkFromRel(join(loc.folders.specs, c))).join(', ')}.`
|
|
603
635
|
: '';
|
|
@@ -605,7 +637,7 @@ export function archiveChange(vaultBase, slug, { gate = gateGreen, dateStr, adrN
|
|
|
605
637
|
// Rastro auditável (0.31.0): um archive forçado ou sem prova declarada fica marcado no ADR.
|
|
606
638
|
const flagLines = `${adrFlags.forced ? '\nforced: true' : ''}${adrFlags.trivial ? '\ntrivial: true' : ''}`;
|
|
607
639
|
const forcedNote = adrFlags.forced ? '\n\n> ⚠️ Arquivada com --force — havia tarefa(s) aberta(s) pulada(s) no gate.' : '';
|
|
608
|
-
writeVaultFileSync(vaultBase, join(vaultBase, adrRel), `---
|
|
640
|
+
if (createAdr) writeVaultFileSync(vaultBase, join(vaultBase, adrRel), `---
|
|
609
641
|
type: decision
|
|
610
642
|
status: accepted
|
|
611
643
|
date: ${dateStr}${flagLines}
|
|
@@ -625,7 +657,7 @@ Mudança ${changeWikilink} concluída e arquivada.${capLine}${reqLine}${forcedNo
|
|
|
625
657
|
// Only clear the pointer when the archived change IS the active one — archiving some other
|
|
626
658
|
// slug explicitly must not blank the pointer of a different, still-active change.
|
|
627
659
|
if (activeChange(vaultBase) === slug) clearActiveChange(vaultBase);
|
|
628
|
-
return { ok: true, failing: [], archivedRel: destRel, adrRel, promoted, specWarnings, linksRewritten };
|
|
660
|
+
return { ok: true, failing: [], archivedRel: destRel, adrRel: createAdr ? adrRel : '', promoted, specWarnings, linksRewritten };
|
|
629
661
|
}
|
|
630
662
|
|
|
631
663
|
// --- reescrita de wikilinks pós-move (0.35.0) ----------------------------------
|
package/hooks/change-warn.mjs
CHANGED
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
profileSentinelId,
|
|
13
13
|
resolveHookOperatingProfile,
|
|
14
14
|
} from './operating-profile-runtime.mjs';
|
|
15
|
+
import { activeDelivery } from '../src/delivery.mjs';
|
|
15
16
|
|
|
16
17
|
const CODE_EXT = /\.(ts|tsx|js|jsx|mjs|cjs|py|prisma|sql|go|rs|java|cs)$/i;
|
|
17
18
|
|
|
@@ -32,6 +33,7 @@ export function warnDecision(filePath, {
|
|
|
32
33
|
if (!policy.requiresChange) return null;
|
|
33
34
|
if (!filePath || !isCodeFile(filePath)) return null;
|
|
34
35
|
if (activeChange(vaultBase)) return null;
|
|
36
|
+
if (activeDelivery(vaultBase)) return null;
|
|
35
37
|
const abs = norm(isAbsolute(filePath) ? filePath : resolve(cwd, filePath));
|
|
36
38
|
// Dentro do vault (NTFS é case-insensitive) ou em dirs de config de agente: não é código do projeto.
|
|
37
39
|
if (abs.toLowerCase().startsWith(`${norm(resolve(vaultBase)).toLowerCase()}/`)) return null;
|
package/hooks/harness-doctor.mjs
CHANGED
|
@@ -102,6 +102,8 @@ export function checkHarness(vaultBase, projectRoot) {
|
|
|
102
102
|
const CHANGES_DIR = loc.folders.changes;
|
|
103
103
|
const errors = [];
|
|
104
104
|
const warnings = [];
|
|
105
|
+
const attention = [];
|
|
106
|
+
const repairable = [];
|
|
105
107
|
|
|
106
108
|
// 1. wendkeep.sensors.json well-formed.
|
|
107
109
|
const sensorsPath = join(projectRoot, 'wendkeep.sensors.json');
|
|
@@ -114,7 +116,7 @@ export function checkHarness(vaultBase, projectRoot) {
|
|
|
114
116
|
}
|
|
115
117
|
|
|
116
118
|
const specState = checkSpecsState(vaultBase);
|
|
117
|
-
if (specState.missing)
|
|
119
|
+
if (specState.missing) repairable.push('SPECS_STATE ausente — rode `wendkeep spec migrate`; 07-Specs deve ser gerado/read-only');
|
|
118
120
|
else if (!specState.ok) errors.push(`07-Specs alterado fora do WendKeep: ${specState.changed.join(', ')} — mova a alteração para 08-Mudanças/<change>/specs`);
|
|
119
121
|
|
|
120
122
|
// 2/3. Changes: malformed dirs; the active change's deltas add to knownReqs.
|
|
@@ -127,12 +129,18 @@ export function checkHarness(vaultBase, projectRoot) {
|
|
|
127
129
|
try { entries = readdirSync(dir); } catch { continue; } // a file, not a change dir
|
|
128
130
|
if (!entries.includes('proposta.md')) { errors.push(`change sem proposta.md: ${name}`); continue; }
|
|
129
131
|
const impact = validateSpecImpact(dir);
|
|
130
|
-
|
|
131
|
-
|
|
132
|
+
for (const error of impact.errors) {
|
|
133
|
+
const rendered = `${name}: ${error}`;
|
|
134
|
+
if (/spec_impact pending/i.test(error)) attention.push(rendered);
|
|
135
|
+
else errors.push(rendered);
|
|
136
|
+
}
|
|
137
|
+
attention.push(...impact.warnings.map((w) => `${name}: ${w}`));
|
|
132
138
|
let tasks = [];
|
|
133
139
|
let tarefasMd = '';
|
|
134
140
|
try { tarefasMd = readFileSync(join(dir, 'tarefas.md'), 'utf8'); tasks = parseTasks(tarefasMd); } catch { /* sem tarefas */ }
|
|
135
141
|
const reqIds = [...new Set(tasks.flatMap((t) => t.reqs ?? []))];
|
|
142
|
+
const openTasks = tasks.filter((task) => !task.done);
|
|
143
|
+
if (openTasks.length) attention.push(`${name}: ${openTasks.length} tarefa(s) aberta(s)`);
|
|
136
144
|
const effective = buildEffectiveRequirementPackage(vaultBase, dir, reqIds);
|
|
137
145
|
errors.push(...effective.errors.map((e) => `${name}: spec efetiva inválida: ${e}`));
|
|
138
146
|
if (effective.missing.length) errors.push(`req órfão em ${name}: ${effective.missing.map((id) => `[req:${id}]`).join(', ')} não existe na spec efetiva`);
|
|
@@ -140,7 +148,7 @@ export function checkHarness(vaultBase, projectRoot) {
|
|
|
140
148
|
try { verdict = JSON.parse(readFileSync(join(dir, 'verdict.json'), 'utf8')); } catch { /* sem verdict */ }
|
|
141
149
|
if (verdict && reqIds.length) {
|
|
142
150
|
const v = evaluateVerdict(verdict, reqIds, { tasksHash: tasksHashOf(tarefasMd), effectiveSpecHash: effective.hash });
|
|
143
|
-
if (!v.ok)
|
|
151
|
+
if (!v.ok) attention.push(`verdict stale/incompleto em ${name}${v.missing.length ? `: falta cobrir ${v.missing.join(', ')}` : ''}`);
|
|
144
152
|
}
|
|
145
153
|
}
|
|
146
154
|
|
|
@@ -152,7 +160,7 @@ export function checkHarness(vaultBase, projectRoot) {
|
|
|
152
160
|
}
|
|
153
161
|
}
|
|
154
162
|
|
|
155
|
-
return { errors, warnings };
|
|
163
|
+
return { errors, warnings, attention, repairable };
|
|
156
164
|
}
|
|
157
165
|
|
|
158
166
|
// --- diagnóstico de links do grafo (read-only, reusa os reparos em dry-run) -----
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// understand-inject — SessionStart hook (agent-agnostic, run via `npx wendkeep hook
|
|
2
|
+
// understand-inject — SessionStart hook (agent-agnostic, run via `npx --no-install wendkeep hook
|
|
3
3
|
// understand-inject`). If the Understand-Anything domain graph has been generated
|
|
4
4
|
// (`.understand-anything/knowledge-graph.json` at the project root), inject a cheap
|
|
5
5
|
// slice of it into the session; otherwise stay silent. Never breaks the session.
|
package/hooks/vault-health.mjs
CHANGED
|
@@ -504,7 +504,7 @@ export function checkMemoryBundle(vaultBase, { registry } = {}) {
|
|
|
504
504
|
? '1 conflito ativo'
|
|
505
505
|
: `${activeConflicts.length} conflitos ativos`;
|
|
506
506
|
const purposes = groupConflictPurposes(activeConflicts).join('; ');
|
|
507
|
-
|
|
507
|
+
warnings.push(`${label} (${purposes}). Existem versões concorrentes e nenhum dado foi escolhido automaticamente. Conflito semântico degrada somente as chaves afetadas e exige curadoria humana; memory repair não escolhe vencedor. Próximo passo: ${memoryCurateCommand(vaultBase)}. Inventário avançado: ${memoryCandidatesCommand(vaultBase)}.`);
|
|
508
508
|
}
|
|
509
509
|
if (outbox.count) warnings.push(`${outbox.count} evento(s) pendente(s) na outbox; execute o projector quando seguro.`);
|
|
510
510
|
if (ordinaryCandidates.length) warnings.push(`${ordinaryCandidates.length} candidate(s) aguardando curadoria humana.`);
|
|
@@ -514,7 +514,7 @@ export function checkMemoryBundle(vaultBase, { registry } = {}) {
|
|
|
514
514
|
const semantic = bundle.semantic || {};
|
|
515
515
|
return {
|
|
516
516
|
ok,
|
|
517
|
-
status: ok ? (warnings.length ? 'warning' : 'healthy') : 'blocked',
|
|
517
|
+
status: ok ? (activeConflicts.length ? 'degraded' : warnings.length ? 'warning' : 'healthy') : 'blocked',
|
|
518
518
|
failures,
|
|
519
519
|
warnings,
|
|
520
520
|
metrics: {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wendkeep",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.73.0",
|
|
4
4
|
"description": "Vault-first persistent memory for AI coding agents, with an optional profile-aware governance runtime: OFF, FLOW, GUIDE, GOVERN, or ASSURE. Local-first and agent-agnostic (Claude Code, Codex, Cursor…).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"workspaces": [
|
|
@@ -41,10 +41,12 @@
|
|
|
41
41
|
"node": ">=18"
|
|
42
42
|
},
|
|
43
43
|
"scripts": {
|
|
44
|
-
"check": "node --check scripts/release.mjs && node --check scripts/release-plan.mjs && node --check bin/wendkeep.mjs && node --check packages/cli/src/index.mjs && node --check src/init.mjs && node --check src/doctor.mjs && node --check src/project-vault.mjs && node --check src/observer-snapshot.mjs && node --check src/observer-store.mjs && node --check src/observer-memory.mjs && node --check src/observer-memory-publish.mjs && node --check src/observer-sql-store.mjs && node --check src/observer-sql-migrate.mjs && node --check src/observer-sql-publish.mjs && node --check src/observer-transcript-store.mjs && node --check src/observer-server.mjs && node --check src/observer.mjs && node --check src/observer-publish.mjs && node --check src/operating-profile.mjs && node --check src/profile.mjs && node --check src/flow.mjs && node --check web/observer/app.mjs && node --check hooks/observer-publish.mjs && node --check hooks/operating-profile-runtime.mjs && node --check hooks/operating-profile-task-store.mjs && node --check hooks/flow-core.mjs && node --check hooks/flow-protected-policy.mjs && node --check hooks/git-snapshot.mjs && node --check hooks/vault-path-safety.mjs && node --check hooks/vault-runtime-store.mjs && node --check packages/harness/src/index.mjs && node --check packages/harness/src/flow-store.mjs && node --check packages/harness/src/operating-profile.mjs && node --check packages/harness/src/sensors-core.mjs && node --check packages/integrations/src/host-hooks.mjs && node --check packages/integrations/src/hook-envelope.mjs && node --check packages/integrations/src/prompt-content.mjs && node --check packages/integrations/src/transcript-usage.mjs && node --check packages/integrations/src/transcripts.mjs && node --check packages/integrations/src/session-identity.mjs && node --check packages/integrations/src/index.mjs && node --check packages/mcp/src/config.mjs && node --check packages/mcp/src/index.mjs && node --check packages/vault/src/index.mjs && node --check packages/vault/src/project-vault.mjs && node --check packages/vault/src/vault-path-safety.mjs && node --check packages/vault/src/locale.mjs && node --check packages/vault/src/memory-schema.mjs && node --check packages/vault/src/memory-mode.mjs && node --check packages/vault/src/memory-handoff.mjs && node --check packages/vault/src/memory-store.mjs && node --check packages/vault/src/validate-core.mjs && node --check packages/vault/src/validate-memory.mjs",
|
|
44
|
+
"check": "node --check scripts/release.mjs && node --check scripts/release-plan.mjs && node --check scripts/release-provenance.mjs && node --check scripts/run-scope.mjs && node --check src/release-provenance.mjs && node --check bin/wendkeep.mjs && node --check packages/cli/src/index.mjs && node --check src/init.mjs && node --check src/doctor.mjs && node --check src/project-vault.mjs && node --check src/observer-auth.mjs && node --check src/observer-privacy.mjs && node --check src/observer-snapshot.mjs && node --check src/observer-store.mjs && node --check src/observer-memory.mjs && node --check src/observer-memory-publish.mjs && node --check src/observer-sql-store.mjs && node --check src/observer-sql-migrate.mjs && node --check src/observer-sql-publish.mjs && node --check src/observer-transcript-store.mjs && node --check src/observer-server.mjs && node --check src/observer.mjs && node --check src/observer-publish.mjs && node --check src/operating-profile.mjs && node --check src/profile.mjs && node --check src/flow.mjs && node --check src/work-kind.mjs && node --check src/delivery.mjs && node --check web/observer/app.mjs && node --check hooks/observer-publish.mjs && node --check hooks/operating-profile-runtime.mjs && node --check hooks/operating-profile-task-store.mjs && node --check hooks/flow-core.mjs && node --check hooks/flow-protected-policy.mjs && node --check hooks/git-snapshot.mjs && node --check hooks/vault-path-safety.mjs && node --check hooks/vault-runtime-store.mjs && node --check packages/harness/src/index.mjs && node --check packages/harness/src/flow-store.mjs && node --check packages/harness/src/operating-profile.mjs && node --check packages/harness/src/sensors-core.mjs && node --check packages/integrations/src/host-hooks.mjs && node --check packages/integrations/src/hook-envelope.mjs && node --check packages/integrations/src/prompt-content.mjs && node --check packages/integrations/src/transcript-usage.mjs && node --check packages/integrations/src/transcripts.mjs && node --check packages/integrations/src/session-identity.mjs && node --check packages/integrations/src/index.mjs && node --check packages/mcp/src/config.mjs && node --check packages/mcp/src/index.mjs && node --check packages/vault/src/index.mjs && node --check packages/vault/src/project-vault.mjs && node --check packages/vault/src/vault-path-safety.mjs && node --check packages/vault/src/locale.mjs && node --check packages/vault/src/memory-schema.mjs && node --check packages/vault/src/memory-mode.mjs && node --check packages/vault/src/memory-handoff.mjs && node --check packages/vault/src/memory-store.mjs && node --check packages/vault/src/validate-core.mjs && node --check packages/vault/src/validate-memory.mjs",
|
|
45
45
|
"test": "node --test --test-concurrency=2",
|
|
46
|
+
"test:core": "node scripts/run-scope.mjs core",
|
|
46
47
|
"release": "node scripts/release.mjs",
|
|
47
48
|
"release:dry": "node scripts/release.mjs --dry-run",
|
|
49
|
+
"release:provenance": "node scripts/release-provenance.mjs",
|
|
48
50
|
"prepack": "node scripts/readme-pack.mjs pre",
|
|
49
51
|
"postpack": "node scripts/readme-pack.mjs post"
|
|
50
52
|
},
|
|
@@ -70,7 +72,6 @@
|
|
|
70
72
|
"url": "https://github.com/rogersialves/wendkeep/issues"
|
|
71
73
|
},
|
|
72
74
|
"devDependencies": {
|
|
73
|
-
"acorn": "^8.18.0"
|
|
74
|
-
"wendkeep": "^0.69.0"
|
|
75
|
+
"acorn": "^8.18.0"
|
|
75
76
|
}
|
|
76
77
|
}
|