@ouro.bot/cli 0.1.0-alpha.292 → 0.1.0-alpha.293
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.json
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_note": "This changelog is maintained as part of the PR/version-bump workflow. Agent-curated, not auto-generated. Agents read this file directly via read_file to understand what changed between versions.",
|
|
3
3
|
"versions": [
|
|
4
|
+
{
|
|
5
|
+
"version": "0.1.0-alpha.293",
|
|
6
|
+
"changes": [
|
|
7
|
+
"chore(tests): three test-isolation fixes bundled as chain D1 from the follow-up investigation after PR #372 (default.ouro leak). (1) Remove the `agentName = \"default\"` catch fallback in `src/repertoire/credential-access.ts` getCredentialStore() — same silent-leak class as coding/manager.ts, would have routed BuiltInCredentialStore writes to `~/AgentBundles/default.ouro/vault/` and `~/.agentsecrets/default/` on any test hit that didn't mock identity. Hoisted `getAgentName()` out of the outer try/catch so it throws loudly; the remaining try/catch now only guards the bitwarden store wiring (the only code path that has a legitimate fall-through to built-in). Also switched from `require(\"../heart/identity\")` inside the function body to a static ESM import at the top of the file — require() bypasses vitest's module registry so `vi.mock(\"../heart/identity\", ...)` was silently not applying to the old dynamic require; the static import finally lets the existing test mocks intercept. Tests in credential-access.test.ts that had been accidentally leaning on the default fallback now hit the real mock as intended.",
|
|
8
|
+
"chore(tests): fix the tmpbundle leak guard false-positive on daemon-cli.test.ts. The guard was firing on \"ouro CLI parsing > parses primary daemon commands\" every run, but the real cause was `createTmpBundle` being called at describe-scope inside the \"ouro thoughts CLI execution\" suite (line 5662) — synchronous describe callbacks run during test collection, so the handle landed in _liveHandles before ANY test ran. The first afterEach hook (on the first test in the file) then noticed the dangling handle and blamed it. Fix: moved the createTmpBundle call into a beforeAll hook and tagged it `{ shared: true }` so the handle only exists while the thoughts suite is actually running, with afterAll cleanup aligned to it.",
|
|
9
|
+
"chore(tests): extend the tmpbundle leak guard with a `shared: true` opt-in. `TmpBundleHandle` gains a `shared` field, `CreateTmpBundleOptions.shared` defaults to false, and the per-test leak guard in `src/__tests__/nerves/global-capture.ts` now skips shared handles (they're cleaned in afterAll, not after every test). Prevents the class of false positive exposed by the daemon-cli.test.ts fix above.",
|
|
10
|
+
"chore(tests): new runtime prod-path leak guard in `src/__tests__/nerves/global-capture.ts`. Snapshots `~/AgentBundles` entries at worker boot, diffs at worker teardown (afterAll without describe context runs once per worker), force-removes any new entries, and emits a loud console.error naming them. Text-based contract tests can't catch runtime leaks where production code routes a write via a silent fallback (exactly the bug class PR #372 fixed in coding/manager.ts). This runtime guard is the belt to the contract test's suspenders — would have caught the default.ouro leak in the first run instead of requiring my investigation chain."
|
|
11
|
+
]
|
|
12
|
+
},
|
|
4
13
|
{
|
|
5
14
|
"version": "0.1.0-alpha.292",
|
|
6
15
|
"changes": [
|
|
@@ -54,6 +54,7 @@ const path = __importStar(require("node:path"));
|
|
|
54
54
|
const os = __importStar(require("node:os"));
|
|
55
55
|
const node_child_process_1 = require("node:child_process");
|
|
56
56
|
const runtime_1 = require("../nerves/runtime");
|
|
57
|
+
const identity = __importStar(require("../heart/identity"));
|
|
57
58
|
// ---------------------------------------------------------------------------
|
|
58
59
|
// Helpers
|
|
59
60
|
// ---------------------------------------------------------------------------
|
|
@@ -459,14 +460,25 @@ function ensureVaultDefaults(agentName, agentRoot, existingVault) {
|
|
|
459
460
|
function getCredentialStore() {
|
|
460
461
|
if (_store)
|
|
461
462
|
return _store;
|
|
462
|
-
|
|
463
|
+
// Resolve identity up front. The previous implementation wrapped this call
|
|
464
|
+
// in a try/catch that silently fell back to `agentName = "default"`, which
|
|
465
|
+
// meant any test that hit getCredentialStore() without mocking identity
|
|
466
|
+
// silently constructed a BuiltInCredentialStore("default") routing writes
|
|
467
|
+
// to `~/AgentBundles/default.ouro/vault/` and `~/.agentsecrets/default/`.
|
|
468
|
+
// Same silent-leak class we just fixed in coding/manager.ts. No fallback:
|
|
469
|
+
// getAgentName() throws loudly if argv lacks --agent, which is correct for
|
|
470
|
+
// the only caller (production agents with a real identity). Uses the
|
|
471
|
+
// static ESM import above instead of `require("../heart/identity")` so
|
|
472
|
+
// `vi.mock("../heart/identity", ...)` in tests actually intercepts the
|
|
473
|
+
// call — require() bypasses vitest's module registry.
|
|
474
|
+
const agentName = identity.getAgentName();
|
|
475
|
+
const agentRoot = identity.getAgentRoot(agentName);
|
|
476
|
+
// Try to load vault config from agent.json + secrets.json. Only this block
|
|
477
|
+
// is defended with try/catch — bitwarden wiring can legitimately fail
|
|
478
|
+
// (missing vault config, no bw CLI, unreachable server) and the fallback
|
|
479
|
+
// to BuiltInCredentialStore is the intended behavior.
|
|
463
480
|
let backend = "built-in";
|
|
464
481
|
try {
|
|
465
|
-
// Dynamic import to avoid circular dependency at module level
|
|
466
|
-
const identity = require("../heart/identity");
|
|
467
|
-
agentName = identity.getAgentName();
|
|
468
|
-
const agentRoot = identity.getAgentRoot(agentName);
|
|
469
|
-
// Try to load vault config from agent.json + secrets.json
|
|
470
482
|
const config = identity.loadAgentConfig?.();
|
|
471
483
|
// Auto-configure vault defaults if missing
|
|
472
484
|
const vaultSection = ensureVaultDefaults(agentName, agentRoot, config?.vault);
|
|
@@ -495,7 +507,7 @@ function getCredentialStore() {
|
|
|
495
507
|
/* v8 ignore stop */
|
|
496
508
|
}
|
|
497
509
|
catch {
|
|
498
|
-
|
|
510
|
+
// Bitwarden wiring failed — fall through to built-in store below.
|
|
499
511
|
}
|
|
500
512
|
/* v8 ignore next -- false branch only reachable when BitwardenCredentialStore was created above @preserve */
|
|
501
513
|
if (!_store) {
|
|
@@ -505,7 +517,7 @@ function getCredentialStore() {
|
|
|
505
517
|
event: "repertoire.credential_store_init",
|
|
506
518
|
component: "repertoire",
|
|
507
519
|
message: "credential store initialized",
|
|
508
|
-
meta: { backend, agentName
|
|
520
|
+
meta: { backend, agentName },
|
|
509
521
|
});
|
|
510
522
|
return _store;
|
|
511
523
|
}
|