robrain 2.0.0 → 2.3.0

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.
Files changed (51) hide show
  1. package/dist/commands/doctor.d.ts +2 -0
  2. package/dist/commands/doctor.d.ts.map +1 -0
  3. package/dist/commands/doctor.js +195 -0
  4. package/dist/commands/doctor.js.map +1 -0
  5. package/dist/commands/export-interchange.d.ts +62 -0
  6. package/dist/commands/export-interchange.d.ts.map +1 -0
  7. package/dist/commands/export-interchange.js +109 -0
  8. package/dist/commands/export-interchange.js.map +1 -0
  9. package/dist/commands/export-interchange.test.d.ts +2 -0
  10. package/dist/commands/export-interchange.test.d.ts.map +1 -0
  11. package/dist/commands/export-interchange.test.js +94 -0
  12. package/dist/commands/export-interchange.test.js.map +1 -0
  13. package/dist/commands/inject.d.ts.map +1 -1
  14. package/dist/commands/inject.js +12 -1
  15. package/dist/commands/inject.js.map +1 -1
  16. package/dist/commands/install.d.ts.map +1 -1
  17. package/dist/commands/install.js +29 -21
  18. package/dist/commands/install.js.map +1 -1
  19. package/dist/commands/outcomes.d.ts +41 -0
  20. package/dist/commands/outcomes.d.ts.map +1 -0
  21. package/dist/commands/outcomes.js +274 -0
  22. package/dist/commands/outcomes.js.map +1 -0
  23. package/dist/commands/outcomes.test.d.ts +2 -0
  24. package/dist/commands/outcomes.test.d.ts.map +1 -0
  25. package/dist/commands/outcomes.test.js +118 -0
  26. package/dist/commands/outcomes.test.js.map +1 -0
  27. package/dist/commands/review.d.ts.map +1 -1
  28. package/dist/commands/review.js +24 -0
  29. package/dist/commands/review.js.map +1 -1
  30. package/dist/commands/up.d.ts +34 -0
  31. package/dist/commands/up.d.ts.map +1 -0
  32. package/dist/commands/up.js +257 -0
  33. package/dist/commands/up.js.map +1 -0
  34. package/dist/commands/up.test.d.ts +2 -0
  35. package/dist/commands/up.test.d.ts.map +1 -0
  36. package/dist/commands/up.test.js +70 -0
  37. package/dist/commands/up.test.js.map +1 -0
  38. package/dist/index.js +65 -5
  39. package/dist/index.js.map +1 -1
  40. package/dist/lib/mcp-bundle.d.ts +46 -4
  41. package/dist/lib/mcp-bundle.d.ts.map +1 -1
  42. package/dist/lib/mcp-bundle.js +99 -10
  43. package/dist/lib/mcp-bundle.js.map +1 -1
  44. package/dist/lib/mcp-bundle.test.d.ts +2 -0
  45. package/dist/lib/mcp-bundle.test.d.ts.map +1 -0
  46. package/dist/lib/mcp-bundle.test.js +85 -0
  47. package/dist/lib/mcp-bundle.test.js.map +1 -0
  48. package/dist/lib/project.d.ts.map +1 -1
  49. package/dist/lib/project.js +17 -1
  50. package/dist/lib/project.js.map +1 -1
  51. package/package.json +3 -2
package/dist/index.js CHANGED
@@ -8,6 +8,7 @@
8
8
  // install Authenticate + wire MCP servers into your editors
9
9
  // init-project Warm-start memory from existing codebase
10
10
  // status Show auth status + service health
11
+ // doctor Diagnose install, editor wiring, keys, and service health
11
12
  // rule Add / list / remove explicit Planning rules
12
13
  // logout Clear local credentials
13
14
  // ─────────────────────────────────────────────────────────────
@@ -16,13 +17,17 @@ import { loadCliEnv } from './lib/load-env.js';
16
17
  import { installCommand } from './commands/install.js';
17
18
  import { initProjectCommand } from './commands/init-project.js';
18
19
  import { statusCommand, ruleCommand, logoutCommand } from './commands/status.js';
20
+ import { doctorCommand } from './commands/doctor.js';
19
21
  import { reviewCommand } from './commands/review.js';
20
22
  import { injectCommand } from './commands/inject.js';
21
23
  import { synthCommand } from './commands/synth.js';
22
24
  import { exportMemoryCommand } from './commands/export-memory.js';
