wendkeep 0.44.0 → 0.45.1
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 +44 -0
- package/README.md +39 -37
- package/README.pt-BR.md +105 -30
- package/hooks/token-usage.mjs +18 -4
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,50 @@ All notable changes to **wendkeep** are documented here. Format based on
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this project follows
|
|
5
5
|
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [0.45.1] — 2026-07-18
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Documentação: 31 inconsistências entre os READMEs e o comportamento real do pacote,
|
|
12
|
+
encontradas auditando o texto contra o tarball publicado da 0.45.0. Nenhuma mudança de
|
|
13
|
+
código — `src/`, `hooks/`, `bin/` e `schema/` são idênticos aos da 0.45.0. Este release
|
|
14
|
+
existe porque o README viaja dentro do tarball: a correção só chega à página do npm e a
|
|
15
|
+
quem instala o pacote com uma nova publicação.
|
|
16
|
+
- Duas afirmações levavam o usuário a um resultado diferente do prometido: o README dizia
|
|
17
|
+
que `context-mode` vinha pré-marcado no picker de companions e que `init --yes` o
|
|
18
|
+
instalava (todo companion é `default: false` desde a 0.24.0, e `--yes` instala zero), e
|
|
19
|
+
as seções de requisitos/init sugeriam captura de sessões Codex automática após o `init`,
|
|
20
|
+
contradizendo o próprio Notes & roadmap (o `init` só wira `.claude/settings.json`).
|
|
21
|
+
- Tabela de Comandos reescrita a partir do `--help` do binário: faltavam `stats` (usado na
|
|
22
|
+
própria introdução do README), `dashboard`, `change use|continue|abandon|relink`,
|
|
23
|
+
`cost --top|--trend|--write`, `import --stamp-ids|--rescan-decisions`, `verify --change`,
|
|
24
|
+
`spec rebase --accept-current`, `sensors add --name|--description` e `sync-defs --reseed`.
|
|
25
|
+
Três linhas da tabela em inglês tinham ficado em português.
|
|
26
|
+
- Correções factuais: `--force` dispensa só a checagem de tarefa aberta (G1), não o gate
|
|
27
|
+
inteiro; `verdict.json` é exigido sempre desde a 0.31.0 (uma change sem `[req:]` destrava
|
|
28
|
+
com o verdict trivial do `verify --deep`, não pulando a etapa); `change new` não scaffolda
|
|
29
|
+
mais `specs/` e `--simple` pula o `design.md`; os sensores semeados são uma allow-list
|
|
30
|
+
fixa mais `memory-validation`; `detectProvider()` não conhece Copilot; `context-mode` é
|
|
31
|
+
plugin do Claude Code, sem entrada em `.mcp.json`; `brain-inject` roda em
|
|
32
|
+
`startup|clear|compact`; as skills vão para `.claude/skills` e `.agents/skills`;
|
|
33
|
+
`dotcontext` é `hidden`; `docs/` não vai no tarball; e uma tarefa carrega um só
|
|
34
|
+
`[sensor:]` (`[req:]` é que aceita vários).
|
|
35
|
+
- `README.pt-BR.md`: a tabela de comandos estava partida ao meio por um parágrafo, fazendo
|
|
36
|
+
oito linhas renderizarem como texto cru no npm e no GitHub. Reparada e sincronizada com o
|
|
37
|
+
inglês — os dois arquivos fecham com os mesmos 20 comandos e 42 flags.
|
|
38
|
+
|
|
39
|
+
## [0.45.0] — 2026-07-18
|
|
40
|
+
|
|
41
|
+
### Fixed
|
|
42
|
+
|
|
43
|
+
- Observabilidade: o note de sessão deixa de ser reescrito com timestamp novo a cada Stop
|
|
44
|
+
quando o uso não muda. A preservação de `atualizado_em` (`token-usage.mjs`) comparava
|
|
45
|
+
`previous` (parseado do note) com `current` (recém-computado) via `JSON.stringify` —
|
|
46
|
+
sensível à ordem das chaves, que difere entre parse e build, então a comparação **sempre**
|
|
47
|
+
falhava e o timestamp era re-stampado toda vez. Novo `sameUsageData(a, b)` compara os campos
|
|
48
|
+
de uso de forma ordem-insensível (ignorando `atualizado_em`). Corrige o churn de reescrita e
|
|
49
|
+
o teste flaky "same sources produce byte-identical markdown".
|
|
50
|
+
|
|
7
51
|
## [0.44.0] — 2026-07-17
|
|
8
52
|
|
|
9
53
|
### Changed
|
package/README.md
CHANGED
|
@@ -13,14 +13,14 @@
|
|
|
13
13
|
|
|
14
14
|
**In the graph:** 🔵 session · 🟣 decision · 🔴 bug · 🟢 learning · 🟡 change — every note, backlinked.
|
|
15
15
|
|
|
16
|
-
**A persistent‑memory harness for AI coding agents, built on your Obsidian vault.** Every Claude Code
|
|
16
|
+
**A persistent‑memory harness for AI coding agents, built on your Obsidian vault.** Every Claude Code session is captured turn‑by‑turn into local Markdown — and Codex sessions too, once its hooks are wired (`init` wires Claude Code automatically; `import` backfills Codex either way) — with token/cost tracking, auto‑extracted decisions, bugs and learnings, and a curated memory layer injected back at the start of the next session. On top of that memory core sits a native, zero‑dependency **change lifecycle** (spec → change → TDD → sensor‑gated archive) that keeps intent, work and proof wikilinked in one graph. 100% local, open‑core.
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
19
|
npm i -D wendkeep && npx wendkeep init # captures from the next session on
|
|
20
20
|
npx wendkeep import # backfill past Claude + Codex sessions
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
**▶ Interactive demo:** [`docs/index.html`](docs/index.html) — a self-contained page with the live knowledge‑graph hero.
|
|
23
|
+
**▶ Interactive demo:** [`docs/index.html`](docs/index.html) — a self-contained page with the live knowledge‑graph hero. It lives in the [GitHub repo](https://github.com/rogersialves/wendkeep/tree/main/docs) (the npm tarball ships only the runtime), so clone or download `docs/` to open it locally or serve it on any static host. The image above is a static render of it.
|
|
24
24
|
|
|
25
25
|
> **From one real production vault** (`npx wendkeep stats`): **308** sessions · **1,696** prompts · **$4,836** captured across **46 active days** (Jan–Jul 2026) · **15** models — every one a note in the graph.
|
|
26
26
|
|
|
@@ -38,15 +38,15 @@ Decisions, dead ends, the reason you chose X over Y — gone next session. The p
|
|
|
38
38
|
|---|---|
|
|
39
39
|
| **Capture** — every turn, on disk | `SessionStart` / `Stop` hooks write each session to a dated Markdown note: prompts, iterations, files touched, wikilinks. |
|
|
40
40
|
| **Derive** — decisions, bugs, learnings | Pulled from the transcript into their own notes, backlinked to the session. Your history becomes navigable, not archival. |
|
|
41
|
-
| **Recall** — injected back | A budget‑capped `CORE` + `DIGEST` and
|
|
41
|
+
| **Recall** — injected back | A budget‑capped `CORE` + `DIGEST` and every open change are fed to the agent at the next `SessionStart`. It resumes where it left off. |
|
|
42
42
|
| **Cost** — what it all cost | Per‑model, cache‑aware token pricing per session — plus `cost --trend` with a run‑rate projection across the whole vault. |
|
|
43
|
-
| **Multi‑agent** — one
|
|
43
|
+
| **Multi‑agent** — one vault, both agents | Tags every note with the agent that wrote it: Claude Code is detected from its environment, anything else is recorded as Codex. One shared graph, whichever agent you are in. |
|
|
44
44
|
| **Local‑first** — no cloud, no account | Everything is plain Markdown on your disk. An optional MCP server (`@bitbonsai/mcpvault`) lets the agent read/write the vault. |
|
|
45
45
|
|
|
46
46
|
## Requirements
|
|
47
47
|
|
|
48
48
|
- Node.js ≥ 18
|
|
49
|
-
- An AI coding agent with hooks
|
|
49
|
+
- An AI coding agent with hooks. `init` wires **Claude Code** automatically; the same hook scripts handle Codex transcripts, but wiring them into Codex is manual today (see [Notes & roadmap](#notes--roadmap))
|
|
50
50
|
- Obsidian (to view the graph) — optional but the point
|
|
51
51
|
|
|
52
52
|
## Install & set up
|
|
@@ -60,22 +60,22 @@ npx wendkeep init
|
|
|
60
60
|
`wendkeep init` is interactive and **idempotent**. It will:
|
|
61
61
|
|
|
62
62
|
1. Create the vault folder taxonomy and a templated `README.md` (default vault: `<project>/.<project-name>-vault`, e.g. `.MyApp-vault`; override with `--vault`).
|
|
63
|
-
2. Write a provider-neutral **`.wendkeep.json`** binding at the project root and a matching `.brain/PROJECT.json` marker in the vault.
|
|
63
|
+
2. Write a provider-neutral **`.wendkeep.json`** binding at the project root and a matching `.brain/PROJECT.json` marker in the vault, then merge the session hooks into **`.claude/settings.json`**. The binding is provider-neutral by design: any agent resolves the same vault from its session `cwd`, with no machine-global environment variable. (Only Claude Code gets its hooks wired automatically — Codex hook wiring is manual.) Existing `.claude/settings.json` registrations are adopted automatically.
|
|
64
64
|
3. Add the **`wendkeep-vault`** MCP server to `.mcp.json` so the agent can read/write the vault. Skip with `--no-mcp` — e.g. when the agent already has a vault MCP. (`--no-mcp` skips *only wendkeep's own* MCP; companion MCPs still follow `--companions`.)
|
|
65
|
-
4. Offer to pin **companion** plugins/MCP (multi-choice;
|
|
66
|
-
- **`context-mode`** — context optimizer + FTS5 memory, as a `.mcp.json`
|
|
65
|
+
4. Offer to pin **companion** plugins/MCP (multi-choice; **none** pre-checked — wendkeep is a neutral harness and presumes no third-party plugin). Each is wired the most agent-agnostic way it supports:
|
|
66
|
+
- **`context-mode`** — context optimizer + FTS5 memory, wired as a Claude Code plugin. It ships its own MCP server, so wendkeep deliberately adds no `.mcp.json` entry (registering both cold-started two servers at once). On non-Claude agents, add the MCP by hand: `npx -y context-mode`.
|
|
67
67
|
- **`understand-anything`** — project domain graph, via a `understand-inject` SessionStart hook that injects the graph when generated.
|
|
68
68
|
- **`caveman`** — token-compression mode; runs its own cross-agent installer on non-Claude agents.
|
|
69
|
-
- **`dotcontext`** — *legacy, not recommended.* wendkeep's native a2 loop (`change` / `verify` / gate) already does its job, so installing it **duplicates the harness**.
|
|
69
|
+
- **`dotcontext`** — *legacy, not recommended, and hidden from the picker.* wendkeep's native a2 loop (`change` / `verify` / gate) already does its job, so installing it **duplicates the harness**. Reachable only via an explicit `--companions dotcontext` for anyone already invested (tune with `--dotcontext-mcp` / `--dotcontext-hooks`).
|
|
70
70
|
|
|
71
71
|
Control with `--companions <csv>` or `--no-companions`. The Claude Code plugin layer (`extraKnownMarketplaces` + `enabledPlugins`) is wired as a bonus where the companion has one.
|
|
72
72
|
5. Install a **color system** into the vault's `.obsidian/`: a CSS snippet that accents notes by type (session/decision/bug/learning, via the `cssclasses` the hooks emit) plus graph color groups by folder. Non-destructive merge into `appearance.json`/`graph.json`; skip with `--no-colors`.
|
|
73
73
|
6. Seed the **curated memory layer**: `.brain/CORE.md` (the hand-curated hot layer, with the 3 required sections) and `.brain/COMPACTION_PROTOCOL.md` (the protocol guide). The auto layers (`DIGEST.md`, `index.jsonl`) are generated by the hooks. Validate the curated layer with `wendkeep validate-memory` (cap 25 lines, 3 sections, no secrets/PII).
|
|
74
|
-
7. Seed the **definitions + skills layer**: `.brain/agents/` + `.brain/skills/` (versioned source of truth), including the native process skills `wk-workflow` / `wk-tdd` / `wk-debugging` / `wk-brainstorming` / `wk-planning` / `wk-verify`. `init` delivers
|
|
75
|
-
8. Seed the **change/spec lifecycle**: the `07-Specs/` + `08-Mudanças/` folders and a native `wendkeep.sensors.json`
|
|
74
|
+
7. Seed the **definitions + skills layer**: `.brain/agents/` + `.brain/skills/` (versioned source of truth), including the native process skills `wk-workflow` / `wk-tdd` / `wk-debugging` / `wk-brainstorming` / `wk-planning` / `wk-verify`. `init` delivers the skills to `.claude/skills/` and `.agents/skills/`, and the agent definitions (`.brain/agents/*.toml`) to `.codex/agents/`, plus a managed section in `AGENTS.md` that indexes the skills for Codex; `sync-defs --check` detects stale copies.
|
|
75
|
+
8. Seed the **change/spec lifecycle**: the `07-Specs/` + `08-Mudanças/` folders and a native `wendkeep.sensors.json` — a critical `memory-validation` sensor (`npx wendkeep validate-memory`) plus one for each of `typecheck` / `test` / `lint` / `build` found in your `package.json`. Add your own with `wendkeep sensors add`. Drives `wendkeep change` / `wendkeep verify` — see **Change lifecycle** below.
|
|
76
76
|
|
|
77
77
|
```bash
|
|
78
|
-
npx wendkeep init --vault "~/vaults/work" --project . --yes # non-interactive (
|
|
78
|
+
npx wendkeep init --vault "~/vaults/work" --project . --yes # non-interactive (no companions unless you ask)
|
|
79
79
|
npx wendkeep init --companions "context-mode,understand-anything" --yes
|
|
80
80
|
npx wendkeep init --no-companions --no-mcp --yes # zero companions, no wendkeep MCP
|
|
81
81
|
```
|
|
@@ -129,21 +129,22 @@ Restart Codex and Claude Code after reseeding their generated skills.
|
|
|
129
129
|
|---|---|
|
|
130
130
|
| `wendkeep init` | Set up wendkeep in a project (vault taxonomy + settings + MCP + skills). |
|
|
131
131
|
| `wendkeep hook <name>` | Run a session hook; invoked by `settings.json` (reads agent JSON on stdin). |
|
|
132
|
-
| `wendkeep change <sub>` | Change lifecycle: `new [--simple]` / `list` (global backlog) / `show
|
|
133
|
-
| `wendkeep verify [--deep]` | Run the change's task sensors; `--deep` assembles the independent-verification package. |
|
|
134
|
-
| `wendkeep spec <sub>` | `list` / `show
|
|
135
|
-
| `wendkeep sensors <sub>` | `list` / `add <id> "<command>"` — view/edit `wendkeep.sensors.json` (JSON Schema shipped). |
|
|
136
|
-
| `wendkeep cost [
|
|
137
|
-
| `wendkeep
|
|
138
|
-
| `wendkeep
|
|
139
|
-
| `wendkeep
|
|
140
|
-
| `wendkeep
|
|
132
|
+
| `wendkeep change <sub>` | Change lifecycle: `new <slug> [--simple]` / `use <slug>` (switch focus) / `continue <archived> <new>` / `bind <slug> --session <id>` / `list` (global backlog) / `show <slug>` / `status [slug]` / `done <id> [--change slug]` / `undone <id> [--change slug]` / `relink [--apply] [--json]` (repair change wikilinks; preview by default) / `diff [slug]` / `archive [slug] [--force]` / `abandon [slug]` (drop it, no ADR). `diff`, `archive` and `abandon` fall back to the active change when you omit the slug; bare `status` lists every open one. |
|
|
133
|
+
| `wendkeep verify [--deep] [--change s]` | Run the change's task sensors; `--deep` assembles the independent-verification package. `--change` targets a change other than the active one. |
|
|
134
|
+
| `wendkeep spec <sub>` | `list` / `show <capability>` generated contracts; `effective [--change <slug>] [--json]` (living contract + delta; defaults to the active change); `migrate`; `rebase [--accept-current]` (stops on conflicts unless you accept the living spec's side). |
|
|
135
|
+
| `wendkeep sensors <sub>` | `list` / `add <id> "<command>"` with `--severity` / `--type` / `--report` / `--name` / `--description` — view/edit `wendkeep.sensors.json` (JSON Schema shipped). |
|
|
136
|
+
| `wendkeep cost [opts]` | Aggregate AI-coding spend across the vault's sessions — total, by model, by day. `--since <date>` / `--top [N]` (priciest) / `--trend [day\|week\|month]` (+ run-rate projection) / `--write` (generate `00-Custo.md`) / `--json`. |
|
|
137
|
+
| `wendkeep cost rebuild [opts]` | Recalculate historical parent + subagent costs from `SESSION_REGISTRY`. Dry-run by default; `--apply` updates the notes and writes `.brain/COST_REBUILD.json`. Also `--session <id\|file>` / `--limit n` / `--json`. |
|
|
138
|
+
| `wendkeep stats [--vault P]` | One shareable line: sessions · prompts · spend · span · models (`--json`). |
|
|
139
|
+
| `wendkeep import [opts]` | **Retroactive memory** — backfill past **Claude + Codex** sessions into the vault (deduped by `session_id`). `--source all\|claude\|codex` / `--stamp-ids` / `--rescan-decisions` / `--from <dir>` / `--codex-from <dir>` / `--since d` / `--limit n` / `--dry-run` / `--json`. |
|
|
140
|
+
| `wendkeep session list\|show\|use` | List the multi-session registry, show one conversation, or move only the human focus in `CURRENT_SESSION.md`. |
|
|
141
|
+
| `wendkeep dashboard [--force]` | (Re)generate the vault's folder-filtered Bases + the `00-Dashboard` MOC. |
|
|
141
142
|
| `wendkeep note new --type bug\|learning "<title>"` | Create a **numbered** derived note (`BUG-`/`APR-NNNN`) in the month folder and print its vault path. `--date YYYY-MM-DD`. |
|
|
142
143
|
| `wendkeep renumber-decisions` | Renumber `04-Decisões` to `ADR-NNNN-<slug>` chronologically, move notes out of legacy `DIA N` subfolders into the month folder, and rewrite wikilinks. Preview by default; `--apply` / `--json`. |
|
|
143
144
|
| `wendkeep renumber-bugs` | Same for `05-Bugs` → `BUG-NNNN-<slug>`. |
|
|
144
145
|
| `wendkeep renumber-learnings` | Same for `06-Aprendizados`/`06-Learnings` → `APR-NNNN-<slug>`. |
|
|
145
146
|
| `wendkeep lesson add "t" "l"` | Record a project-local lesson (injected at the next SessionStart). |
|
|
146
|
-
| `wendkeep sync-defs` | Copy `.brain/agents\|skills` into `.codex/agents`, `.claude/skills`, `.agents/skills`; `--check` detects drift. |
|
|
147
|
+
| `wendkeep sync-defs` | Copy `.brain/agents\|skills` into `.codex/agents`, `.claude/skills`, `.agents/skills`; `--check` detects drift, `--reseed` refreshes the `wk-*` skills from the installed version's seeds. |
|
|
147
148
|
| `wendkeep validate-memory [path]` | Validate `.brain/CORE.md` (cap 25, 3 sections, no secrets/PII). |
|
|
148
149
|
| `wendkeep doctor [--vault P]` | Run a vault health check (integrity of sessions, registry, links). |
|
|
149
150
|
| `wendkeep --version` / `--help` | Version / usage. |
|
|
@@ -163,7 +164,7 @@ wendkeep import --vault .myproject-vault --source codex # just Codex
|
|
|
163
164
|
- **Both agents by default** (`--source all`). Claude sessions come from `~/.claude/projects/<slug>/`; Codex rollouts from `~/.codex/sessions/**`, scoped to this project by the `cwd` recorded in each session (case- and separator-insensitive, subdirs included). Narrow with `--source claude` / `--source codex`.
|
|
164
165
|
- Every note records its **`session_id`** and **`provider`** in frontmatter (live capture and import alike). Backfill older notes with `wendkeep import --stamp-ids` (fills the id from the registry; idempotent).
|
|
165
166
|
- **Deduped** by `session_id` against the vault's `SESSION_REGISTRY` **and** existing notes' frontmatter — only sessions not already present are imported, and it never overwrites an existing note. Re-running is a no-op.
|
|
166
|
-
- **`--from <dir>`** / **`--codex-from <dir>`** point at the transcript folders explicitly (use if the auto-derived path misses). Also: `--since <date>`, `--limit <n>`, `--json`.
|
|
167
|
+
- **`--from <dir>`** / **`--codex-from <dir>`** point at the transcript folders explicitly (use if the auto-derived path misses). Also: `--since <date>`, `--limit <n>`, `--rescan-decisions`, `--json`.
|
|
167
168
|
- Once imported, `wendkeep cost` aggregates your entire history — retroactively, across both agents.
|
|
168
169
|
|
|
169
170
|
## Derived notes — numbered like ADRs (`note new`, `renumber-*`)
|
|
@@ -174,10 +175,10 @@ Decisions, bugs and learnings are **derived notes**: they live in the month fold
|
|
|
174
175
|
|
|
175
176
|
```bash
|
|
176
177
|
wendkeep note new --type bug "login 500s when the token expires mid-refresh"
|
|
177
|
-
# → 05-Bugs/2026/07-JUL/BUG-0007-login-500s-when-the-token-expires.md
|
|
178
|
+
# → 05-Bugs/2026/07-JUL/BUG-0007-login-500s-when-the-token-expires-mid-refresh.md
|
|
178
179
|
|
|
179
180
|
wendkeep note new --type learning "a regex without /g only ever returns the first match"
|
|
180
|
-
# → 06-Aprendizados/2026/07-JUL/APR-0003-a-regex-without-g-only-ever-returns.md
|
|
181
|
+
# → 06-Aprendizados/2026/07-JUL/APR-0003-a-regex-without-g-only-ever-returns-the-first-match.md
|
|
181
182
|
```
|
|
182
183
|
|
|
183
184
|
It prints the created path, numbers from the current max (recursive scan), files it in the month folder for today (`--date YYYY-MM-DD` to override), and links the active session in `source:` so the graph stays connected. Agents get this rule injected at SessionStart — they call the command instead of guessing a filename.
|
|
@@ -211,14 +212,14 @@ Beyond capturing sessions, wendkeep is a **harness**: a native, zero‑dependenc
|
|
|
211
212
|
explore → propose → apply (TDD) → verify → archive
|
|
212
213
|
```
|
|
213
214
|
|
|
214
|
-
- **Propose** — `wendkeep change new <slug>` scaffolds `08-Mudanças/<slug>/` (`proposta.md`, `design.md`, `tarefas.md
|
|
215
|
-
- **Apply** — implement each `tarefas.md` task. Tag a task that needs machine proof with `[sensor:<id>]
|
|
216
|
-
- **Verify** — `wendkeep verify`
|
|
215
|
+
- **Propose** — `wendkeep change new <slug>` scaffolds `08-Mudanças/<slug>/` (`proposta.md`, `design.md`, `tarefas.md`; `--simple` skips the design). It becomes the global *current* change. When the change declares `spec_impact: required`, you author the delta yourself at `specs/<capability>/spec.md` — there is no placeholder to delete. Multiple changes may remain open: `change list`/`status` and the hooks show every pending one, while commands without `--change` act on the current one alone. `change use <slug>` changes focus and `change continue <archived> <new>` creates an auditable continuation.
|
|
216
|
+
- **Apply** — implement each `tarefas.md` task. Tag a task that needs machine proof with `[sensor:<id>]` — one sensor per task (a task carries a single sensor; split it in two if you need two) — and the requirement it satisfies with `[req:<ID>]`, of which a task may declare several.
|
|
217
|
+
- **Verify** — `wendkeep verify` runs the sensors your tasks declared (from `wendkeep.sensors.json` at the project root) and writes `evidencia.json`. A red `critical` fails the gate; a red `warning` is advisory. `verify --deep` builds a self-contained package with complete effective requirements (living contract + this change's delta), so the independent verifier never needs to reconstruct unarchived requirements from `07-Specs`. Every change needs a `verdict.json` to archive; `verify --deep` writes a trivial one automatically when the change declares no `[req:]`.
|
|
217
218
|
- **Archive** — `wendkeep change archive <slug>` **gates** on the evidence (blocks unless every declared critical sensor is green), promotes each capability's spec delta (`ADDED`/`MODIFIED`/`REMOVED`) into the living `07-Specs/<capability>.md`, moves the change to `_arquivo/`, and mints an ADR in `04-Decisões/`.
|
|
218
219
|
|
|
219
|
-
> The gate blocks unless the scaffold is filled, no task is open, evidence is fresh, and every declared requirement is covered. **`--force` is the human's call
|
|
220
|
+
> The gate blocks unless the scaffold is filled, no task is open, evidence is fresh, and every declared requirement is covered. **`--force` waives exactly one of those — the open-task check — and is the human's call, never the agent's.** An unfilled scaffold, a red critical sensor, stale evidence, an orphan requirement or a missing verdict block regardless.
|
|
220
221
|
|
|
221
|
-
`wendkeep init` seeds process skills into `.brain/skills` and delivers identical copies to
|
|
222
|
+
`wendkeep init` seeds process skills into the vault's `.brain/skills` and delivers identical copies to `.claude/skills/` and `.agents/skills/`; Codex gets the agent definitions (`.brain/agents/*.toml` → `.codex/agents/`) plus a managed section in `AGENTS.md` that indexes the skills. Every skill carries source hash/version metadata; `doctor` warns when reseed + agent restart is required.
|
|
222
223
|
|
|
223
224
|
### The loop in five minutes
|
|
224
225
|
|
|
@@ -237,9 +238,9 @@ Declare the capability in `proposta.md` (`specs: [ui]`) and author its delta onl
|
|
|
237
238
|
`08-Mudanças/<slug>/specs/ui/spec.md`. `07-Specs` is generated/read-only. Then:
|
|
238
239
|
|
|
239
240
|
```bash
|
|
240
|
-
npx wendkeep change status #
|
|
241
|
-
npx wendkeep change list #
|
|
242
|
-
npx wendkeep change status dark-mode # one change
|
|
241
|
+
npx wendkeep change status # every open change + its pending tasks
|
|
242
|
+
npx wendkeep change list # same backlog, plus the archived ones
|
|
243
|
+
npx wendkeep change status dark-mode # one screen for one change: specs / tasks / sensors / verdict
|
|
243
244
|
npx wendkeep spec effective --change dark-mode # living contract + this change's delta
|
|
244
245
|
npx wendkeep change done 1.1 # tick a task from the CLI
|
|
245
246
|
npx wendkeep verify # run the declared sensors -> evidencia.json
|
|
@@ -251,7 +252,8 @@ npx wendkeep change archive dark-mode # gate: sensors + verdict + no op
|
|
|
251
252
|
|
|
252
253
|
The archive promotes the delta into generated `07-Specs/ui.md`, mints an ADR, and the
|
|
253
254
|
Obsidian graph now links *session ↔ change ↔ requirement ↔ decision*. A change that names
|
|
254
|
-
no `[req:]`
|
|
255
|
+
no `[req:]` still runs `verify --deep`, but skips the `wk-verify` reading pass: the
|
|
256
|
+
command writes a trivial verdict on its own and the sensor gate is the real proof.
|
|
255
257
|
|
|
256
258
|
## How it works
|
|
257
259
|
|
|
@@ -260,16 +262,16 @@ agent session ──hooks──▶ wendkeep ──▶ Markdown in vault ──
|
|
|
260
262
|
(Claude/Codex) (Node) (02-Sessões/…) (CORE+DIGEST, backlinks)
|
|
261
263
|
```
|
|
262
264
|
|
|
263
|
-
The agent's settings.json points each hook at `npx wendkeep hook
|
|
265
|
+
The agent's settings.json points each hook at `npx wendkeep hook …`; the change-lifecycle hooks run the installed script directly (`node` on `${CLAUDE_PROJECT_DIR}/node_modules/wendkeep/hooks/<name>.mjs`) when the package is present locally, skipping an npx resolve on every event. On `Stop`, wendkeep parses the session transcript, appends the turn, updates the token/cost table, and (idempotently) emits any decision/bug/learning notes. On `SessionStart` — startup, `/clear` and `/compact` — `brain-inject` injects back curated memory (CORE + DIGEST), every open change with its pending tasks, the global current-change marker, project lessons, and a `<wk_process>` router. Claude, Codex, or another agent can therefore resume work started elsewhere without hiding the rest of the backlog.
|
|
264
266
|
|
|
265
|
-
The archive **gate** blocks unless: the change scaffold is filled (G0), no task is open (G1), every declared critical sensor is green (with fresh evidence), and
|
|
267
|
+
The archive **gate** blocks unless: the change scaffold is filled (G0), no task is open (G1), every declared critical sensor is green (with fresh evidence), and a `verdict.json` is present and current. `--force` waives G1 only — G0 is inescapable by design (a placeholder change forced through once minted a fake ADR), and no flag turns a red sensor or a missing verdict green. The agent is instructed never to use it on its own.
|
|
266
268
|
|
|
267
269
|
## Notes & roadmap
|
|
268
270
|
|
|
269
271
|
- **Vault folder names default to Portuguese** (`02-Sessões`, `04-Decisões`, …). Pass `wendkeep init --locale en` for an English vault (`02-Sessions`, `04-Decisions`, English scaffold/skills). The locale is a vault property, locked at init; parsers are bilingual so mixed content never breaks.
|
|
270
272
|
- **Search is keyword/frontmatter scoring**, not on‑device embeddings (that's on the roadmap).
|
|
271
273
|
- **Transcript formats are agent‑internal** and can change between agent versions; parsing is isolated but may need updates.
|
|
272
|
-
- Installer wires **Claude Code** settings + `.mcp.json`. Codex
|
|
274
|
+
- Installer wires **Claude Code** settings + `.mcp.json`. The hook scripts handle Codex too (they parse Codex transcripts and tag notes with the real provider), but `init` does not wire them into Codex yet — point Codex at `npx wendkeep hook <name>` by hand, or use `import --source codex` to backfill past Codex sessions.
|
|
273
275
|
|
|
274
276
|
---
|
|
275
277
|
|
package/README.pt-BR.md
CHANGED
|
@@ -13,14 +13,14 @@
|
|
|
13
13
|
|
|
14
14
|
**No grafo:** 🔵 sessão · 🟣 decisão · 🔴 bug · 🟢 aprendizado · 🟡 mudança — cada nota, com backlink.
|
|
15
15
|
|
|
16
|
-
**Um harness de memória persistente para agentes de código, construído sobre o seu cofre Obsidian.** Cada sessão do Claude Code
|
|
16
|
+
**Um harness de memória persistente para agentes de código, construído sobre o seu cofre Obsidian.** Cada sessão do Claude Code é capturada turno a turno em Markdown local — e as do Codex também, uma vez que os hooks dele estejam wirados (o `init` wira o Claude Code automaticamente; o `import` importa as do Codex de todo jeito) — com rastreio de tokens/custo, decisões, bugs e aprendizados extraídos automaticamente, e uma camada de memória curada injetada de volta no início da próxima sessão. Sobre esse núcleo de memória fica um **ciclo de mudança** nativo e sem dependências (spec → change → TDD → archive com gate por sensor) que mantém intenção, trabalho e prova wikilinkados num só grafo. 100% local, open‑core.
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
19
|
npm i -D wendkeep && npx wendkeep init # captura a partir da próxima sessão
|
|
20
20
|
npx wendkeep import # importa sessões passadas do Claude + Codex
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
**▶ Demo interativo:** [`docs/index.pt.html`](docs/index.pt.html) — uma página autocontida com o herói de grafo vivo.
|
|
23
|
+
**▶ Demo interativo:** [`docs/index.pt.html`](docs/index.pt.html) — uma página autocontida com o herói de grafo vivo. Ele vive no [repositório GitHub](https://github.com/rogersialves/wendkeep/tree/main/docs) (o tarball do npm leva só o runtime), então clone ou baixe o `docs/` pra abrir local ou servir em qualquer host estático. A imagem acima é um render estático dele.
|
|
24
24
|
|
|
25
25
|
> **De um cofre de produção real** (`npx wendkeep stats`): **308** sessões · **1.696** prompts · **US$ 4.836** capturados em **46 dias ativos** (jan–jul 2026) · **15** modelos — cada uma delas uma nota no grafo.
|
|
26
26
|
|
|
@@ -36,15 +36,15 @@ Decisões, becos sem saída, o motivo de você ter escolhido X em vez de Y — s
|
|
|
36
36
|
|---|---|
|
|
37
37
|
| **Captura** — cada turno, no disco | Os hooks `SessionStart` / `Stop` escrevem cada sessão numa nota Markdown datada: prompts, iterações, arquivos tocados, wikilinks. |
|
|
38
38
|
| **Deriva** — decisões, bugs, aprendizados | Puxados do transcript pra notas próprias, com backlink pra sessão. Seu histórico fica navegável, não arquivístico. |
|
|
39
|
-
| **Recall** — injetado de volta | Um `CORE` + `DIGEST` com budget capado e
|
|
39
|
+
| **Recall** — injetado de volta | Um `CORE` + `DIGEST` com budget capado e todas as changes abertas são injetados no agente no próximo `SessionStart`. Ele retoma de onde parou. |
|
|
40
40
|
| **Custo** — quanto tudo custou | Preço por modelo, ciente de cache, por sessão — mais `cost --trend` com projeção run‑rate no cofre inteiro. |
|
|
41
|
-
| **Multi‑agente** —
|
|
41
|
+
| **Multi‑agente** — um cofre, os dois agentes | Marca cada nota com o agente que a escreveu: o Claude Code é detectado pelo ambiente dele, qualquer outro é registrado como Codex. Um grafo só, esteja você em qual agente estiver. |
|
|
42
42
|
| **Local‑first** — sem nuvem, sem conta | Tudo é Markdown puro no seu disco. Um MCP opcional (`@bitbonsai/mcpvault`) deixa o agente ler/escrever o cofre. |
|
|
43
43
|
|
|
44
44
|
## Requisitos
|
|
45
45
|
|
|
46
46
|
- Node.js ≥ 18
|
|
47
|
-
- Um agente de código com hooks
|
|
47
|
+
- Um agente de código com hooks. O `init` wira o **Claude Code** automaticamente; os mesmos scripts de hook dão conta dos transcripts do Codex, mas wirá-los no Codex é manual hoje (veja [Notas & roadmap](#notas--roadmap))
|
|
48
48
|
- Obsidian (pra ver o grafo) — opcional, mas é o ponto
|
|
49
49
|
|
|
50
50
|
## Instalar & configurar
|
|
@@ -58,19 +58,19 @@ npx wendkeep init
|
|
|
58
58
|
O `wendkeep init` é interativo e **idempotente**. Ele:
|
|
59
59
|
|
|
60
60
|
1. Cria a taxonomia de pastas do cofre e um `README.md` templado (cofre padrão: `<projeto>/.<nome-do-projeto>-vault`, ex.: `.MeuApp-vault`; sobrescreva com `--vault`).
|
|
61
|
-
2. Grava um vínculo provider-neutral **`.wendkeep.json`** na raiz do projeto e o marcador correspondente `.brain/PROJECT.json` no cofre.
|
|
61
|
+
2. Grava um vínculo provider-neutral **`.wendkeep.json`** na raiz do projeto e o marcador correspondente `.brain/PROJECT.json` no cofre, e faz merge dos hooks de sessão no **`.claude/settings.json`**. O vínculo é provider-neutral de propósito: qualquer agente resolve o mesmo cofre pelo `cwd` da sessão, sem variável global da máquina. (Só o Claude Code tem os hooks wirados automaticamente — no Codex a fiação é manual.) Registros antigos em `.claude/settings.json` são adotados automaticamente.
|
|
62
62
|
3. Adiciona o servidor MCP **`wendkeep-vault`** ao `.mcp.json` pro agente ler/escrever o cofre. Pule com `--no-mcp` — ex.: quando o agente já tem um MCP de cofre. (`--no-mcp` pula *só o MCP do próprio wendkeep*; os MCPs de companion seguem `--companions`.)
|
|
63
|
-
4. Oferece fixar plugins/MCP **companion** (múltipla escolha; **nenhum** pré-marcado). Cada um é wirado do jeito mais agnóstico que suporta:
|
|
64
|
-
- **`context-mode`** — otimizador de contexto + memória FTS5, como servidor MCP no `.mcp.json` (
|
|
63
|
+
4. Oferece fixar plugins/MCP **companion** (múltipla escolha; **nenhum** pré-marcado — o wendkeep é um harness neutro e não presume plugin de terceiro). Cada um é wirado do jeito mais agnóstico que suporta:
|
|
64
|
+
- **`context-mode`** — otimizador de contexto + memória FTS5, wirado como plugin do Claude Code. Ele traz o próprio servidor MCP, então o wendkeep de propósito não adiciona entrada no `.mcp.json` (registrar os dois subia dois servidores ao mesmo tempo). Em agentes não‑Claude, adicione o MCP à mão: `npx -y context-mode`.
|
|
65
65
|
- **`understand-anything`** — grafo de domínio do projeto, via um hook `understand-inject` no SessionStart que injeta o grafo quando gerado.
|
|
66
66
|
- **`caveman`** — modo de compressão de tokens; roda seu próprio instalador cross‑agent em agentes não‑Claude.
|
|
67
|
-
- **`dotcontext`** — *legado, não recomendado.* O loop a2 nativo do wendkeep (`change` / `verify` / gate) já faz o trabalho dele, então instalar **duplica o harness**.
|
|
67
|
+
- **`dotcontext`** — *legado, não recomendado, e oculto do seletor.* O loop a2 nativo do wendkeep (`change` / `verify` / gate) já faz o trabalho dele, então instalar **duplica o harness**. Alcançável só via um `--companions dotcontext` explícito, pra quem já usa (ajuste com `--dotcontext-mcp` / `--dotcontext-hooks`).
|
|
68
68
|
|
|
69
69
|
Controle com `--companions <csv>` ou `--no-companions`. A camada de plugin do Claude Code (`extraKnownMarketplaces` + `enabledPlugins`) é wirada como bônus onde o companion tiver uma.
|
|
70
70
|
5. Instala um **sistema de cores** no `.obsidian/` do cofre: um snippet CSS que colore notas por tipo (sessão/decisão/bug/aprendizado, via as `cssclasses` que os hooks emitem) mais grupos de cor do grafo por pasta. Merge não‑destrutivo em `appearance.json`/`graph.json`; pule com `--no-colors`.
|
|
71
71
|
6. Semeia a **camada de memória curada**: `.brain/CORE.md` (a camada quente curada à mão, com as 3 seções obrigatórias) e `.brain/COMPACTION_PROTOCOL.md` (o guia do protocolo). As camadas automáticas (`DIGEST.md`, `index.jsonl`) são geradas pelos hooks. Valide a camada curada com `wendkeep validate-memory` (cap 25 linhas, 3 seções, sem segredos/PII).
|
|
72
|
-
7. Semeia a **camada de definições + skills**: `.brain/agents/` + `.brain/skills/` (fonte da verdade versionada), incluindo as skills de processo nativas `wk-workflow` / `wk-tdd` / `wk-debugging` / `wk-brainstorming` / `wk-planning` / `wk-verify` (algumas trazem templates, ex.: o `verdict-template.json` + prompt de revisor da `wk-verify`). O `init` roda o `wendkeep sync-defs` pra você, entregando em `.
|
|
73
|
-
8. Semeia o **ciclo change/spec**: as pastas `07-Specs/` + `08-Mudanças/` e um `wendkeep.sensors.json` nativo
|
|
72
|
+
7. Semeia a **camada de definições + skills**: `.brain/agents/` + `.brain/skills/` (fonte da verdade versionada), incluindo as skills de processo nativas `wk-workflow` / `wk-tdd` / `wk-debugging` / `wk-brainstorming` / `wk-planning` / `wk-verify` (algumas trazem templates, ex.: o `verdict-template.json` + prompt de revisor da `wk-verify`). O `init` roda o `wendkeep sync-defs` pra você, entregando as skills em `.claude/skills/` e `.agents/skills/`, e as definições de agent (`.brain/agents/*.toml`) em `.codex/agents/`, mais uma seção gerenciada no `AGENTS.md` que indexa as skills pro Codex; o `sync-defs --check` detecta cópias defasadas (rode `sync-defs` de novo após editar o `.brain`).
|
|
73
|
+
8. Semeia o **ciclo change/spec**: as pastas `07-Specs/` + `08-Mudanças/` e um `wendkeep.sensors.json` nativo — um sensor crítico `memory-validation` (`npx wendkeep validate-memory`) mais um para cada `typecheck` / `test` / `lint` / `build` encontrado no seu `package.json`. Adicione os seus com `wendkeep sensors add`. É o que alimenta o `wendkeep change` / `wendkeep verify` — veja **Ciclo de mudança** abaixo.
|
|
74
74
|
|
|
75
75
|
```bash
|
|
76
76
|
npx wendkeep init --vault "~/vaults/work" --project . --yes # não-interativo
|
|
@@ -126,25 +126,28 @@ Reinicie Codex e Claude Code depois de resemear as skills geradas.
|
|
|
126
126
|
|---|---|
|
|
127
127
|
| `wendkeep init` | Configura o wendkeep num projeto (taxonomia do cofre + settings + MCP + skills). |
|
|
128
128
|
| `wendkeep hook <name>` | Roda um hook de sessão; invocado pelo `settings.json` (lê o JSON do agente no stdin). |
|
|
129
|
-
| `wendkeep change <sub>` | Ciclo de mudança: `new [--simple]` / `list` (backlog global) / `show
|
|
130
|
-
| `wendkeep verify [--deep]` | Roda os sensores das tarefas da change; `--deep` monta o pacote de verificação independente. |
|
|
131
|
-
| `wendkeep spec <sub>` | Specs vivos: `list` / `show <capability
|
|
132
|
-
| `wendkeep sensors <sub>` | `list` / `add <id> "<comando>"` — vê/edita `wendkeep.sensors.json` (JSON Schema incluso). |
|
|
133
|
-
| `wendkeep cost [opts]` | Agrega o gasto de IA nas sessões do cofre — total, por modelo, por dia · `--top [N]` · `--trend [day\|week\|month]` (+ projeção) · `--write` (gera `00-Custo.md`) · `--json`. |
|
|
134
|
-
| `wendkeep cost rebuild [opts]` | Reconstrói custos históricos do transcript principal e subagents via `SESSION_REGISTRY`. Dry-run por padrão; `--apply` grava notas e `.brain/COST_REBUILD.json`. |
|
|
129
|
+
| `wendkeep change <sub>` | Ciclo de mudança: `new <slug> [--simple]` / `use <slug>` (troca o foco) / `continue <arquivada> <nova>` / `bind <slug> --session <id>` / `list` (backlog global) / `show <slug>` / `status [slug]` / `done <id> [--change slug]` / `undone <id> [--change slug]` / `relink [--apply] [--json]` (conserta os wikilinks das changes; prévia por padrão) / `diff [slug]` / `archive [slug] [--force]` / `abandon [slug]` (descarta sem ADR). `diff`, `archive` e `abandon` caem na change ativa quando você omite o slug; o `status` pelado lista todas as abertas. |
|
|
130
|
+
| `wendkeep verify [--deep] [--change s]` | Roda os sensores das tarefas da change; `--deep` monta o pacote de verificação independente. `--change` mira uma change que não é a ativa. |
|
|
131
|
+
| `wendkeep spec <sub>` | Specs vivos: `list` / `show <capability>` / `effective [--change <slug>] [--json]` (contrato vivo + delta; usa a change ativa por padrão) / `migrate` / `rebase [--accept-current]` (para em conflito, a não ser que você aceite o lado do spec vivo). |
|
|
132
|
+
| `wendkeep sensors <sub>` | `list` / `add <id> "<comando>"` com `--severity` / `--type` / `--report` / `--name` / `--description` — vê/edita `wendkeep.sensors.json` (JSON Schema incluso). |
|
|
133
|
+
| `wendkeep cost [opts]` | Agrega o gasto de IA nas sessões do cofre — total, por modelo, por dia · `--since <data>` · `--top [N]` · `--trend [day\|week\|month]` (+ projeção) · `--write` (gera `00-Custo.md`) · `--json`. |
|
|
134
|
+
| `wendkeep cost rebuild [opts]` | Reconstrói custos históricos do transcript principal e subagents via `SESSION_REGISTRY`. Dry-run por padrão; `--apply` grava notas e `.brain/COST_REBUILD.json`. Também `--session <id\|arquivo>` / `--limit n` / `--json`. |
|
|
135
135
|
| `wendkeep session list\|show\|use` | Lista o registry multi-sessão, mostra uma conversa ou muda somente o foco humano de `CURRENT_SESSION.md`. |
|
|
136
|
-
| `wendkeep change bind <slug> --session <id>` | Vincula ou transfere uma change para uma conversa canônica sem esconder as demais pendências. |
|
|
137
|
-
|
|
138
|
-
As notas de sessão usam um único snapshot vivo `## Agentes, tokens e custos`. Os hooks do agente principal e dos subagents recompõem o bloco atomicamente, incluindo custo, dimensões de tokens, reasoning e effort por modelo/origem.
|
|
139
136
|
| `wendkeep stats [--vault P]` | Uma linha compartilhável: sessões · prompts · gasto · período · modelos (`--json`). |
|
|
140
|
-
| `wendkeep import [opts]` | **Memória retroativa** — importa sessões passadas de **Claude + Codex** pro cofre (dedup por `session_id`). `--source all\|claude\|codex` / `--from <dir>` / `--codex-from <dir>` / `--
|
|
137
|
+
| `wendkeep import [opts]` | **Memória retroativa** — importa sessões passadas de **Claude + Codex** pro cofre (dedup por `session_id`). `--source all\|claude\|codex` / `--stamp-ids` / `--rescan-decisions` / `--from <dir>` / `--codex-from <dir>` / `--since d` / `--limit n` / `--dry-run` / `--json`. |
|
|
141
138
|
| `wendkeep dashboard [--force]` | (Re)gera os Bases filtrados por pasta + o MOC `00-Dashboard`. |
|
|
139
|
+
| `wendkeep note new --type bug\|learning "<título>"` | Cria uma nota derivada **numerada** (`BUG-`/`APR-NNNN`) na pasta do mês e imprime o caminho no cofre. `--date YYYY-MM-DD`. |
|
|
140
|
+
| `wendkeep renumber-decisions` | Renumera `04-Decisões` pra `ADR-NNNN-<slug>` em ordem cronológica, tira as notas de subpastas legadas `DIA N` pra pasta do mês e reescreve os wikilinks. Prévia por padrão; `--apply` / `--json`. |
|
|
141
|
+
| `wendkeep renumber-bugs` | Idem pra `05-Bugs` → `BUG-NNNN-<slug>`. |
|
|
142
|
+
| `wendkeep renumber-learnings` | Idem pra `06-Aprendizados`/`06-Learnings` → `APR-NNNN-<slug>`. |
|
|
142
143
|
| `wendkeep lesson add "t" "l"` | Registra uma lição local do projeto (injetada no próximo SessionStart). |
|
|
143
|
-
| `wendkeep sync-defs` | Copia `.brain/agents\|skills` pro projeto (`.codex/agents`, `.claude/skills`). |
|
|
144
|
+
| `wendkeep sync-defs` | Copia `.brain/agents\|skills` pro projeto (`.codex/agents`, `.claude/skills`, `.agents/skills`); `--check` detecta drift, `--reseed` ressemeia as skills `wk-*` com os seeds da versão instalada. |
|
|
144
145
|
| `wendkeep validate-memory [path]` | Valida `.brain/CORE.md` (cap 25, 3 seções, sem segredos/PII). |
|
|
145
146
|
| `wendkeep doctor [--vault P]` | Roda um check de saúde do cofre (integridade de sessões, registry, links). |
|
|
146
147
|
| `wendkeep --version` / `--help` | Versão / uso. |
|
|
147
148
|
|
|
149
|
+
As notas de sessão usam um único snapshot vivo `## Agentes, tokens e custos`. Os hooks do agente principal e dos subagents recompõem o bloco atomicamente, incluindo custo, dimensões de tokens, reasoning e effort por modelo/origem.
|
|
150
|
+
|
|
148
151
|
## Memória retroativa (`import`) — instale hoje, lembre de ontem
|
|
149
152
|
|
|
150
153
|
Instale o wendkeep num projeto existente e ele só lembra sessões **a partir de agora**. O `wendkeep import` conserta isso: um comando importa as sessões passadas de **Claude & Codex** do projeto pro cofre — dedup, datadas, com custo — então o grafo começa cheio, não vazio. Reconstrói cada transcript como uma nota de sessão completa na pasta datada **real** — frontmatter (taggeado com o provedor real), um bloco de iteração por turno, custo + telemetria de subagents, notas derivadas de decisão/bug/aprendizado, encerramento finalizado. Um replay offline do fluxo de captura vivo, então uma nota importada é indistinguível de uma capturada.
|
|
@@ -158,8 +161,46 @@ wendkeep import --vault .meuprojeto-vault --source codex # só Codex
|
|
|
158
161
|
- **Os dois agentes por padrão** (`--source all`). As sessões do Claude vêm de `~/.claude/projects/<slug>/`; os rollouts do Codex de `~/.codex/sessions/**`, escopados pro projeto pelo `cwd` gravado em cada sessão (insensível a case e separador, subpastas inclusas). Estreite com `--source claude` / `--source codex`.
|
|
159
162
|
- Toda nota grava o **`session_id`** e o **`provider`** no frontmatter (captura live e import iguais). Carimbe notas antigas com `wendkeep import --stamp-ids` (preenche o id a partir do registry; idempotente).
|
|
160
163
|
- **Dedup** por `session_id` contra o `SESSION_REGISTRY` do cofre **e** o frontmatter das notas existentes — só importa sessões ausentes e nunca sobrescreve. Rodar de novo é no‑op.
|
|
164
|
+
- **`--from <dir>`** / **`--codex-from <dir>`** apontam as pastas de transcript explicitamente (use se o caminho auto‑derivado errar). Também: `--since <data>`, `--limit <n>`, `--rescan-decisions`, `--json`.
|
|
161
165
|
- Depois de importar, o `wendkeep cost` agrega seu histórico inteiro — retroativamente, nos dois agentes.
|
|
162
166
|
|
|
167
|
+
## Notas derivadas — numeradas como ADRs (`note new`, `renumber-*`)
|
|
168
|
+
|
|
169
|
+
Decisões, bugs e aprendizados são **notas derivadas**: vivem na pasta do mês da sua árvore (`<pasta>/<ano>/<MM-MMM>/`) e carregam um id sequencial — `ADR-0001`, `BUG-0001`, `APR-0001`. Uma olhada já diz o que a nota é e onde ela cai na história do projeto. Sem subpasta por dia: uma pasta `DIA N` com uma nota só é ruído, e esconde a nota da busca por pasta.
|
|
170
|
+
|
|
171
|
+
**Criando uma** (nunca escreva o arquivo à mão — o comando é dono do número, da pasta e do frontmatter):
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
wendkeep note new --type bug "login dá 500 quando o token expira no meio do refresh"
|
|
175
|
+
# → 05-Bugs/2026/07-JUL/BUG-0007-login-da-500-quando-o-token-expira-no-meio-do-refresh.md
|
|
176
|
+
|
|
177
|
+
wendkeep note new --type learning "regex sem /g só retorna o primeiro match"
|
|
178
|
+
# → 06-Aprendizados/2026/07-JUL/APR-0003-regex-sem-g-so-retorna-o-primeiro-match.md
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Ele imprime o caminho criado, numera a partir do máximo atual (varredura recursiva), arquiva na pasta do mês de hoje (`--date YYYY-MM-DD` pra sobrescrever) e linka a sessão ativa em `source:` pro grafo seguir conectado. Os agentes recebem essa regra injetada no SessionStart — chamam o comando em vez de chutar um nome de arquivo.
|
|
182
|
+
|
|
183
|
+
**Migrando um cofre existente.** Notas criadas antes da `0.41.0` têm nome com prefixo de data (`2026-07-16-bug-<slug>.md`) e podem estar em subpastas legadas `DIA N`. Um comando por árvore renumera cronologicamente, sobe as notas pra pasta do mês e reescreve todos os wikilinks do cofre:
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
# Bugs — 05-Bugs → BUG-NNNN
|
|
187
|
+
wendkeep renumber-bugs # prévia: imprime cada de → para, não escreve nada
|
|
188
|
+
wendkeep renumber-bugs --apply # migra
|
|
189
|
+
|
|
190
|
+
# Aprendizados — 06-Aprendizados → APR-NNNN
|
|
191
|
+
wendkeep renumber-learnings # prévia
|
|
192
|
+
wendkeep renumber-learnings --apply # migra
|
|
193
|
+
|
|
194
|
+
# Decisões — 04-Decisões → ADR-NNNN (desde a 0.30.0)
|
|
195
|
+
wendkeep renumber-decisions # prévia
|
|
196
|
+
wendkeep renumber-decisions --apply # migra
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
- **Prévia é o padrão.** Nada é escrito até o `--apply` — leia a lista `de → para` primeiro; é ali que um slug estropiado aparece, antes de tocar seus arquivos.
|
|
200
|
+
- **Uma árvore por vez, de propósito.** Não existe `renumber-all`: cada pasta é migrada e revisada por conta própria.
|
|
201
|
+
- **A ordem é cronológica**, derivada da data da nota (frontmatter → prefixo do nome → pasta), então `BUG-0001` é de fato o bug mais antigo — não o primeiro que o scanner leu.
|
|
202
|
+
- **Wikilinks são reescritos no cofre inteiro** (forma com path completo e por basename, aliases preservados), o `type`/`bug:`/`apr:`/H1 do corpo são normalizados e pastas `DIA` esvaziadas são removidas. **Idempotente**: um segundo `--apply` não renomeia nada. Feche o Obsidian durante a migração, e commite o cofre antes se ele estiver sob git.
|
|
203
|
+
|
|
163
204
|
## Ciclo de mudança — o loop a2 (spec‑driven, nativo)
|
|
164
205
|
|
|
165
206
|
Além de capturar sessões, o wendkeep é um **harness**: um loop nativo e sem dependências que mantém *intenção* (specs), *trabalho* (changes) e *prova* (sensores) juntos no cofre, wikilinkados no grafo Obsidian.
|
|
@@ -168,14 +209,48 @@ Além de capturar sessões, o wendkeep é um **harness**: um loop nativo e sem d
|
|
|
168
209
|
explore → propose → apply (TDD) → verify → archive
|
|
169
210
|
```
|
|
170
211
|
|
|
171
|
-
- **Propose** — `wendkeep change new <slug>` faz o scaffold de `08-Mudanças/<slug>/` (`proposta.md`, `design.md`, `tarefas.md`
|
|
172
|
-
- **Apply** — implemente cada tarefa de `tarefas.md`. Taggeie a tarefa que precisa de prova de máquina com `[sensor:<id>]
|
|
173
|
-
- **Verify** — `wendkeep verify` roda os sensores que suas tarefas declararam (do `wendkeep.sensors.json` na raiz do projeto) e grava `evidencia.json`. Um vermelho crítico falha o gate; um vermelho `warning` é aviso.
|
|
212
|
+
- **Propose** — `wendkeep change new <slug>` faz o scaffold de `08-Mudanças/<slug>/` (`proposta.md`, `design.md`, `tarefas.md`; o `--simple` pula o design). A change vira a *atual* global; `change use <slug>` troca o foco e `change continue <arquivada> <nova>` cria uma continuação auditável. Várias changes podem ficar abertas: hooks e `change list/status` mostram todas as pendências, enquanto comandos sem `--change` usam somente a atual. Quando a change declara `spec_impact: required`, você mesmo escreve o delta em `specs/<capability>/spec.md` — não há placeholder pra apagar.
|
|
213
|
+
- **Apply** — implemente cada tarefa de `tarefas.md`. Taggeie a tarefa que precisa de prova de máquina com `[sensor:<id>]` — um sensor por tarefa (a tarefa carrega um só; quebre em duas se precisar de dois) — e o requisito que ela satisfaz com `[req:<ID>]`, dos quais a tarefa pode declarar vários.
|
|
214
|
+
- **Verify** — `wendkeep verify` roda os sensores que suas tarefas declararam (do `wendkeep.sensors.json` na raiz do projeto) e grava `evidencia.json`. Um vermelho crítico falha o gate; um vermelho `warning` é aviso. O `verify --deep` monta o pacote autocontido de verificação (contrato vivo + delta desta change). Toda change precisa de um `verdict.json` pra arquivar; quando ela não declara `[req:]`, o próprio `verify --deep` grava um verdict trivial.
|
|
174
215
|
- **Archive** — `wendkeep change archive <slug>` faz **gate** na evidência (bloqueia a não ser que todo sensor crítico declarado esteja verde), promove o delta de cada capability (`ADDED`/`MODIFIED`/`REMOVED`) pro `07-Specs/<capability>.md` vivo, move a change pro `_arquivo/` e cunha um ADR em `04-Decisões/`.
|
|
175
216
|
|
|
176
|
-
> O gate bloqueia a não ser que o scaffold esteja preenchido, nenhuma tarefa aberta, evidência fresca e todo requisito declarado coberto.
|
|
217
|
+
> O gate bloqueia a não ser que o scaffold esteja preenchido, nenhuma tarefa aberta, evidência fresca e todo requisito declarado coberto. **O `--force` dispensa exatamente uma dessas — a checagem de tarefa aberta — e é decisão do humano, nunca do agente.** Scaffold não preenchido, sensor crítico vermelho, evidência stale, requisito órfão ou verdict ausente bloqueiam de qualquer jeito.
|
|
218
|
+
|
|
219
|
+
O `wendkeep init` também semeia **skills de processo nativas** (`wk-workflow`, `wk-tdd`, `wk-debugging`, `wk-brainstorming`, `wk-planning`, `wk-verify`) no `.brain/skills` do cofre e as entrega em `.claude/skills/` e `.agents/skills/` — a camada do *como*, zero‑dep. O Codex recebe as definições de agent (`.brain/agents/*.toml` → `.codex/agents/`) mais uma seção gerenciada no `AGENTS.md` que indexa as skills. Cada skill carrega metadados de hash/versão da fonte; o `doctor` avisa quando é preciso ressemear e reiniciar o agente. Companions opcionais (`context-mode`, `dotcontext`, `understand-anything`, `caveman`) ficam como camada extra opt‑in.
|
|
220
|
+
|
|
221
|
+
### O loop em cinco minutos
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
npx wendkeep init --yes # cofre + hooks + sensores + skills
|
|
225
|
+
npx wendkeep change new dark-mode # proposta/design/tarefas — a change fica ativa
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
Edite o `tarefas.md` — marque a prova e o requisito por tarefa:
|
|
229
|
+
|
|
230
|
+
```markdown
|
|
231
|
+
- [ ] 1.1 o toggle persiste entre sessões [req:UI-1] [sensor:tests]
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Declare a capability na `proposta.md` (`specs: [ui]`) e escreva o delta dela só em
|
|
235
|
+
`08-Mudanças/<slug>/specs/ui/spec.md`. O `07-Specs` é gerado/read-only. Então:
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
npx wendkeep change status # todas as changes abertas + tarefas pendentes
|
|
239
|
+
npx wendkeep change list # o mesmo backlog, mais as arquivadas
|
|
240
|
+
npx wendkeep change status dark-mode # uma tela pra uma change: specs / tarefas / sensores / veredito
|
|
241
|
+
npx wendkeep spec effective --change dark-mode # contrato vivo + delta desta change
|
|
242
|
+
npx wendkeep change done 1.1 # marca uma tarefa pela CLI
|
|
243
|
+
npx wendkeep verify # roda os sensores declarados -> evidencia.json
|
|
244
|
+
npx wendkeep verify --deep # monta o pacote de verificação
|
|
245
|
+
# a skill wk-verify (passe fresco, read-only) grava o verdict.json
|
|
246
|
+
npx wendkeep change diff # prévia do que vai cair no 07-Specs
|
|
247
|
+
npx wendkeep change archive dark-mode # gate: sensores + verdict + nenhuma tarefa aberta
|
|
248
|
+
```
|
|
177
249
|
|
|
178
|
-
O
|
|
250
|
+
O archive promove o delta pro `07-Specs/ui.md` gerado, cunha um ADR, e o grafo do Obsidian
|
|
251
|
+
agora liga *sessão ↔ change ↔ requisito ↔ decisão*. Uma change que não nomeia nenhum
|
|
252
|
+
`[req:]` ainda roda o `verify --deep`, mas pula o passe de leitura do `wk-verify`: o próprio
|
|
253
|
+
comando grava um verdict trivial e o gate de sensores é a prova real.
|
|
179
254
|
|
|
180
255
|
## Como funciona
|
|
181
256
|
|
|
@@ -184,16 +259,16 @@ sessão do agente ──hooks──▶ wendkeep ──▶ Markdown no cofre ─
|
|
|
184
259
|
(Claude/Codex) (Node) (02-Sessões/…) (CORE+DIGEST, backlinks)
|
|
185
260
|
```
|
|
186
261
|
|
|
187
|
-
O settings.json do agente aponta cada hook pra `npx wendkeep hook
|
|
262
|
+
O settings.json do agente aponta cada hook pra `npx wendkeep hook …`; os hooks do ciclo de mudança rodam o script instalado direto (`node` em `${CLAUDE_PROJECT_DIR}/node_modules/wendkeep/hooks/<name>.mjs`) quando o pacote está presente local, pulando uma resolução do npx a cada evento. No `Stop`, o wendkeep parseia o transcript, anexa o turno, atualiza a tabela de tokens/custo e (idempotentemente) emite qualquer nota de decisão/bug/aprendizado. No `SessionStart` — startup, `/clear` e `/compact` — o `brain-inject` injeta a memória curada (CORE + DIGEST), todas as changes abertas com suas pendências, o marcador global da change atual, as lições do projeto e o roteador `<wk_process>`. Claude, Codex ou outro agente podem assim retomar trabalho iniciado em outro lugar sem ocultar o restante do backlog.
|
|
188
263
|
|
|
189
|
-
O **gate** do archive bloqueia a não ser que: o scaffold da change esteja preenchido (G0), nenhuma tarefa esteja aberta (G1), todo sensor crítico declarado esteja verde (com evidência fresca) e
|
|
264
|
+
O **gate** do archive bloqueia a não ser que: o scaffold da change esteja preenchido (G0), nenhuma tarefa esteja aberta (G1), todo sensor crítico declarado esteja verde (com evidência fresca) e exista um `verdict.json` presente e atual. O `--force` dispensa só o G1 — o G0 é inescapável por design (uma change placeholder forçada uma vez cunhou um ADR falso), e nenhuma flag torna verde um sensor vermelho ou um verdict ausente. O agente é instruído a nunca usar por conta própria.
|
|
190
265
|
|
|
191
266
|
## Notas & roadmap
|
|
192
267
|
|
|
193
268
|
- **Nomes das pastas do cofre são em Português por padrão** (`02-Sessões`, `04-Decisões`, …). Passe `wendkeep init --locale en` pra um cofre em inglês (`02-Sessions`, `04-Decisions`, scaffold/skills em inglês). O locale é uma propriedade do cofre, travada no init; os parsers são bilíngues, então conteúdo misto nunca quebra.
|
|
194
269
|
- **Busca é scoring por keyword/frontmatter**, não embeddings on‑device (isso está no roadmap).
|
|
195
270
|
- **Formatos de transcript são internos ao agente** e podem mudar entre versões; o parsing é isolado mas pode precisar de atualizações.
|
|
196
|
-
- O instalador wira settings do **Claude Code** + `.mcp.json`. Os
|
|
271
|
+
- O instalador wira settings do **Claude Code** + `.mcp.json`. Os scripts de hook dão conta do Codex também (parseiam transcripts Codex e marcam as notas com o provedor real), mas o `init` ainda não os wira no Codex — aponte o Codex pra `npx wendkeep hook <name>` à mão, ou use `import --source codex` pra importar sessões Codex passadas.
|
|
197
272
|
|
|
198
273
|
---
|
|
199
274
|
|
package/hooks/token-usage.mjs
CHANGED
|
@@ -604,6 +604,19 @@ function transcriptIdFromPath(transcriptPath) {
|
|
|
604
604
|
return basename(String(transcriptPath || '')).replace(/\.jsonl?$/i, '') || 'desconhecido';
|
|
605
605
|
}
|
|
606
606
|
|
|
607
|
+
// The usage fields that define whether a transcript's entry "changed" — everything except the
|
|
608
|
+
// key (transcript_id) and the timestamp (atualizado_em). Order-insensitive by design: a new
|
|
609
|
+
// field here is the single place to keep preservation correct.
|
|
610
|
+
const USAGE_FIELDS = ['provider', 'pensamento', 'input', 'cache_write', 'cache_read',
|
|
611
|
+
'output', 'reasoning', 'total', 'custo_usd', 'prompts', 'tool_calls', 'chamadas_llm'];
|
|
612
|
+
|
|
613
|
+
export function sameUsageData(a, b) {
|
|
614
|
+
if (!a || !b) return false;
|
|
615
|
+
const listEqual = (x, y) => (x || []).join('') === (y || []).join('');
|
|
616
|
+
return USAGE_FIELDS.every((f) => (a[f] ?? null) === (b[f] ?? null))
|
|
617
|
+
&& listEqual(a.modelos, b.modelos) && listEqual(a.tools, b.tools);
|
|
618
|
+
}
|
|
619
|
+
|
|
607
620
|
function entryFromSummary(summary, transcriptId) {
|
|
608
621
|
return {
|
|
609
622
|
transcript_id: transcriptId,
|
|
@@ -931,10 +944,11 @@ export function collectSessionUsage({ sessionContent, transcriptPath }) {
|
|
|
931
944
|
const transcriptId = transcriptIdFromPath(transcriptPath);
|
|
932
945
|
const previous = existingEntries.find((entry) => entry.transcript_id === transcriptId);
|
|
933
946
|
const current = entryFromSummary(summary, transcriptId);
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
947
|
+
// Preserve the old timestamp when the usage data is unchanged, so an unchanged session note
|
|
948
|
+
// stays byte-identical (no needless rewrite on every Stop). Compared semantically, NOT via
|
|
949
|
+
// JSON.stringify: the parsed-from-note entry and the freshly-built one have different key
|
|
950
|
+
// orders, which made the old stringify compare always mismatch — preservation never fired.
|
|
951
|
+
if (previous && sameUsageData(previous, current)) current.atualizado_em = previous.atualizado_em;
|
|
938
952
|
let entries = existingEntries.filter((e) => e.transcript_id !== transcriptId);
|
|
939
953
|
|
|
940
954
|
if (!existingEntries.length) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wendkeep",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.45.1",
|
|
4
4
|
"description": "A persistent-memory harness for AI coding agents on your Obsidian vault: turn-by-turn session capture plus a native, zero-dependency spec→change→verify→archive loop (sensor-gated, independent verdict, mutation discrimination). Local-first, agent-agnostic (Claude Code, Codex, Cursor…).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -46,6 +46,6 @@
|
|
|
46
46
|
"url": "https://github.com/rogersialves/wendkeep/issues"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"wendkeep": "^0.
|
|
49
|
+
"wendkeep": "^0.45.0"
|
|
50
50
|
}
|
|
51
51
|
}
|