wendkeep 0.80.1 → 0.80.2

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 CHANGED
@@ -4,6 +4,16 @@ 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.80.2] — 2026-08-24
8
+
9
+ ### Fixed
10
+
11
+ - **Perfil persistente em worktrees vinculadas.** `profile use` e `profile status` agora leem e
12
+ escrevem o binding canônico da worktree principal quando o Vault é resolvido pelo registry Git
13
+ compartilhado, sem alterar o `.wendkeep.json` versionado da worktree vinculada. A identidade de
14
+ caminho também normaliza aliases Windows 8.3, impedindo que uma seleção humana `OFF` volte
15
+ imediatamente ao fallback `GOVERN`; README e guia de perfis foram atualizados em PT-BR/EN.
16
+
7
17
  ## [0.80.1] — 2026-08-24
8
18
 
9
19
  ### Fixed
package/README.en.md CHANGED
@@ -161,6 +161,9 @@ paths are also supported. Hooks search upward from the agent's `cwd`, so nested
161
161
  the nearest binding. The vault carries the same identity in `.brain/PROJECT.json`; a mismatch
162
162
  is rejected before any session is written. If no binding exists, hooks fail closed and never
163
163
  create the historical `~/wendkeep-vault` fallback.
164
+ In linked worktrees, `profile use` and `profile status` resolve the main worktree's canonical
165
+ binding through the shared Git registry; the persistent selection applies project-wide without
166
+ rewriting the current worktree's versioned `.wendkeep.json`.
164
167
 
165
168
  `OBSIDIAN_VAULT_PATH` remains only as legacy/manual CLI compatibility. It is not used to
166
169
  route automatic Codex or Claude hooks and a project-local binding overrides an inherited
package/README.md CHANGED
@@ -161,6 +161,9 @@ paths are also supported. Hooks search upward from the agent's `cwd`, so nested
161
161
  the nearest binding. The vault carries the same identity in `.brain/PROJECT.json`; a mismatch
162
162
  is rejected before any session is written. If no binding exists, hooks fail closed and never
163
163
  create the historical `~/wendkeep-vault` fallback.
164
+ In linked worktrees, `profile use` and `profile status` resolve the main worktree's canonical
165
+ binding through the shared Git registry; the persistent selection applies project-wide without
166
+ rewriting the current worktree's versioned `.wendkeep.json`.
164
167
 
165
168
  `OBSIDIAN_VAULT_PATH` remains only as legacy/manual CLI compatibility. It is not used to
166
169
  route automatic Codex or Claude hooks and a project-local binding overrides an inherited
@@ -138,6 +138,10 @@ ownership to the native LLM harness.
138
138
  missing, ambiguous, or stale context fails closed without a partial mutation.
139
139
  - `.wendkeep.json` stays on `schemaVersion: 1`; the additive field is, for example,
140
140
  `"harness": { "profile": "GOVERN" }`. A legacy binding without it also resolves to `GOVERN`.
141
+ - In a linked worktree, `profile use` and `profile status` use the main worktree's canonical
142
+ binding discovered through the shared Git registry. The selection is persisted once for the
143
+ project and the linked worktree's versioned `.wendkeep.json` remains unchanged, including on
144
+ Windows when long paths and 8.3 aliases identify the same Vault.
141
145
  - A corrupt binding never means `OFF`. When the payload or legacy integration identifies one
142
146
  unambiguous Vault, Keep Core remains active under `GOVERN` and the hook exposes a diagnostic;
143
147
  mutation guards fail closed until the binding is repaired. Invalid local configuration, a
@@ -139,6 +139,10 @@ harness nativo da LLM.
139
139
  ausente, ambíguo ou stale falha fechado sem mutação parcial.
140
140
  - `.wendkeep.json` continua em `schemaVersion: 1`; o campo aditivo usa, por exemplo,
141
141
  `"harness": { "profile": "GOVERN" }`. Binding legado sem o campo também resolve `GOVERN`.
142
+ - Em worktree vinculada, `profile use` e `profile status` usam o binding canônico da worktree
143
+ principal descoberto pelo registry Git compartilhado. A seleção é persistida uma vez para o
144
+ projeto e o `.wendkeep.json` versionado da worktree vinculada permanece intacto, inclusive no
145
+ Windows quando caminhos longos e aliases 8.3 identificam o mesmo Vault.
142
146
  - Binding corrompido nunca equivale a `OFF`. Quando o payload ou a integração legada identifica
143
147
  um Vault inequívoco, o Keep Core continua ativo sob `GOVERN` e o hook expõe um diagnóstico;
144
148
  guards de mutação falham fechados até o binding ser reparado. Configuração local inválida,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wendkeep",
3
- "version": "0.80.1",
3
+ "version": "0.80.2",
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": [
package/src/profile.mjs CHANGED
@@ -13,6 +13,7 @@ import {
13
13
  setSessionTaskOperatingProfile,
14
14
  } from '../hooks/operating-profile-task-store.mjs';
15
15
  import { resolveCommandActiveContext } from './active-context-runtime.mjs';
16
+ import { realpathSync } from 'node:fs';
16
17
  import { resolve } from 'node:path';
17
18
  import { findProjectBinding, resolveProjectVault, updateProjectBinding } from './project-vault.mjs';
18
19
 
@@ -77,7 +78,11 @@ function validateArgv(argv) {
77
78
  }
78
79
 
79
80
  function canonicalPath(value) {
80
- const path = resolve(value).replaceAll('\\', '/');
81
+ const absolute = resolve(value);
82
+ let canonical = absolute;
83
+ try { canonical = realpathSync.native(absolute); }
84
+ catch { /* Preserve comparison support for valid paths that do not exist yet. */ }
85
+ const path = canonical.replaceAll('\\', '/');
81
86
  return process.platform === 'win32' ? path.toLowerCase() : path;
82
87
  }
83
88
 
@@ -114,8 +119,16 @@ function context(argv) {
114
119
  catch (error) {
115
120
  if (!explicitVault) throw error;
116
121
  }
117
- const matchingBinding = binding && canonicalPath(binding.base) === canonicalPath(resolved.base) ? binding : null;
118
- const projectConfig = resolved.config || matchingBinding?.config || {};
122
+ let canonicalBinding = null;
123
+ if (resolved.source === 'worktree-registry' && resolved.projectRoot) {
124
+ canonicalBinding = findProjectBinding(resolved.projectRoot);
125
+ }
126
+ const candidateBinding = canonicalBinding || binding;
127
+ const matchingBinding = candidateBinding
128
+ && canonicalPath(candidateBinding.base) === canonicalPath(resolved.base)
129
+ ? candidateBinding
130
+ : null;
131
+ const projectConfig = matchingBinding?.config || resolved.config || {};
119
132
  return {
120
133
  resolved: {
121
134
  ...resolved,