25
+ import { exportInterchangeCommand } from './commands/export-interchange.js';
26
+ import { outcomesScanCommand, outcomesRecordCommand } from './commands/outcomes.js';
23
27
  import { explainCommand } from './commands/explain.js';
24
28
  import { projectsListCommand, projectsMergeCommand } from './commands/projects.js';
25
- const VERSION = '2.0.0';
29
+ import { upCommand, downCommand, DEFAULT_IMAGE_REPO } from './commands/up.js';
30
+ const VERSION = '2.3.0';
26
31
  program
27
32
  .name('robrain')
28
33
  .description('Institutional memory for AI coding agents — by Rory Plans')
@@ -95,6 +100,49 @@ program
95
100
  .action(async (opts) => {
96
101
  await exportMemoryCommand(opts);
97
102
  });
103
+ // ── export — machine-readable interchange dump ────────────────
104
+ program
105
+ .command('export')
106
+ .description('Export the decision corpus as JSONL for other agent-memory tools (robrain-memory/v1)')
107
+ .option('--format <format>', 'Export format (default: interchange)', 'interchange')
108
+ .option('--out <file>', 'Write to a file instead of stdout')
109
+ .option('--cwd <path>', 'Project root for project-id derivation (default: current directory)')
110
+ .option('--project-id <id>', 'Perception project id when it differs from the path-derived id')
111
+ .action(async (opts) => {
112
+ await exportInterchangeCommand(opts);
113
+ });
114
+ // ── outcomes — real-world outcome feedback ────────────────────
115
+ const outcomesCmd = program
116
+ .command('outcomes')
117
+ .description('Scan git history for reverts of stored decisions and feed outcomes back into memory')
118
+ .option('--since <ref|date>', 'Scan reverts since a git ref or date (default: "30 days ago")')
119
+ .option('--dry-run', 'Show matched decisions without recording outcomes')
120
+ .action(async (opts) => {
121
+ await outcomesScanCommand(opts);
122
+ });
123
+ outcomesCmd
124
+ .command('record <decision-id>')
125
+ .description('Manually record an outcome for a decision')
126
+ .requiredOption('--outcome <type>', 'revert | incident | confirmed')
127
+ .option('--evidence <text>', 'Supporting evidence (commit hash, incident link, note)')
128
+ .action(async (decisionId, opts) => {
129
+ await outcomesRecordCommand(decisionId, opts);
130
+ });
131
+ // ── up / down — clone-free self-hosted stack ──────────────────
132
+ program
133
+ .command('up')
134
+ .description('Start the self-hosted Perception stack (Postgres + Perception) from the published Docker image — no repo clone needed')
135
+ .option('--tag <tag>', `Perception image tag (default: CLI version ${VERSION})`)
136
+ .option('--image <image>', `Full image override (default: ${DEFAULT_IMAGE_REPO}:<tag>)`)
137
+ .action(async (opts) => {
138
+ await upCommand({ tag: opts.tag, image: opts.image, cliVersion: VERSION });
139
+ });
140
+ program
141
+ .command('down')
142
+ .description('Stop the self-hosted Perception stack started by robrain up (data volume is preserved)')
143
+ .action(async () => {
144
+ await downCommand();
145
+ });
98
146
  // ── install ───────────────────────────────────────────────────
99
147
  program
100
148
  .command('install')
@@ -147,6 +195,13 @@ program
147
195
  .action(async () => {
148
196
  await statusCommand();
149
197
  });
198
+ // ── doctor ────────────────────────────────────────────────────
199
+ program
200
+ .command('doctor')
201
+ .description('Diagnose the full setup: install config, MCP bundle, editor wiring, keys, Perception health, project registration')
202
+ .action(async () => {
203
+ await doctorCommand();
204
+ });
150
205
  // ── rule ──────────────────────────────────────────────────────
151
206
  program
152
207
  .command('rule')
@@ -176,18 +231,23 @@ program.hook('preAction', (_thisCommand, actionCommand) => {
176
231
  loadCliEnv(repoRoot);
177
232
  });
