🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

robrain

Package Overview
Dependencies
Maintainers
1
Versions
33
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

robrain - npm Package Compare versions

Comparing version
2.4.6
to
2.4.7
+2
dist/commands/synth.test.d.ts
export {};
//# sourceMappingURL=synth.test.d.ts.map
{"version":3,"file":"synth.test.d.ts","sourceRoot":"","sources":["../../src/commands/synth.test.ts"],"names":[],"mappings":""}
import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
import { tmpdir } from 'node:os';
import { join } from 'node:path';
import { after, describe, it } from 'node:test';
import assert from 'node:assert/strict';
// config.ts resolves homedir() at import time — pin a hermetic HOME (and kill
// colour, so assertions match plain substrings) BEFORE the dynamic imports.
const fakeHome = mkdtempSync(join(tmpdir(), 'robrain-synth-'));
process.env.HOME = fakeHome;
process.env.FORCE_COLOR = '0';
mkdirSync(join(fakeHome, '.robrain'), { recursive: true });
// A directory that is deliberately NOT a robrain checkout. Entry resolution
// fails fast there, which is what makes this file hermetic: a run that reached
// resolution is distinguishable from one the cloud guard short-circuited —
// and neither ever spawns Synthesis or touches a database.
const notACheckout = join(fakeHome, 'not-a-checkout');
mkdirSync(notACheckout, { recursive: true });
process.env.ROBRAIN_REPO = notACheckout;
// Ambient DATABASE_URL would flip the mode routing below — own it per test.
delete process.env.DATABASE_URL;
const { isCloudInstall } = await import('../lib/config.js');
const { synthCommand } = await import('./synth.js');
function writeInstallConfig(config) {
writeFileSync(join(fakeHome, '.robrain', 'config.json'), JSON.stringify(config));
}
/** Run `robrain synth` with console captured and a clean exit code. */
async function runSynth() {
const lines = [];
const { log, error } = console;
console.log = (...args) => { lines.push(args.join(' ')); };
console.error = (...args) => { lines.push(args.join(' ')); };
process.exitCode = 0;
try {
await synthCommand({});
}
finally {
console.log = log;
console.error = error;
}
const exitCode = Number(process.exitCode ?? 0);
process.exitCode = 0;
return { out: lines.join('\n'), exitCode };
}
const CLOUD_MESSAGE = 'Synthesis runs server-side on Rory Plans cloud';
const RESOLVE_FAILURE = 'does not look like a robrain checkout';
after(() => {
rmSync(fakeHome, { recursive: true, force: true });
});
describe('isCloudInstall', () => {
it('is true for a cloud thin-client install', () => {
writeInstallConfig({ token: 'rory_x', email: 'dev@example.com', thin: true });
assert.equal(isCloudInstall(), true);
});
it('is false for a self-hosted install', () => {
writeInstallConfig({ selfHosted: true, perceptionUrl: 'http://127.0.0.1:3001' });
assert.equal(isCloudInstall(), false);
});
it('is false when a cloud login also runs a local stack (selfHosted wins)', () => {
// `robrain up` merges selfHosted onto an existing cloud config — that user
// does have a local Postgres, so synth must stay available to them.
writeInstallConfig({ token: 'rory_x', thin: true, selfHosted: true });
assert.equal(isCloudInstall(), false);
});
it('is true for a legacy cloud install that predates the thin flag', () => {
// Cloud installs before `thin` existed carry only token/email. Nothing
// self-hosted writes a Rory token, so token-without-thin means cloud.
writeInstallConfig({ token: 'rory_x', email: 'dev@example.com', perceptionUrl: 'https://api.roryplans.ai' });
assert.equal(isCloudInstall(), true);
});
it('is false for a legacy self-hosted install with no flags', () => {
// Pre-`selfHosted` installs: Perception configured, never logged into Rory.
writeInstallConfig({ perceptionUrl: 'http://127.0.0.1:3001', installedAt: '2026-01-01T00:00:00Z' });
assert.equal(isCloudInstall(), false);
});
it('is false with no config at all', () => {
writeInstallConfig({});
assert.equal(isCloudInstall(), false);
});
});
describe('robrain synth — install mode routing', () => {
it('explains itself and exits 0 on a cloud install', async () => {
writeInstallConfig({ token: 'rory_x', email: 'dev@example.com', thin: true });
const { out, exitCode } = await runSynth();
assert.match(out, new RegExp(CLOUD_MESSAGE));
assert.match(out, /npx robrain review/); // says where results DO surface
assert.match(out, /npx robrain up/); // …and how to opt into a local pass
assert.equal(exitCode, 0, 'a cloud install is not an error state');
// The guard must short-circuit BEFORE entry resolution — otherwise a cloud
// user still eats a resolution/DATABASE_URL failure.
assert.doesNotMatch(out, new RegExp(RESOLVE_FAILURE));
});
it('runs the normal path on a self-hosted install', async () => {
writeInstallConfig({ selfHosted: true, perceptionUrl: 'http://127.0.0.1:3001' });
const { out, exitCode } = await runSynth();
// Same environment as the cloud case — only the install mode differs, and
// here we reach entry resolution (which this fake HOME makes fail cleanly).
assert.match(out, new RegExp(RESOLVE_FAILURE));
assert.doesNotMatch(out, new RegExp(CLOUD_MESSAGE));
assert.equal(exitCode, 1, 'a real synth failure must stay non-zero for scripts');
});
it('still runs when a stale cloud token sits on top of a real DATABASE_URL', async () => {
// Logged into Rory once, never logged out, now self-hosting by hand (no
// `robrain up`, so no selfHosted flag). Refusing here would tell someone
// with a working local store that there is nothing to run — silently, and
// with exit 0. A store you can point at wins over a leftover token.
writeInstallConfig({ token: 'rory_stale', email: 'dev@example.com', thin: true });
process.env.DATABASE_URL = 'postgres://robrain:pw@127.0.0.1:5432/robrain';
try {
const { out, exitCode } = await runSynth();
assert.doesNotMatch(out, new RegExp(CLOUD_MESSAGE));
assert.match(out, new RegExp(RESOLVE_FAILURE)); // reached resolution = would have run
assert.equal(exitCode, 1);
}
finally {
delete process.env.DATABASE_URL;
}
});
it('counts a resolved checkout\'s .env as a local store, like the child would', async () => {
// The narrow case the config-only guard still got wrong: cloud token, no
// `robrain up`, DATABASE_URL living ONLY in a checkout's .env — a file the
// parent never reads but the child's own loadEnv does. Declining here
// refuses work that would have succeeded.
const checkout = join(fakeHome, 'checkout');
const distDir = join(checkout, 'packages', 'synthesis', 'dist');
mkdirSync(distDir, { recursive: true });
// Stand-in for the Synthesis bundle: records the DATABASE_URL it was
// handed, so this asserts what the child actually got — not just that the
// parent decided to spawn. CJS on purpose (no package.json type here).
const marker = join(fakeHome, 'child-saw.txt');
writeFileSync(join(distDir, 'index.js'), `require('fs').writeFileSync(${JSON.stringify(marker)}, String(process.env.DATABASE_URL))\n`);
const repoDbUrl = 'postgres://robrain:pw@127.0.0.1:5432/from_checkout_env';
writeFileSync(join(checkout, '.env'), `DATABASE_URL=${repoDbUrl}\n`);
writeInstallConfig({ token: 'rory_stale', email: 'dev@example.com', thin: true });
process.env.ROBRAIN_REPO = checkout;
try {
const { out, exitCode } = await runSynth();
assert.doesNotMatch(out, new RegExp(CLOUD_MESSAGE), 'a store in the checkout .env must win over the token');
assert.equal(exitCode, 0);
assert.equal(readFileSync(marker, 'utf8'), repoDbUrl, 'child must receive the checkout .env DATABASE_URL');
}
finally {
process.env.ROBRAIN_REPO = notACheckout;
}
});
it('prefers the cloud explanation over a resolution failure', async () => {
// A cloud install has no local Synthesis to find — "we could not locate the
// bundle" is a true but useless answer; the mode is the actual reason.
writeInstallConfig({ token: 'rory_x', email: 'dev@example.com', thin: true });
const { out, exitCode } = await runSynth();
assert.match(out, new RegExp(CLOUD_MESSAGE));
assert.doesNotMatch(out, new RegExp(RESOLVE_FAILURE));
assert.equal(exitCode, 0);
});
it('names the stale-token escape hatch when it does decline', async () => {
writeInstallConfig({ token: 'rory_stale', email: 'dev@example.com', thin: true });
const { out } = await runSynth();
assert.match(out, /npx robrain logout/);
assert.match(out, /DATABASE_URL/);
});
});
//# sourceMappingURL=synth.test.js.map
{"version":3,"file":"synth.test.js","sourceRoot":"","sources":["../../src/commands/synth.test.ts"],"names":[],"mappings":"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"}
+2
-2

