| 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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"} |
@@ -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"} |
+54
-15
@@ -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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"} |
+1
-1
@@ -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"} |
+12
-0
@@ -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"} |
+13
-2
@@ -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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"} |
+2
-2
| { | ||
| "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
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 2 instances
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
2538462
0.9%199
2.05%50670
0.49%168
5.66%