178
233
  program.addHelpText('afterAll', `
179
- Self-hosted quick start:
180
- pnpm install && pnpm build In the robrain clone (builds sensing-mcp before install)
181
- pnpm docker:up Start Postgres + Perception
182
- npx robrain install --self-hosted --repo-root <robrain-clone> Wire Sensing (needs built MCP bundle)
234
+ Self-hosted quick start (no clone needed):
235
+ npx robrain up Start Postgres + Perception from the published image
236
+ npx robrain install --self-hosted Wire Sensing MCP into your editors
183
237
  npx robrain init-project Warm-start memory from codebase
238
+ npx robrain doctor Something not capturing? Diagnose the whole setup
184
239
  npx robrain review Review captured decisions
185
240
  npx robrain inject --query "..." --copy Get context to paste into Claude Code
186
241
  npx robrain export-memory Project approved decisions into Claude Code auto-memory
187
242
  npx robrain export-memory --ledger Also write git-committed decisions.md in the project
188
243
  npx robrain explain src/store/cart.ts Why does this file look this way?
244
+ npx robrain outcomes --dry-run Match git reverts against stored decisions
245
+ npx robrain export --format interchange Dump memories as portable JSONL (robrain-memory/v1)
189
246
  npx robrain synth --dry-run Run Synthesis from the robrain clone (needs DATABASE_URL + ANTHROPIC_API_KEY)
190
247
 
248
+ From a robrain clone instead (dev): pnpm install && pnpm build, pnpm docker:up,
249
+ then npx robrain install --self-hosted --repo-root <robrain-clone>.
250
+
191
251
  Cloud quick start (automatic injection, no paste):
192
252
  npx robrain install --token YOUR_TOKEN Authenticate with Rory Plans
193
253
  npx robrain init-project Warm-start memory
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,56 @@
1
1
  export declare class McpBundleError extends Error {
2
2
  name: string;
3
3
  }
4
- /** True when ~/.robrain/mcp/sensing/dist/index.js exists and is readable. */
4
+ /**
5
+ * True only when a *complete* Sensing bundle is present — both the entrypoint and
6
+ * a package.json declaring ESM. The package.json check is load-bearing: Node treats
7
+ * a bare `.js` without `"type": "module"` as CommonJS and throws on the bundle's
8
+ * `import` statements before any tool registers. A previous half-finished copy
9
+ * (entrypoint present, package.json missing) must therefore read as NOT ready so
10
+ * the install re-materializes it instead of certifying the wreck and writing a
11
+ * success config on top of it.
12
+ */
5
13
  export declare function sensingBundleReady(robrainMcpDir: string): boolean;
14
+ /**
15
+ * Locate the @robrain/sensing-mcp package installed alongside this CLI (it is a
16
+ * regular dependency, so any npm/npx/pnpm install of `robrain` carries it).
17
+ * Returns the package directory, or undefined when running from a source tree
18
+ * where it has not been linked/built.
19
+ */
20
+ export declare function resolveInstalledSensingMcpDir(): string | undefined;
21
+ /**
22
+ * Materialize ~/.robrain/mcp/sensing from the @robrain/sensing-mcp package that
23
+ * ships with the CLI. Always a copy, never a symlink: npx runs the CLI out of an
24
+ * ephemeral cache, so a symlink into it would dangle by the next editor launch.
25
+ * The bundle is a single self-contained file, so the copy needs no node_modules.
26
+ *
27
+ * Skips the copy when the destination was already materialized from the same
28
+ * package version. A symlinked destination (a previous --repo-root dev install)
29
+ * is replaced: default installs track the published package, and dev installs
30
+ * re-assert themselves by passing --repo-root again.
31
+ *
32
+ * Returns true when the bundle is ready, false when the package cannot be
33
+ * resolved or has no built dist (caller falls back to other sources).
34
+ */
35
+ export declare function ensureSensingMcpBundleFromPackage(robrainMcpDir: string): boolean;
36
+ /** Exposed for tests: same copy logic, explicit source package directory. */
37
+ export declare function materializeSensingBundle(pkgDir: string, robrainMcpDir: string): boolean;
6
38
  /** True when a Control MCP entrypoint exists (cloud installs only; not in OSS repo). */
7
39
  export declare function controlBundleReady(robrainMcpDir: string): boolean;
8
40
  /**
9
- * Ensure ~/.robrain/mcp/sensing points at a built @context-system/sensing-mcp package.
10
- * Uses a directory symlink on macOS/Linux (preserves pnpm workspace node_modules).
11
- * On Windows, performs a recursive copy (may require building from the same machine).
41
+ * Ensure ~/.robrain/mcp/sensing resolves to a built sensing-mcp bundle.
42
+ *
43
+ * macOS/Linux: directory symlink into the workspace package — always replaces
44
+ * any existing package-copied bundle so `--repo-root` re-asserts dev installs.
45
+ *
46
+ * Windows: copy the *self-contained* artifact only — the bundled dist plus a
47
+ * minimal package.json declaring ESM. We deliberately do NOT copy the package's
48
+ * node_modules: in a pnpm workspace those entries are symlinks into the monorepo's
49
+ * virtual store (e.g. `@robrain/shared -> ../../../shared`). Copied out of the repo
50
+ * they dangle, and on Windows recreating them can abort the copy partway — which is
51
+ * exactly what produced half-installed, crash-looping Sensing servers. Because the
52
+ * server is bundled into one file with every dependency inlined, no node_modules is
53
+ * needed at the destination.
12
54
  */
13
55
  export declare function ensureSensingMcpBundle(repoRoot: string, robrainMcpDir: string): void;
14
56
  //# sourceMappingURL=mcp-bundle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-bundle.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-bundle.ts"],"names":[],"mappings":"AAOA,qBAAa,cAAe,SAAQ,KAAK;IAC9B,IAAI,SAAmB;CACjC;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAuBpF"}
1
+ {"version":3,"file":"mcp-bundle.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-bundle.ts"],"names":[],"mappings":"AAQA,qBAAa,cAAe,SAAQ,KAAK;IAC9B,IAAI,SAAmB;CACjC;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAGjE;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,IAAI,MAAM,GAAG,SAAS,CAOlE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iCAAiC,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAIhF;AAED,6EAA6E;AAC7E,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAkCvF;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAiCpF"}
@@ -1,27 +1,111 @@
1
1
  // packages/cli/src/lib/mcp-bundle.ts
2
2
  // Copy or symlink built MCP packages into ~/.robrain/mcp so editor configs resolve.
3
- import { cpSync, existsSync, mkdirSync, rmSync, symlinkSync } from 'fs';
3
+ import { cpSync, existsSync, lstatSync, mkdirSync, readFileSync, rmSync, symlinkSync, writeFileSync } from 'fs';
4
+ import { createRequire } from 'module';
4
5
  import { platform } from 'os';
5
- import { join } from 'path';
6
+ import { dirname, join } from 'path';
6
7
  export class McpBundleError extends Error {
7
8
  name = 'McpBundleError';
8
9
  }
9
- /** True when ~/.robrain/mcp/sensing/dist/index.js exists and is readable. */
10
+ /**
11
+ * True only when a *complete* Sensing bundle is present — both the entrypoint and
12
+ * a package.json declaring ESM. The package.json check is load-bearing: Node treats
13
+ * a bare `.js` without `"type": "module"` as CommonJS and throws on the bundle's
14
+ * `import` statements before any tool registers. A previous half-finished copy
15
+ * (entrypoint present, package.json missing) must therefore read as NOT ready so
16
+ * the install re-materializes it instead of certifying the wreck and writing a
17
+ * success config on top of it.
18
+ */
10
19
  export function sensingBundleReady(robrainMcpDir) {
11
- return existsSync(join(robrainMcpDir, 'sensing', 'dist', 'index.js'));
20
+ const base = join(robrainMcpDir, 'sensing');
21
+ return existsSync(join(base, 'dist', 'index.js')) && existsSync(join(base, 'package.json'));
22
+ }
23
+ /**
24
+ * Locate the @robrain/sensing-mcp package installed alongside this CLI (it is a
25
+ * regular dependency, so any npm/npx/pnpm install of `robrain` carries it).
26
+ * Returns the package directory, or undefined when running from a source tree
27
+ * where it has not been linked/built.
28
+ */
29
+ export function resolveInstalledSensingMcpDir() {
30
+ try {
31
+ const req = createRequire(import.meta.url);
32
+ return dirname(req.resolve('@robrain/sensing-mcp/package.json'));
33
+ }
34
+ catch {
35
+ return undefined;
36
+ }
37
+ }
38
+ /**
39
+ * Materialize ~/.robrain/mcp/sensing from the @robrain/sensing-mcp package that
40
+ * ships with the CLI. Always a copy, never a symlink: npx runs the CLI out of an
41
+ * ephemeral cache, so a symlink into it would dangle by the next editor launch.
42
+ * The bundle is a single self-contained file, so the copy needs no node_modules.
43
+ *
44
+ * Skips the copy when the destination was already materialized from the same
45
+ * package version. A symlinked destination (a previous --repo-root dev install)
46
+ * is replaced: default installs track the published package, and dev installs
47
+ * re-assert themselves by passing --repo-root again.
48
+ *
49
+ * Returns true when the bundle is ready, false when the package cannot be
50
+ * resolved or has no built dist (caller falls back to other sources).
51
+ */
52
+ export function ensureSensingMcpBundleFromPackage(robrainMcpDir) {
53
+ const pkgDir = resolveInstalledSensingMcpDir();
54
+ if (!pkgDir)
55
+ return false;
56
+ return materializeSensingBundle(pkgDir, robrainMcpDir);
57
+ }
58
+ /** Exposed for tests: same copy logic, explicit source package directory. */
59
+ export function materializeSensingBundle(pkgDir, robrainMcpDir) {
60
+ const srcEntry = join(pkgDir, 'dist', 'index.js');
61
+ if (!existsSync(srcEntry))
62
+ return false;
63
+ let version = '';
64
+ try {
65
+ version = JSON.parse(readFileSync(join(pkgDir, 'package.json'), 'utf8')).version ?? '';
66
+ }
67
+ catch {
68
+ return false;
69
+ }
70
+ const dest = join(robrainMcpDir, 'sensing');
71
+ if (sensingBundleReady(robrainMcpDir) && !lstatSync(dest).isSymbolicLink()) {
72
+ try {
73
+ const current = JSON.parse(readFileSync(join(dest, 'package.json'), 'utf8'));
74
+ if (current.version === version)
75
+ return true;
76
+ }
77
+ catch {
78
+ // unreadable marker — fall through and re-copy
79
+ }
80
+ }
81
+ mkdirSync(robrainMcpDir, { recursive: true });
82
+ if (existsSync(dest))
83
+ rmSync(dest, { recursive: true, force: true });
84
+ mkdirSync(dest, { recursive: true });
85
+ cpSync(join(pkgDir, 'dist'), join(dest, 'dist'), { recursive: true });
86
+ writeFileSync(join(dest, 'package.json'), JSON.stringify({ name: 'robrain-sensing-mcp', version, private: true, type: 'module', main: './dist/index.js' }, null, 2) + '\n');
87
+ return true;
12
88
  }
13
89
  /** True when a Control MCP entrypoint exists (cloud installs only; not in OSS repo). */
14
90
  export function controlBundleReady(robrainMcpDir) {
15
91
  return existsSync(join(robrainMcpDir, 'control', 'dist', 'index.js'));
16
92
  }
17
93
  /**
18
- * Ensure ~/.robrain/mcp/sensing points at a built @context-system/sensing-mcp package.
19
- * Uses a directory symlink on macOS/Linux (preserves pnpm workspace node_modules).
20
- * On Windows, performs a recursive copy (may require building from the same machine).
94
+ * Ensure ~/.robrain/mcp/sensing resolves to a built sensing-mcp bundle.
95
+ *
96
+ * macOS/Linux: directory symlink into the workspace package — always replaces
97
+ * any existing package-copied bundle so `--repo-root` re-asserts dev installs.
98
+ *
99
+ * Windows: copy the *self-contained* artifact only — the bundled dist plus a
100
+ * minimal package.json declaring ESM. We deliberately do NOT copy the package's
101
+ * node_modules: in a pnpm workspace those entries are symlinks into the monorepo's
102
+ * virtual store (e.g. `@robrain/shared -> ../../../shared`). Copied out of the repo
103
+ * they dangle, and on Windows recreating them can abort the copy partway — which is
104
+ * exactly what produced half-installed, crash-looping Sensing servers. Because the
105
+ * server is bundled into one file with every dependency inlined, no node_modules is
106
+ * needed at the destination.
21
107
  */
22
108
  export function ensureSensingMcpBundle(repoRoot, robrainMcpDir) {
23
- if (sensingBundleReady(robrainMcpDir))
24
- return;
25
109
  const src = join(repoRoot, 'packages', 'sensing-mcp');
26
110
  const srcEntry = join(src, 'dist', 'index.js');
27
111
  if (!existsSync(srcEntry)) {
@@ -33,7 +117,12 @@ export function ensureSensingMcpBundle(repoRoot, robrainMcpDir) {
33
117
  rmSync(dest, { recursive: true, force: true });
34
118
  }
35
119
  if (platform() === 'win32') {
36
- cpSync(src, dest, { recursive: true });
120
+ mkdirSync(dest, { recursive: true });
121
+ cpSync(join(src, 'dist'), join(dest, 'dist'), { recursive: true });
122
+ // Minimal package.json: Node needs "type": "module" to run the bundled
123
+ // ESM entrypoint. The workspace package.json's `dependencies` are irrelevant
124
+ // at runtime (everything is inlined) and only invite confusion, so omit them.
125
+ writeFileSync(join(dest, 'package.json'), JSON.stringify({ name: 'robrain-sensing-mcp', private: true, type: 'module', main: './dist/index.js' }, null, 2) + '\n');
37
126
  }
38
127
  else {
39
128
  symlinkSync(src, dest, 'dir');
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-bundle.js","sourceRoot":"","sources":["../../src/lib/mcp-bundle.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,oFAAoF;AAEpF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,IAAI,CAAA;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAA;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,IAAI,GAAG,gBAAgB,CAAA;CACjC;AAED,6EAA6E;AAC7E,MAAM,UAAU,kBAAkB,CAAC,aAAqB;IACtD,OAAO,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;AACvE,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,kBAAkB,CAAC,aAAqB;IACtD,OAAO,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;AACvE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB,EAAE,aAAqB;IAC5E,IAAI,kBAAkB,CAAC,aAAa,CAAC;QAAE,OAAM;IAE7C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,CAAA;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;IAC9C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,cAAc,CACtB,qCAAqC,QAAQ,uDAAuD,CACrG,CAAA;IACH,CAAC;IAED,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;IAE3C,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAChD,CAAC;IAED,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACxC,CAAC;SAAM,CAAC;QACN,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;IAC/B,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"mcp-bundle.js","sourceRoot":"","sources":["../../src/lib/mcp-bundle.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,oFAAoF;AAEpF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AAC/G,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAA;AAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAEpC,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,IAAI,GAAG,gBAAgB,CAAA;CACjC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,aAAqB;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;IAC3C,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAA;AAC7F,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,CAAA;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iCAAiC,CAAC,aAAqB;IACrE,MAAM,MAAM,GAAG,6BAA6B,EAAE,CAAA;IAC9C,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACzB,OAAO,wBAAwB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;AACxD,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,wBAAwB,CAAC,MAAc,EAAE,aAAqB;IAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;IACjD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAA;IAEvC,IAAI,OAAO,GAAG,EAAE,CAAA;IAChB,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAA;IACxF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;IAC3C,IAAI,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;QAC3E,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;YAC5E,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAA;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,+CAA+C;QACjD,CAAC;IACH,CAAC;IAED,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACpE,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACpC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACrE,aAAa,CACX,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAC1B,IAAI,CAAC,SAAS,CACZ,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAChG,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CACT,CAAA;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,kBAAkB,CAAC,aAAqB;IACtD,OAAO,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;AACvE,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB,EAAE,aAAqB;IAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,CAAA;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;IAC9C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,cAAc,CACtB,qCAAqC,QAAQ,uDAAuD,CACrG,CAAA;IACH,CAAC;IAED,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;IAE3C,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAChD,CAAC;IAED,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACpC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAClE,uEAAuE;QACvE,6EAA6E;QAC7E,8EAA8E;QAC9E,aAAa,CACX,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAC1B,IAAI,CAAC,SAAS,CACZ,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,EACvF,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CACT,CAAA;IACH,CAAC;SAAM,CAAC;QACN,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;IAC/B,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp-bundle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-bundle.test.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-bundle.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,85 @@
1
+ import { existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, rmSync, symlinkSync, writeFileSync } from 'fs';
2
+ import { platform, tmpdir } from 'os';
3
+ import { join } from 'path';
4
+ import { describe, it, beforeEach, afterEach } from 'node:test';
5
+ import assert from 'node:assert/strict';
6
+ import { ensureSensingMcpBundle, materializeSensingBundle, sensingBundleReady } from './mcp-bundle.js';
7
+ let root;
8
+ let pkgDir;
9
+ let mcpDir;
10
+ function writeFakePackage(dir, version, bundleBody) {
11
+ mkdirSync(join(dir, 'dist'), { recursive: true });
12
+ writeFileSync(join(dir, 'dist', 'index.js'), bundleBody);
13
+ writeFileSync(join(dir, 'package.json'), JSON.stringify({ name: '@robrain/sensing-mcp', version }));
14
+ }
15
+ beforeEach(() => {
16
+ root = mkdtempSync(join(tmpdir(), 'robrain-mcp-bundle-'));
17
+ pkgDir = join(root, 'pkg');
18
+ mcpDir = join(root, 'mcp');
19
+ });
20
+ afterEach(() => {
21
+ rmSync(root, { recursive: true, force: true });
22
+ });
23
+ describe('materializeSensingBundle', () => {
24
+ it('copies dist and writes a version-stamped ESM marker package.json', () => {
25
+ writeFakePackage(pkgDir, '2.2.0', 'console.log("bundle")');
26
+ assert.equal(materializeSensingBundle(pkgDir, mcpDir), true);
27
+ assert.equal(sensingBundleReady(mcpDir), true);
28
+ assert.equal(readFileSync(join(mcpDir, 'sensing', 'dist', 'index.js'), 'utf8'), 'console.log("bundle")');
29
+ const marker = JSON.parse(readFileSync(join(mcpDir, 'sensing', 'package.json'), 'utf8'));
30
+ assert.equal(marker.version, '2.2.0');
31
+ assert.equal(marker.type, 'module');
32
+ });
33
+ it('skips the copy when the same version is already materialized', () => {
34
+ writeFakePackage(pkgDir, '2.2.0', 'v1');
35
+ assert.equal(materializeSensingBundle(pkgDir, mcpDir), true);
36
+ // Same version, different source content: destination must be left alone.
37
+ writeFileSync(join(pkgDir, 'dist', 'index.js'), 'v2');
38
+ assert.equal(materializeSensingBundle(pkgDir, mcpDir), true);
39
+ assert.equal(readFileSync(join(mcpDir, 'sensing', 'dist', 'index.js'), 'utf8'), 'v1');
40
+ });
41
+ it('re-copies when the package version changed', () => {
42
+ writeFakePackage(pkgDir, '2.2.0', 'old');
43
+ assert.equal(materializeSensingBundle(pkgDir, mcpDir), true);
44
+ writeFakePackage(pkgDir, '2.3.0', 'new');
45
+ assert.equal(materializeSensingBundle(pkgDir, mcpDir), true);
46
+ assert.equal(readFileSync(join(mcpDir, 'sensing', 'dist', 'index.js'), 'utf8'), 'new');
47
+ const marker = JSON.parse(readFileSync(join(mcpDir, 'sensing', 'package.json'), 'utf8'));
48
+ assert.equal(marker.version, '2.3.0');
49
+ });
50
+ it('replaces a symlinked destination from a previous --repo-root install', () => {
51
+ // Old dev install: ~/.robrain/mcp/sensing -> clone/packages/sensing-mcp
52
+ const cloneDir = join(root, 'clone-sensing-mcp');
53
+ writeFakePackage(cloneDir, '2.2.0', 'from-clone');
54
+ mkdirSync(mcpDir, { recursive: true });
55
+ symlinkSync(cloneDir, join(mcpDir, 'sensing'), 'dir');
56
+ writeFakePackage(pkgDir, '2.2.0', 'from-package');
57
+ assert.equal(materializeSensingBundle(pkgDir, mcpDir), true);
58
+ assert.equal(readFileSync(join(mcpDir, 'sensing', 'dist', 'index.js'), 'utf8'), 'from-package');
59
+ // The clone the symlink pointed at must be untouched.
60
+ assert.equal(readFileSync(join(cloneDir, 'dist', 'index.js'), 'utf8'), 'from-clone');
61
+ });
62
+ it('returns false when the package has no built dist', () => {
63
+ mkdirSync(pkgDir, { recursive: true });
64
+ writeFileSync(join(pkgDir, 'package.json'), JSON.stringify({ version: '2.2.0' }));
65
+ assert.equal(materializeSensingBundle(pkgDir, mcpDir), false);
66
+ assert.equal(existsSync(join(mcpDir, 'sensing')), false);
67
+ });
68
+ it('replaces a package-copied destination when --repo-root is used', () => {
69
+ writeFakePackage(pkgDir, '2.2.0', 'from-package');
70
+ materializeSensingBundle(pkgDir, mcpDir);
71
+ const repoRoot = join(root, 'clone');
72
+ const cloneSensing = join(repoRoot, 'packages', 'sensing-mcp');
73
+ writeFakePackage(cloneSensing, '2.2.0', 'from-clone');
74
+ ensureSensingMcpBundle(repoRoot, mcpDir);
75
+ const dest = join(mcpDir, 'sensing');
76
+ if (platform() === 'win32') {
77
+ assert.equal(readFileSync(join(dest, 'dist', 'index.js'), 'utf8'), 'from-clone');
78
+ }
79
+ else {
80
+ assert.ok(lstatSync(dest).isSymbolicLink());
81
+ assert.equal(readFileSync(join(dest, 'dist', 'index.js'), 'utf8'), 'from-clone');
82
+ }
83
+ });
84
+ });
85
+ //# sourceMappingURL=mcp-bundle.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-bundle.test.js","sourceRoot":"","sources":["../../src/lib/mcp-bundle.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAW,MAAM,CAAA;IACnB,IAAI,EAAS,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAQ,MAAM,EAAE,CAAA;IACrB,MAAM,EAAO,MAAM,CAAA;IACnB,OAAO,EAAM,MAAM,CAAA;CACpB;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAgE1D;AAED,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAS1D;AAKD,sEAAsE;AACtE,wBAAsB,iBAAiB,CACrC,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,WAAW;AACjB,4FAA4F;AAC5F,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC,CAgHpD"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAW,MAAM,CAAA;IACnB,IAAI,EAAS,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAQ,MAAM,EAAE,CAAA;IACrB,MAAM,EAAO,MAAM,CAAA;IACnB,OAAO,EAAM,MAAM,CAAA;CACpB;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAiBD,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAgE1D;AAED,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAS1D;AAKD,sEAAsE;AACtE,wBAAsB,iBAAiB,CACrC,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,WAAW;AACjB,4FAA4F;AAC5F,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC,CAgHpD"}
@@ -12,9 +12,25 @@ import { createHash } from 'crypto';
12
12
  export function deriveProjectId(cwd) {
13
13
  return createHash('sha256').update(cwd).digest('hex').slice(0, 12);
14
14
  }
15
+ /** Read the project_id written by init-project from CLAUDE.md / AGENTS.md / Cursor rule */
16
+ function readProjectIdFromEditorFiles(dir) {
17
+ const candidates = [
18
+ join(dir, 'CLAUDE.md'),
19
+ join(dir, 'AGENTS.md'),
20
+ join(dir, '.cursor', 'rules', 'robrain.mdc'),
21
+ ];
22
+ for (const p of candidates) {
23
+ if (!existsSync(p))
24
+ continue;
25
+ const match = readFileSync(p, 'utf8').match(/project_id="([^"]+)"/);
26
+ if (match?.[1])
27
+ return match[1].trim();
28
+ }
29
+ return null;
30
+ }
15
31
  /** Collect all available context from the project root */
16
32
  export function gatherProjectInfo(cwd) {
17
- const id = deriveProjectId(cwd);
33
+ const id = readProjectIdFromEditorFiles(cwd) ?? deriveProjectId(cwd);
18
34
  let name = basename(cwd);
19
35
  let desc = '';
20
36
  let stack = [];
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "robrain",
3
- "version": "2.0.0",
3
+ "version": "2.3.0",
4
4
  "type": "module",
5
5
  "description": "RoBrain CLI for installation, setup, and memory workflows",
6
6
  "license": "Apache-2.0",
@@ -30,10 +30,11 @@
30
30
  "build": "tsc",
31
31
  "dev": "tsc --watch",
32
32
  "typecheck": "tsc --noEmit",
33
- "test": "pnpm build && node --test dist/lib/editor.codex.test.js",
33
+ "test": "pnpm build && node --test dist/lib/editor.codex.test.js dist/lib/mcp-bundle.test.js dist/commands/outcomes.test.js dist/commands/export-interchange.test.js dist/commands/up.test.js",
34
34
  "postinstall": "node scripts/chmod-bin.cjs"
35
35
  },
36
36
  "dependencies": {
37
+ "@robrain/sensing-mcp": "workspace:^",
37
38
  "dotenv": "^16.4.5",
38
39
  "chalk": "^5.3.0",
39
40
  "ora": "^8.0.1",