@@ -219,3 +219,3 @@ // src/commands/install.ts

installedAt: new Date().toISOString(),
version: '2.4.6',
version: '2.4.7',
});

@@ -408,3 +408,3 @@ spinner.succeed('MCP servers configured');

installedAt: new Date().toISOString(),
version: '2.4.6',
version: '2.4.7',
selfHosted: true,

@@ -411,0 +411,0 @@ });

@@ -1,1 +0,1 @@

{"version":3,"file":"synth.d.ts","sourceRoot":"","sources":["../../src/commands/synth.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2FAA2F;IAC3F,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDpE"}
{"version":3,"file":"synth.d.ts","sourceRoot":"","sources":["../../src/commands/synth.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2FAA2F;IAC3F,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsFpE"}

@@ -14,3 +14,4 @@ // packages/cli/src/commands/synth.ts

import chalk from 'chalk';
import { applyStackEnvFallback } from '../lib/load-env.js';
import { isCloudInstall } from '../lib/config.js';
import { applyEnvFileFallback, applyStackEnvFallback } from '../lib/load-env.js';
import { resolveSynthesisEntry, SynthesisResolveError } from '../lib/synthesis-bundle.js';

@@ -23,14 +24,2 @@ /** Absolute path to this CLI's `bin/robrain.js` (checkout or published layout). */

export async function synthCommand(opts) {
let resolved;
try {
resolved = resolveSynthesisEntry();
}
catch (err) {
if (err instanceof SynthesisResolveError) {
console.error(chalk.red(`✗ robrain synth: ${err.message}`));
process.exitCode = 1;
return;
}
throw err;
}
const env = { ...process.env };

@@ -46,2 +35,46 @@ // Env precedence for the child, lowest to highest — two deliberate layers:

applyStackEnvFallback(env);
// Resolve before deciding: a resolved checkout's `.env` is a store the child
// would find via its own loadEnv, so it has to count as "there is a local
// store" — otherwise we decline work that would have succeeded. Errors are
// held, not thrown: on a cloud install "no local Synthesis" is the expected
// state, and the message below beats a resolution failure.
let resolved;
let resolveError;
try {
resolved = resolveSynthesisEntry();
}
catch (err) {
if (!(err instanceof SynthesisResolveError))
throw err;
resolveError = err;
}
if (resolved?.repoRoot)
applyEnvFileFallback(env, join(resolved.repoRoot, '.env'));
// Synthesis is a batch job that opens the decision store directly — there is
// no local store on a cloud install, and judgment already runs server-side.
// Without this the spawned bundle dies on `Missing env var: DATABASE_URL`,
// which reads like a broken install rather than "this command isn't yours".
//
// A reachable DATABASE_URL overrides the install mode on purpose: a stale
// cloud token (logged in once, never `logout`) must not talk someone out of
// running the pass over a store they demonstrably have. Config decides only
// when there is no store to point at.
if (isCloudInstall() && !env.DATABASE_URL) {
console.log();
console.log(chalk.yellow(' Synthesis runs server-side on Rory Plans cloud — nothing to run locally.'));
console.log(chalk.dim(' Its results reach you the same way as everything else: the always-on'));
console.log(chalk.dim(' summary at session start, and ') + chalk.cyan('npx robrain review') + chalk.dim('.'));
console.log();
console.log(chalk.dim(' Self-hosting instead? Start your stack with ') + chalk.cyan('npx robrain up')
+ chalk.dim(' (or set DATABASE_URL).'));
console.log(chalk.dim(' Seeing this after switching off cloud? The install still holds a Rory'));
console.log(chalk.dim(' token — ') + chalk.cyan('npx robrain logout') + chalk.dim(' clears it.'));
console.log();
return;
}
if (resolveError || !resolved) {
console.error(chalk.red(`✗ robrain synth: ${resolveError?.message ?? 'could not resolve the Synthesis bundle.'}`));
process.exitCode = 1;
return;
}
if (opts.dryRun)

@@ -71,7 +104,13 @@ env.SYNTHESIS_DRY_RUN = 'true';

});
await new Promise((res, rej) => {
// The child inherits stdio, so it has already printed whatever went wrong —
// rethrowing here just stacks a second (useless) Node trace on top of it.
const code = await new Promise((res, rej) => {
child.on('error', rej);
child.on('exit', code => code === 0 ? res() : rej(new Error(`synthesis exited with code ${code}`)));
child.on('exit', c => res(c ?? 1));
});
if (code !== 0) {
console.error(chalk.red(`\n✗ Synthesis failed (exit ${code}) — see the error above.`));
process.exitCode = code;
}
}
//# sourceMappingURL=synth.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"synth.js","sourceRoot":"","sources":["../../src/commands/synth.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"synth.js","sourceRoot":"","sources":["../../src/commands/synth.ts"],"names":[],"mappings":"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"}

@@ -33,3 +33,3 @@ #!/usr/bin/env node

import { installHermesPlugin, resolveHermesHome } from './lib/hermes-plugin.js';
const VERSION = '2.4.6';
const VERSION = '2.4.7';
program

@@ -36,0 +36,0 @@ .name('robrain')

@@ -28,4 +28,11 @@ export interface RoMemoryConfig {

export declare function isAuthenticated(): boolean;
/**
* True when this install talks to the managed Rory Plans API rather than a
* local stack — i.e. there is no local Postgres for batch jobs to open.
* `selfHosted` wins: `robrain up` merges that flag in, so a user who has both
* a cloud login and a local stack still counts as self-hosted.
*/
export declare function isCloudInstall(): boolean;
export declare function getToken(): string | undefined;
export declare const RORY_API_BASE: string;
//# sourceMappingURL=config.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAW,MAAM,CAAA;IACvB,KAAK,CAAC,EAAW,MAAM,CAAA;IACvB,2DAA2D;IAC3D,UAAU,CAAC,EAAM,OAAO,CAAA;IACxB,2FAA2F;IAC3F,IAAI,CAAC,EAAY,OAAO,CAAA;IACxB,aAAa,CAAC,EAAG,MAAM,CAAA;IACvB,aAAa,CAAC,EAAG,MAAM,CAAA;IACvB,WAAW,CAAC,EAAK,MAAM,CAAA;IACvB,WAAW,CAAC,EAAK,MAAM,CAAA;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,YAAY,CAAC,EAAI,MAAM,CAAA;IACvB,WAAW,CAAC,EAAK,MAAM,CAAA;IACvB,OAAO,CAAC,EAAS,MAAM,CAAA;CACxB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAWxD;AAED,wBAAgB,UAAU,IAAI,cAAc,CAS3C;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAKxD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAGlE;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,IAAI,OAAO,CAWzC;AAED,wBAAgB,QAAQ,IAAI,MAAM,GAAG,SAAS,CAE7C;AAGD,eAAO,MAAM,aAAa,QAA0D,CAAA"}
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAW,MAAM,CAAA;IACvB,KAAK,CAAC,EAAW,MAAM,CAAA;IACvB,2DAA2D;IAC3D,UAAU,CAAC,EAAM,OAAO,CAAA;IACxB,2FAA2F;IAC3F,IAAI,CAAC,EAAY,OAAO,CAAA;IACxB,aAAa,CAAC,EAAG,MAAM,CAAA;IACvB,aAAa,CAAC,EAAG,MAAM,CAAA;IACvB,WAAW,CAAC,EAAK,MAAM,CAAA;IACvB,WAAW,CAAC,EAAK,MAAM,CAAA;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,YAAY,CAAC,EAAI,MAAM,CAAA;IACvB,WAAW,CAAC,EAAK,MAAM,CAAA;IACvB,OAAO,CAAC,EAAS,MAAM,CAAA;CACxB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAWxD;AAED,wBAAgB,UAAU,IAAI,cAAc,CAS3C;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAKxD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAGlE;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,IAAI,OAAO,CAWzC;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAIxC;AAED,wBAAgB,QAAQ,IAAI,MAAM,GAAG,SAAS,CAE7C;AAGD,eAAO,MAAM,aAAa,QAA0D,CAAA"}

@@ -65,2 +65,14 @@ // src/lib/config.ts

}
/**
* True when this install talks to the managed Rory Plans API rather than a
* local stack — i.e. there is no local Postgres for batch jobs to open.
* `selfHosted` wins: `robrain up` merges that flag in, so a user who has both
* a cloud login and a local stack still counts as self-hosted.
*/
export function isCloudInstall() {
const config = readConfig();
if (config.selfHosted)
return false;
return Boolean(config.thin || config.token);
}
export function getToken() {

@@ -67,0 +79,0 @@ return readConfig().token;

@@ -1,1 +0,1 @@

{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,gEAAgE;AAChE,gEAAgE;AAChE,sEAAsE;AACtE,gEAAgE;AAEhE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,MAAM,UAAU,GAAI,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAA;AAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;AAmBnD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;QACtB,IAAI,CAAC,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;YAC/B,CAAC,CAAC,QAAQ,GAAG,WAAW,CAAA;YACxB,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACxC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAA;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAmB,CAAA;QAC9E,IAAI,MAAM,CAAC,aAAa;YAAE,MAAM,CAAC,aAAa,GAAG,oBAAoB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QAC3F,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAsB;IAChD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5C,CAAC;IACD,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;AACrE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAgC;IAC1D,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;IAC5B,WAAW,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;AACzC,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IAC7C,IAAI,MAAM,CAAC,UAAU;QAAE,OAAO,IAAI,CAAA;IAClC,2FAA2F;IAC3F,OAAO,OAAO,CACZ,MAAM,CAAC,aAAa;QAClB,MAAM,CAAC,WAAW;QAClB,CAAC,MAAM,CAAC,KAAK;QACb,CAAC,MAAM,CAAC,KAAK,CAChB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,UAAU,EAAE,CAAC,KAAK,CAAA;AAC3B,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,0BAA0B,CAAA"}
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}

@@ -12,2 +12,11 @@ /** Merge `.env` into `process.env` for CLI commands (install, inject, status, ...). */

/**
* Fill vars still unset/empty in `env` from an arbitrary `.env` file; no-op
* when it does not exist. Gaps only — never overrides what `env` already has.
*
* Lets a parent process see the same values a child that runs its own
* `loadEnv(<root>)` would (e.g. `robrain synth` deciding whether a store
* exists before spawning Synthesis against a checkout it resolved).
*/
export declare function applyEnvFileFallback(env: NodeJS.ProcessEnv, envPath: string): void;
/**
* When running the CLI from a git checkout (e.g. `node packages/cli/bin/robrain.js`),

@@ -14,0 +23,0 @@ * find that checkout's root so repo `.env` matches `pnpm docker:up` / docker-compose.

@@ -1,1 +0,1 @@

{"version":3,"file":"load-env.d.ts","sourceRoot":"","sources":["../../src/lib/load-env.ts"],"names":[],"mappings":"AAiDA,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAIlD;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,YAAY,SAA+C,GAC1D,IAAI,CAON;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,IAAI,MAAM,GAAG,SAAS,CAclE;AAED,6FAA6F;AAC7F,wBAAgB,+BAA+B,IAAI,MAAM,GAAG,SAAS,CASpE;AAED,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAO/E"}
{"version":3,"file":"load-env.d.ts","sourceRoot":"","sources":["../../src/lib/load-env.ts"],"names":[],"mappings":"AAiDA,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAIlD;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,YAAY,SAA+C,GAC1D,IAAI,CAEN;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAOlF;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,IAAI,MAAM,GAAG,SAAS,CAclE;AAED,6FAA6F;AAC7F,wBAAgB,+BAA+B,IAAI,MAAM,GAAG,SAAS,CASpE;AAED,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAO/E"}

@@ -53,5 +53,16 @@ // Merge repo-root / cwd `.env` for all CLI commands without overriding non-empty shell values.

export function applyStackEnvFallback(env, stackEnvPath = join(homedir(), '.robrain', 'stack', '.env')) {
if (!existsSync(stackEnvPath))
applyEnvFileFallback(env, stackEnvPath);
}
/**
* Fill vars still unset/empty in `env` from an arbitrary `.env` file; no-op
* when it does not exist. Gaps only — never overrides what `env` already has.
*
* Lets a parent process see the same values a child that runs its own
* `loadEnv(<root>)` would (e.g. `robrain synth` deciding whether a store
* exists before spawning Synthesis against a checkout it resolved).
*/
export function applyEnvFileFallback(env, envPath) {
if (!existsSync(envPath))
return;
const parsed = dotenvParse().parse(readFileSync(stackEnvPath));
const parsed = dotenvParse().parse(readFileSync(envPath));
for (const [key, value] of Object.entries(parsed)) {

@@ -58,0 +69,0 @@ if (!isUnsetOrEmptyShell(env[key]) || value === '')

@@ -1,1 +0,1 @@

{"version":3,"file":"load-env.js","sourceRoot":"","sources":["../../src/lib/load-env.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"load-env.js","sourceRoot":"","sources":["../../src/lib/load-env.ts"],"names":[],"mappings":"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"}
{
"name": "robrain",
"version": "2.4.6",
"version": "2.4.7",
"type": "module",

@@ -60,3 +60,3 @@ "description": "RoBrain CLI for installation, setup, and memory workflows",

"typecheck": "tsc --noEmit",
"test": "pnpm build && node --test dist/lib/editor.codex.test.js dist/lib/editor.stale-block.test.js dist/lib/release-guard.test.js dist/lib/mcp-bundle.test.js dist/lib/control-bundle.test.js dist/lib/claude-plugin.test.js dist/lib/hermes-plugin.test.js dist/lib/codex-hooks.test.js dist/commands/outcomes.test.js dist/commands/export-interchange.test.js dist/commands/up.test.js dist/commands/mcp.test.js dist/commands/install.test.js dist/lib/synthesis-bundle.test.js",
"test": "pnpm build && node --test dist/lib/editor.codex.test.js dist/lib/editor.stale-block.test.js dist/lib/release-guard.test.js dist/lib/mcp-bundle.test.js dist/lib/control-bundle.test.js dist/lib/claude-plugin.test.js dist/lib/hermes-plugin.test.js dist/lib/codex-hooks.test.js dist/commands/outcomes.test.js dist/commands/export-interchange.test.js dist/commands/up.test.js dist/commands/mcp.test.js dist/commands/install.test.js dist/commands/synth.test.js dist/lib/synthesis-bundle.test.js",
"pack:verify": "node scripts/verify-publish-tarball.mjs",

@@ -63,0 +63,0 @@ "postinstall": "node scripts/chmod-bin.cjs"

{
"name": "@robrain/sensing-mcp",
"version": "2.4.6",
"version": "2.4.7",
"private": true,

@@ -5,0 +5,0 @@ "type": "module",

{
"name": "@robrain/synthesis",
"version": "2.4.6",
"version": "2.4.7",
"private": true,

@@ -5,0 +5,0 @@ "type": "module",

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display