robrain 2.0.1 → 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.
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +195 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/export-interchange.d.ts +62 -0
- package/dist/commands/export-interchange.d.ts.map +1 -0
- package/dist/commands/export-interchange.js +109 -0
- package/dist/commands/export-interchange.js.map +1 -0
- package/dist/commands/export-interchange.test.d.ts +2 -0
- package/dist/commands/export-interchange.test.d.ts.map +1 -0
- package/dist/commands/export-interchange.test.js +94 -0
- package/dist/commands/export-interchange.test.js.map +1 -0
- package/dist/commands/inject.d.ts.map +1 -1
- package/dist/commands/inject.js +12 -1
- package/dist/commands/inject.js.map +1 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +29 -21
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/outcomes.d.ts +41 -0
- package/dist/commands/outcomes.d.ts.map +1 -0
- package/dist/commands/outcomes.js +274 -0
- package/dist/commands/outcomes.js.map +1 -0
- package/dist/commands/outcomes.test.d.ts +2 -0
- package/dist/commands/outcomes.test.d.ts.map +1 -0
- package/dist/commands/outcomes.test.js +118 -0
- package/dist/commands/outcomes.test.js.map +1 -0
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +24 -0
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/up.d.ts +34 -0
- package/dist/commands/up.d.ts.map +1 -0
- package/dist/commands/up.js +257 -0
- package/dist/commands/up.js.map +1 -0
- package/dist/commands/up.test.d.ts +2 -0
- package/dist/commands/up.test.d.ts.map +1 -0
- package/dist/commands/up.test.js +70 -0
- package/dist/commands/up.test.js.map +1 -0
- package/dist/index.js +65 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/mcp-bundle.d.ts +26 -2
- package/dist/lib/mcp-bundle.d.ts.map +1 -1
- package/dist/lib/mcp-bundle.js +71 -6
- package/dist/lib/mcp-bundle.js.map +1 -1
- package/dist/lib/mcp-bundle.test.d.ts +2 -0
- package/dist/lib/mcp-bundle.test.d.ts.map +1 -0
- package/dist/lib/mcp-bundle.test.js +85 -0
- package/dist/lib/mcp-bundle.test.js.map +1 -0
- package/dist/lib/project.d.ts.map +1 -1
- package/dist/lib/project.js +17 -1
- package/dist/lib/project.js.map +1 -1
- 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
|
-
|
|
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
|
-
|
|
181
|
-
|
|
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":";AACA,eAAe;AACf,gEAAgE;AAChE,4BAA4B;AAC5B,kCAAkC;AAClC,EAAE;AACF,YAAY;AACZ,qEAAqE;AACrE,4DAA4D;AAC5D,qDAAqD;AACrD,+DAA+D;AAC/D,2CAA2C;AAC3C,gEAAgE;AAEhE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAkC,mBAAmB,CAAA;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAU,uBAAuB,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAO,4BAA4B,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,MAAY,sBAAsB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAY,sBAAsB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAa,qBAAqB,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,cAAc,EAAE,MAAW,uBAAuB,CAAA;AAC3D,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,eAAe;AACf,gEAAgE;AAChE,4BAA4B;AAC5B,kCAAkC;AAClC,EAAE;AACF,YAAY;AACZ,qEAAqE;AACrE,4DAA4D;AAC5D,qDAAqD;AACrD,6EAA6E;AAC7E,+DAA+D;AAC/D,2CAA2C;AAC3C,gEAAgE;AAEhE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAkC,mBAAmB,CAAA;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAU,uBAAuB,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAO,4BAA4B,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,MAAY,sBAAsB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAY,sBAAsB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAY,sBAAsB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAa,qBAAqB,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAA;AAC3E,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AACnF,OAAO,EAAE,cAAc,EAAE,MAAW,uBAAuB,CAAA;AAC3D,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAClF,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAE7E,MAAM,OAAO,GAAG,OAAO,CAAA;AAEvB,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,2DAA2D,CAAC;KACxE,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,iEAAiE;AAEjE,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,uDAAuD,CAAC;KACpE,MAAM,CAAC,oBAAoB,EAAE,sDAAsD,CAAC;KACpF,MAAM,CAAC,WAAW,EAAW,sDAAsD,CAAC;KACpF,MAAM,CAAC,WAAW,EAAW,oDAAoD,CAAC;KAClF,MAAM,CAAC,eAAe,EAAO,kEAAkE,CAAC;KAChG,MAAM,CAAC,iBAAiB,EAAK,qCAAqC,EAAE,QAAQ,CAAC;KAC7E,MAAM,CAAC,KAAK,EAAE,IAAkG,EAAE,EAAE;IACnH,MAAM,aAAa,CAAC;QAClB,OAAO,EAAK,IAAI,CAAC,OAAO,IAAI,MAAM;QAClC,GAAG,EAAS,IAAI,CAAC,GAAG;QACpB,OAAO,EAAK,IAAI,CAAC,OAAO;QACxB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,KAAK,EAAO,IAAI,CAAC,KAAK;KACvB,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEJ,iEAAiE;AAEjE,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,8DAA8D,CAAC;KAC3E,MAAM,CAAC,WAAW,EAAG,+CAA+C,CAAC;KACrE,MAAM,CAAC,YAAY,EAAE,0BAA0B,CAAC;KAChD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAuC,EAAE,EAAE;IACtE,MAAM,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AAClC,CAAC,CAAC,CAAA;AAEJ,iEAAiE;AAEjE,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kFAAkF,CAAC;KAC/F,MAAM,CAAC,oBAAoB,EAAI,8CAA8C,CAAC;KAC9E,MAAM,CAAC,qBAAqB,EAAG,oEAAoE,CAAC;KACpG,MAAM,CAAC,YAAY,EAAY,mCAAmC,CAAC;KACnE,MAAM,CAAC,iBAAiB,EAAO,uCAAuC,EAAE,QAAQ,CAAC;KACjF,MAAM,CAAC,WAAW,EAAa,sHAAsH,CAAC;KACtJ,MAAM,CAAC,KAAK,EAAE,IAAuF,EAAE,EAAE;IACxG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC,CAAC,CAAA;AAEJ,iEAAiE;AAEjE,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,uFAAuF,CAAC;KACpG,MAAM,CAAC,WAAW,EAAE,kDAAkD,CAAC;KACvE,MAAM,CAAC,QAAQ,EAAE,uEAAuE,CAAC;KACzF,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,EAAE,QAAQ,CAAC;KAClF,MAAM,CAAC,gBAAgB,EAAE,yBAAyB,CAAC;KACnD,MAAM,CAAC,KAAK,EAAE,IAA+E,EAAE,EAAE;IAChG,MAAM,YAAY,CAAC;QACjB,MAAM,EAAI,IAAI,CAAC,MAAM;QACrB,IAAI,EAAM,IAAI,CAAC,IAAI;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAG,IAAI,CAAC,OAAO;KACvB,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEJ,iEAAiE;AAEjE,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,wFAAwF,CAAC;KACrG,MAAM,CAAC,WAAW,EAAY,qDAAqD,CAAC;KACpF,MAAM,CAAC,sBAAsB,EAAE,qEAAqE,CAAC;KACrG,MAAM,CAAC,YAAY,EAAW,0EAA0E,CAAC;KACzG,MAAM,CAAC,iBAAiB,EAAM,sFAAsF,CAAC;KACrH,MAAM,CAAC,cAAc,EAAS,oFAAoF,CAAC;KACnH,MAAM,CAAC,mBAAmB,EAAI,gEAAgE,CAAC;KAC/F,MAAM,CAAC,KAAK,EAAE,IAAiI,EAAE,EAAE;IAClJ,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAA;AACjC,CAAC,CAAC,CAAA;AAEJ,iEAAiE;AAEjE,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,sFAAsF,CAAC;KACnG,MAAM,CAAC,mBAAmB,EAAG,sCAAsC,EAAE,aAAa,CAAC;KACnF,MAAM,CAAC,cAAc,EAAQ,mCAAmC,CAAC;KACjE,MAAM,CAAC,cAAc,EAAQ,qEAAqE,CAAC;KACnG,MAAM,CAAC,mBAAmB,EAAG,gEAAgE,CAAC;KAC9F,MAAM,CAAC,KAAK,EAAE,IAAyE,EAAE,EAAE;IAC1F,MAAM,wBAAwB,CAAC,IAAI,CAAC,CAAA;AACtC,CAAC,CAAC,CAAA;AAEJ,iEAAiE;AAEjE,MAAM,WAAW,GAAG,OAAO;KACxB,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,qFAAqF,CAAC;KAClG,MAAM,CAAC,oBAAoB,EAAE,+DAA+D,CAAC;KAC7F,MAAM,CAAC,WAAW,EAAW,mDAAmD,CAAC;KACjF,MAAM,CAAC,KAAK,EAAE,IAA0C,EAAE,EAAE;IAC3D,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAA;AACjC,CAAC,CAAC,CAAA;AAEJ,WAAW;KACR,OAAO,CAAC,sBAAsB,CAAC;KAC/B,WAAW,CAAC,2CAA2C,CAAC;KACxD,cAAc,CAAC,kBAAkB,EAAE,+BAA+B,CAAC;KACnE,MAAM,CAAC,mBAAmB,EAAS,wDAAwD,CAAC;KAC5F,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,IAA4C,EAAE,EAAE;IACjF,MAAM,qBAAqB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;AAC/C,CAAC,CAAC,CAAA;AAEJ,iEAAiE;AAEjE,OAAO;KACJ,OAAO,CAAC,IAAI,CAAC;KACb,WAAW,CAAC,uHAAuH,CAAC;KACpI,MAAM,CAAC,aAAa,EAAM,8CAA8C,OAAO,GAAG,CAAC;KACnF,MAAM,CAAC,iBAAiB,EAAE,iCAAiC,kBAAkB,SAAS,CAAC;KACvF,MAAM,CAAC,KAAK,EAAE,IAAsC,EAAE,EAAE;IACvD,MAAM,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAA;AAC5E,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wFAAwF,CAAC;KACrG,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,WAAW,EAAE,CAAA;AACrB,CAAC,CAAC,CAAA;AAEJ,iEAAiE;AAEjE,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,qEAAqE,CAAC;KAClF,MAAM,CAAC,qBAAqB,EAAO,kDAAkD,CAAC;KACtF,MAAM,CAAC,uBAAuB,EAAK,uDAAuD,CAAC;KAC3F,MAAM,CAAC,eAAe,EAAa,yCAAyC,CAAC;KAC7E,MAAM,CAAC,wBAAwB,EAAI,sEAAsE,CAAC;KAC1G,MAAM,CACL,oBAAoB,EACpB,oGAAoG,CACrG;KACA,MAAM,CAAC,qBAAqB,EAAE,gEAAgE,CAAC;KAC/F,MAAM,CAAC,KAAK,EAAE,IAOd,EAAE,EAAE;IACH,MAAM,cAAc,CAAC;QACnB,KAAK,EAAa,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU;QACtD,MAAM,EAAY,IAAI,CAAC,MAAM;QAC7B,UAAU,EAAQ,IAAI,CAAC,UAAU;QACjC,aAAa,EAAK,IAAI,CAAC,aAAa;QACpC,QAAQ,EAAU,IAAI,CAAC,QAAQ;QAC/B,eAAe,EAAG,IAAI,CAAC,eAAe;KACvC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEJ,iEAAiE;AAEjE,OAAO;KACJ,OAAO,CAAC,cAAc,CAAC;KACvB,KAAK,CAAC,MAAM,CAAC;KACb,WAAW,CAAC,qEAAqE,CAAC;KAClF,MAAM,CAAC,mBAAmB,EAAE,sCAAsC,CAAC;KACnE,MAAM,CAAC,KAAK,EAAE,IAA4B,EAAE,EAAE;IAC7C,MAAM,kBAAkB,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;AACzD,CAAC,CAAC,CAAA;AAEJ,iEAAiE;AAEjE,MAAM,WAAW,GAAG,OAAO;KACxB,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,qFAAqF,CAAC,CAAA;AAErG,WAAW;KACR,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,oDAAoD,CAAC;KACjE,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,mBAAmB,EAAE,CAAA;AAC7B,CAAC,CAAC,CAAA;AAEJ,WAAW;KACR,OAAO,CAAC,yBAAyB,CAAC;KAClC,WAAW,CAAC,mGAAmG,CAAC;KAChH,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAY,EAAE,EAAE;IAC7C,MAAM,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AAC1C,CAAC,CAAC,CAAA;AAEJ,iEAAiE;AAEjE,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,4FAA4F,CAAC;KACzG,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,aAAa,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,iEAAiE;AAEjE,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,mHAAmH,CAAC;KAChI,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,aAAa,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,iEAAiE;AAEjE,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,qFAAqF,CAAC;KAClG,MAAM,CAAC,cAAc,EAAK,kCAAkC,CAAC;KAC7D,MAAM,CAAC,QAAQ,EAAW,oCAAoC,CAAC;KAC/D,MAAM,CAAC,eAAe,EAAI,qBAAqB,CAAC;KAChD,MAAM,CAAC,eAAe,EAAI,+EAA+E,CAAC;KAC1G,MAAM,CAAC,KAAK,EAAE,IAAsE,EAAE,EAAE;IACvF,MAAM,WAAW,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC,CAAC,CAAA;AAEJ,iEAAiE;AAEjE,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,aAAa,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,kEAAkE;AAElE,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE;aACpB,OAAO;;CAEnB,CAAC,CAAA;AAEF,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,EAAE;IACxD,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAA2B,CAAA;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAA;IAC1D,UAAU,CAAC,QAAQ,CAAC,CAAA;AACtB,CAAC,CAAC,CAAA;AAEF,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE;;;;;;;;;;;;;;;;;;;;;;CAsB/B,CAAC,CAAA;AAEF,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
package/dist/lib/mcp-bundle.d.ts
CHANGED
|
@@ -11,13 +11,37 @@ export declare class McpBundleError extends Error {
|
|
|
11
11
|
* success config on top of it.
|
|
12
12
|
*/
|
|
13
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;
|
|
14
38
|
/** True when a Control MCP entrypoint exists (cloud installs only; not in OSS repo). */
|
|
15
39
|
export declare function controlBundleReady(robrainMcpDir: string): boolean;
|
|
16
40
|
/**
|
|
17
41
|
* Ensure ~/.robrain/mcp/sensing resolves to a built sensing-mcp bundle.
|
|
18
42
|
*
|
|
19
|
-
* macOS/Linux: directory symlink into the workspace package —
|
|
20
|
-
*
|
|
43
|
+
* macOS/Linux: directory symlink into the workspace package — always replaces
|
|
44
|
+
* any existing package-copied bundle so `--repo-root` re-asserts dev installs.
|
|
21
45
|
*
|
|
22
46
|
* Windows: copy the *self-contained* artifact only — the bundled dist plus a
|
|
23
47
|
* minimal package.json declaring ESM. We deliberately do NOT copy the package's
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-bundle.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-bundle.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/lib/mcp-bundle.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
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, writeFileSync } 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
|
}
|
|
@@ -19,6 +20,72 @@ export function sensingBundleReady(robrainMcpDir) {
|
|
|
19
20
|
const base = join(robrainMcpDir, 'sensing');
|
|
20
21
|
return existsSync(join(base, 'dist', 'index.js')) && existsSync(join(base, 'package.json'));
|
|
21
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;
|
|
88
|
+
}
|
|
22
89
|
/** True when a Control MCP entrypoint exists (cloud installs only; not in OSS repo). */
|
|
23
90
|
export function controlBundleReady(robrainMcpDir) {
|
|
24
91
|
return existsSync(join(robrainMcpDir, 'control', 'dist', 'index.js'));
|
|
@@ -26,8 +93,8 @@ export function controlBundleReady(robrainMcpDir) {
|
|
|
26
93
|
/**
|
|
27
94
|
* Ensure ~/.robrain/mcp/sensing resolves to a built sensing-mcp bundle.
|
|
28
95
|
*
|
|
29
|
-
* macOS/Linux: directory symlink into the workspace package —
|
|
30
|
-
*
|
|
96
|
+
* macOS/Linux: directory symlink into the workspace package — always replaces
|
|
97
|
+
* any existing package-copied bundle so `--repo-root` re-asserts dev installs.
|
|
31
98
|
*
|
|
32
99
|
* Windows: copy the *self-contained* artifact only — the bundled dist plus a
|
|
33
100
|
* minimal package.json declaring ESM. We deliberately do NOT copy the package's
|
|
@@ -39,8 +106,6 @@ export function controlBundleReady(robrainMcpDir) {
|
|
|
39
106
|
* needed at the destination.
|
|
40
107
|
*/
|
|
41
108
|
export function ensureSensingMcpBundle(repoRoot, robrainMcpDir) {
|
|
42
|
-
if (sensingBundleReady(robrainMcpDir))
|
|
43
|
-
return;
|
|
44
109
|
const src = join(repoRoot, 'packages', 'sensing-mcp');
|
|
45
110
|
const srcEntry = join(src, 'dist', 'index.js');
|
|
46
111
|
if (!existsSync(srcEntry)) {
|
|
@@ -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,aAAa,EAAE,MAAM,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"mcp-bundle.js","sourceRoot":"","sources":["../../src/lib/mcp-bundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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"}
|
package/dist/lib/project.js
CHANGED
|
@@ -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 = [];
|
package/dist/lib/project.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,gEAAgE;AAChE,gEAAgE;AAChE,iEAAiE;AACjE,8EAA8E;AAC9E,gEAAgE;AAEhE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAWnC,iEAAiE;AACjE,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AACpE,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,EAAE,GAAK,eAAe,CAAC,GAAG,CAAC,CAAA;
|
|
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
|
|
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",
|