robrain 2.3.4 → 2.3.5

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.
@@ -202,7 +202,7 @@ export async function installCommand(opts) {
202
202
  planningKey: provisioned.planningKey,
203
203
  embeddingProvider: embeddingProvider ?? 'openai',
204
204
  installedAt: new Date().toISOString(),
205
- version: '2.3.4',
205
+ version: '2.3.5',
206
206
  });
207
207
  spinner.succeed('MCP servers configured');
208
208
  // ── Done ───────────────────────────────────────────────────
@@ -352,7 +352,7 @@ async function installSelfHosted(opts) {
352
352
  ...(perceptionKey ? { perceptionKey } : {}),
353
353
  embeddingProvider: provider,
354
354
  installedAt: new Date().toISOString(),
355
- version: '2.3.4',
355
+ version: '2.3.5',
356
356
  selfHosted: true,
357
357
  });
358
358
  spinner.succeed('MCP servers configured for self-hosted mode');
@@ -2,9 +2,9 @@ import { describe, it } from 'node:test';
2
2
  import assert from 'node:assert/strict';
3
3
  import { ensureStackEnvContent, readEnvValue, renderStackCompose, DEFAULT_IMAGE_REPO } from './up.js';
4
4
  describe('renderStackCompose', () => {
5
- const compose = renderStackCompose(`${DEFAULT_IMAGE_REPO}:2.3.4`);
5
+ const compose = renderStackCompose(`${DEFAULT_IMAGE_REPO}:2.3.5`);
6
6
  it('runs Perception from the published image with an env override hook', () => {
7
- assert.match(compose, /image: \$\{PERCEPTION_IMAGE:-ghcr\.io\/adelinamart\/robrain-perception:2\.3\.4\}/);
7
+ assert.match(compose, /image: \$\{PERCEPTION_IMAGE:-ghcr\.io\/adelinamart\/robrain-perception:2\.3\.5\}/);
8
8
  assert.doesNotMatch(compose, /build:/);
9
9
  });
10
10
  it('mounts the stack-local schema and env file', () => {
package/dist/index.js CHANGED
@@ -28,7 +28,7 @@ import { explainCommand } from './commands/explain.js';
28
28
  import { projectsListCommand, projectsMergeCommand } from './commands/projects.js';
29
29
  import { upCommand, downCommand, DEFAULT_IMAGE_REPO } from './commands/up.js';
30
30
  import { installHermesPlugin, resolveHermesHome } from './lib/hermes-plugin.js';
31
- const VERSION = '2.3.4';
31
+ const VERSION = '2.3.5';
32
32
  program
33
33
  .name('robrain')
34
34
  .description('Institutional memory for AI coding agents — by Rory Plans')
@@ -53,11 +53,11 @@ describe('materializeSensingBundle', () => {
53
53
  it('re-copies when the package version changed', () => {
54
54
  writeFakePackage(pkgDir, '2.2.0', 'old');
55
55
  assert.equal(materializeSensingBundle(pkgDir, mcpDir), true);
56
- writeFakePackage(pkgDir, '2.3.4', 'new');
56
+ writeFakePackage(pkgDir, '2.3.5', 'new');
57
57
  assert.equal(materializeSensingBundle(pkgDir, mcpDir), true);
58
58
  assert.equal(readFileSync(join(mcpDir, 'sensing', 'dist', 'index.js'), 'utf8'), 'new');
59
59
  const marker = JSON.parse(readFileSync(join(mcpDir, 'sensing', 'package.json'), 'utf8'));
60
- assert.equal(marker.version, '2.3.4');
60
+ assert.equal(marker.version, '2.3.5');
61
61
  });
62
62
  it('replaces a symlinked destination from a previous --repo-root install', () => {
63
63
  // Old dev install: ~/.robrain/mcp/sensing -> clone/packages/sensing-mcp
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "robrain",
3
- "version": "2.3.4",
3
+ "version": "2.3.5",
4
4
  "type": "module",
5
5
  "description": "RoBrain CLI for installation, setup, and memory workflows",
6
6
  "author": "Rory Plans, Inc.",
@@ -415,8 +415,20 @@ class RoBrainProvider(MemoryProvider):
415
415
  def save_config(self, values: Dict[str, Any], hermes_home: str) -> None:
416
416
  path = self._config_path(hermes_home)
417
417
  path.parent.mkdir(parents=True, exist_ok=True)
418
+ # Defensive: an interactive-setup mispaste can land the API key in a
419
+ # text field. A base_url that isn't a URL would fail silently later
420
+ # (fail-open hides it), so fall back to the default instead — and
421
+ # never persist something that looks like a pasted secret.
422
+ base_url = str(values.get("base_url") or "").strip()
423
+ if not base_url.startswith(("http://", "https://")):
424
+ if base_url:
425
+ logger.warning(
426
+ "robrain: ignoring non-URL base_url from setup (%r…) — using default",
427
+ base_url[:8],
428
+ )
429
+ base_url = "http://localhost:3001"
418
430
  config = {
419
- "base_url": values.get("base_url") or "http://localhost:3001",
431
+ "base_url": base_url,
420
432
  "project_id": values.get("project_id") or "default",
421
433
  "scope": values.get("scope") or "team",
422
434
  }
@@ -23037,7 +23037,7 @@ function resolveSessionId(raw) {
23037
23037
  function buildServer() {
23038
23038
  const server = new McpServer({
23039
23039
  name: "sensing-mcp",
23040
- version: "2.3.4"
23040
+ version: "2.3.5"
23041
23041
  });
23042
23042
  server.tool(
23043
23043
  "sensing_start_session",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robrain/sensing-mcp",
3
- "version": "2.3.4",
3
+ "version": "2.3.5",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js"