rrce-workflow 0.2.33 → 0.2.34
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/index.js +161 -13
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -25,6 +25,29 @@ var init_git = __esm({
|
|
|
25
25
|
});
|
|
26
26
|
|
|
27
27
|
// src/lib/paths.ts
|
|
28
|
+
var paths_exports = {};
|
|
29
|
+
__export(paths_exports, {
|
|
30
|
+
checkWriteAccess: () => checkWriteAccess,
|
|
31
|
+
copyDirToAllStoragePaths: () => copyDirToAllStoragePaths,
|
|
32
|
+
copyToAllStoragePaths: () => copyToAllStoragePaths,
|
|
33
|
+
detectWorkspaceRoot: () => detectWorkspaceRoot,
|
|
34
|
+
ensureDir: () => ensureDir,
|
|
35
|
+
getAgentPromptPath: () => getAgentPromptPath,
|
|
36
|
+
getConfigPath: () => getConfigPath,
|
|
37
|
+
getDefaultRRCEHome: () => getDefaultRRCEHome,
|
|
38
|
+
getEffectiveRRCEHome: () => getEffectiveRRCEHome,
|
|
39
|
+
getGlobalProjectKnowledgePath: () => getGlobalProjectKnowledgePath,
|
|
40
|
+
getGlobalWorkspacePath: () => getGlobalWorkspacePath,
|
|
41
|
+
getLocalWorkspacePath: () => getLocalWorkspacePath,
|
|
42
|
+
getRRCEHome: () => getRRCEHome,
|
|
43
|
+
getSuggestedGlobalPaths: () => getSuggestedGlobalPaths,
|
|
44
|
+
getWorkspaceName: () => getWorkspaceName,
|
|
45
|
+
listGlobalProjects: () => listGlobalProjects,
|
|
46
|
+
resolveAllDataPaths: () => resolveAllDataPaths,
|
|
47
|
+
resolveDataPath: () => resolveDataPath,
|
|
48
|
+
syncMetadataToAll: () => syncMetadataToAll,
|
|
49
|
+
writeToAllStoragePaths: () => writeToAllStoragePaths
|
|
50
|
+
});
|
|
28
51
|
import * as fs from "fs";
|
|
29
52
|
import * as path from "path";
|
|
30
53
|
function detectWorkspaceRoot() {
|
|
@@ -54,9 +77,49 @@ function getConfigPath(workspaceRoot) {
|
|
|
54
77
|
function getWorkspaceName(workspaceRoot) {
|
|
55
78
|
return path.basename(workspaceRoot);
|
|
56
79
|
}
|
|
80
|
+
function resolveDataPath(mode, workspaceName, workspaceRoot) {
|
|
81
|
+
switch (mode) {
|
|
82
|
+
case "global":
|
|
83
|
+
return path.join(RRCE_HOME, "workspaces", workspaceName);
|
|
84
|
+
case "workspace":
|
|
85
|
+
return path.join(workspaceRoot, ".rrce-workflow");
|
|
86
|
+
default:
|
|
87
|
+
return path.join(RRCE_HOME, "workspaces", workspaceName);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function resolveAllDataPaths(mode, workspaceName, workspaceRoot) {
|
|
91
|
+
const globalPath = path.join(RRCE_HOME, "workspaces", workspaceName);
|
|
92
|
+
const workspacePath = path.join(workspaceRoot, ".rrce-workflow");
|
|
93
|
+
switch (mode) {
|
|
94
|
+
case "global":
|
|
95
|
+
return [globalPath];
|
|
96
|
+
case "workspace":
|
|
97
|
+
return [workspacePath];
|
|
98
|
+
default:
|
|
99
|
+
return [globalPath];
|
|
100
|
+
}
|
|
101
|
+
}
|
|
57
102
|
function getRRCEHome() {
|
|
58
103
|
return RRCE_HOME;
|
|
59
104
|
}
|
|
105
|
+
function listGlobalProjects(excludeWorkspace) {
|
|
106
|
+
const workspacesDir = path.join(RRCE_HOME, "workspaces");
|
|
107
|
+
if (!fs.existsSync(workspacesDir)) {
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const entries = fs.readdirSync(workspacesDir, { withFileTypes: true });
|
|
112
|
+
return entries.filter((entry) => entry.isDirectory() && entry.name !== excludeWorkspace).map((entry) => entry.name);
|
|
113
|
+
} catch {
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function getGlobalProjectKnowledgePath(projectName) {
|
|
118
|
+
return path.join(RRCE_HOME, "workspaces", projectName, "knowledge");
|
|
119
|
+
}
|
|
120
|
+
function getGlobalWorkspacePath(workspaceName) {
|
|
121
|
+
return path.join(RRCE_HOME, "workspaces", workspaceName);
|
|
122
|
+
}
|
|
60
123
|
function getLocalWorkspacePath(workspaceRoot) {
|
|
61
124
|
return path.join(workspaceRoot, ".rrce-workflow");
|
|
62
125
|
}
|
|
@@ -80,6 +143,13 @@ function copyToAllStoragePaths(sourceFile, relativePath, dataPaths) {
|
|
|
80
143
|
fs.writeFileSync(targetPath, content);
|
|
81
144
|
}
|
|
82
145
|
}
|
|
146
|
+
function writeToAllStoragePaths(content, relativePath, dataPaths) {
|
|
147
|
+
for (const dataPath of dataPaths) {
|
|
148
|
+
const targetPath = path.join(dataPath, relativePath);
|
|
149
|
+
ensureDir(path.dirname(targetPath));
|
|
150
|
+
fs.writeFileSync(targetPath, content);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
83
153
|
function copyDirToAllStoragePaths(sourceDir, relativeDir, dataPaths) {
|
|
84
154
|
if (!fs.existsSync(sourceDir)) {
|
|
85
155
|
return;
|
|
@@ -124,6 +194,25 @@ function checkWriteAccess(dirPath) {
|
|
|
124
194
|
function getDefaultRRCEHome() {
|
|
125
195
|
return process.env.RRCE_HOME || path.join(process.env.HOME || "~", ".rrce-workflow");
|
|
126
196
|
}
|
|
197
|
+
function getSuggestedGlobalPaths() {
|
|
198
|
+
const suggestions = [];
|
|
199
|
+
if (process.env.RRCE_HOME) {
|
|
200
|
+
suggestions.push({
|
|
201
|
+
path: process.env.RRCE_HOME,
|
|
202
|
+
label: "RRCE_HOME (environment)",
|
|
203
|
+
isWritable: checkWriteAccess(process.env.RRCE_HOME)
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
const homeDefault = path.join(process.env.HOME || "~", ".rrce-workflow");
|
|
207
|
+
if (!process.env.RRCE_HOME || process.env.RRCE_HOME !== homeDefault) {
|
|
208
|
+
suggestions.push({
|
|
209
|
+
path: homeDefault,
|
|
210
|
+
label: "~/.rrce-workflow (default)",
|
|
211
|
+
isWritable: checkWriteAccess(homeDefault)
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
return suggestions;
|
|
215
|
+
}
|
|
127
216
|
function getEffectiveRRCEHome(workspaceRoot) {
|
|
128
217
|
if (workspaceRoot) {
|
|
129
218
|
const configPath = getConfigPath(workspaceRoot);
|
|
@@ -1283,8 +1372,8 @@ function registerResourceHandlers(server) {
|
|
|
1283
1372
|
});
|
|
1284
1373
|
}
|
|
1285
1374
|
function registerToolHandlers(server) {
|
|
1286
|
-
server.setRequestHandler(ListToolsRequestSchema, async () =>
|
|
1287
|
-
tools
|
|
1375
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
1376
|
+
const tools = [
|
|
1288
1377
|
{
|
|
1289
1378
|
name: "search_knowledge",
|
|
1290
1379
|
description: "Search across all exposed project knowledge bases",
|
|
@@ -1325,8 +1414,17 @@ function registerToolHandlers(server) {
|
|
|
1325
1414
|
required: ["agent"]
|
|
1326
1415
|
}
|
|
1327
1416
|
}
|
|
1328
|
-
]
|
|
1329
|
-
|
|
1417
|
+
];
|
|
1418
|
+
const projects = getExposedProjects();
|
|
1419
|
+
if (projects.length === 0) {
|
|
1420
|
+
tools.push({
|
|
1421
|
+
name: "help_setup",
|
|
1422
|
+
description: "Get help on how to configure projects for the RRCE MCP Server",
|
|
1423
|
+
inputSchema: { type: "object", properties: {} }
|
|
1424
|
+
});
|
|
1425
|
+
}
|
|
1426
|
+
return { tools };
|
|
1427
|
+
});
|
|
1330
1428
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
1331
1429
|
const { name, arguments: args } = request.params;
|
|
1332
1430
|
logger.info(`Calling tool: ${name}`, args);
|
|
@@ -1404,6 +1502,18 @@ Note: If the user's request refers to a project not listed here, ask them to exp
|
|
|
1404
1502
|
`;
|
|
1405
1503
|
return { content: [{ type: "text", text: contextPreamble + content }] };
|
|
1406
1504
|
}
|
|
1505
|
+
case "help_setup": {
|
|
1506
|
+
const msg = `
|
|
1507
|
+
RRCE MCP Server is running, but no projects are configured/exposed.
|
|
1508
|
+
|
|
1509
|
+
To fix this:
|
|
1510
|
+
1. Open a terminal.
|
|
1511
|
+
2. Run: npx rrce-workflow mcp configure
|
|
1512
|
+
3. Select the projects you want to expose to the AI.
|
|
1513
|
+
4. Restart the MCP server (or it may pick up changes automatically).
|
|
1514
|
+
`;
|
|
1515
|
+
return { content: [{ type: "text", text: msg }] };
|
|
1516
|
+
}
|
|
1407
1517
|
default:
|
|
1408
1518
|
throw new Error(`Unknown tool: ${name}`);
|
|
1409
1519
|
}
|
|
@@ -1458,6 +1568,13 @@ function registerPromptHandlers(server) {
|
|
|
1458
1568
|
Context - Available Projects (MCP Hub):
|
|
1459
1569
|
${projectList}
|
|
1460
1570
|
`;
|
|
1571
|
+
if (projects.length === 0) {
|
|
1572
|
+
contextPreamble += `
|
|
1573
|
+
WARNING: No projects are currently exposed to the MCP server.
|
|
1574
|
+
The user needs to run 'npx rrce-workflow mcp configure' in their terminal to select projects to expose.
|
|
1575
|
+
Please advise the user to do this if they expect to see project context.
|
|
1576
|
+
`;
|
|
1577
|
+
}
|
|
1461
1578
|
if (activeProject) {
|
|
1462
1579
|
contextPreamble += `
|
|
1463
1580
|
Current Active Workspace: ${activeProject.name} (${activeProject.path})
|
|
@@ -2407,6 +2524,10 @@ async function runSetupFlow(workspacePath, workspaceName, existingProjects) {
|
|
|
2407
2524
|
confirm: () => confirm2({
|
|
2408
2525
|
message: "Create configuration?",
|
|
2409
2526
|
initialValue: true
|
|
2527
|
+
}),
|
|
2528
|
+
exposeToMCP: () => confirm2({
|
|
2529
|
+
message: "Expose this project to MCP (AI Agent) server?",
|
|
2530
|
+
initialValue: true
|
|
2410
2531
|
})
|
|
2411
2532
|
},
|
|
2412
2533
|
{
|
|
@@ -2435,7 +2556,8 @@ async function runSetupFlow(workspacePath, workspaceName, existingProjects) {
|
|
|
2435
2556
|
globalPath: customGlobalPath,
|
|
2436
2557
|
tools: config.tools,
|
|
2437
2558
|
linkedProjects: config.linkedProjects,
|
|
2438
|
-
addToGitignore: config.addToGitignore
|
|
2559
|
+
addToGitignore: config.addToGitignore,
|
|
2560
|
+
exposeToMCP: config.exposeToMCP
|
|
2439
2561
|
}, workspacePath, workspaceName, existingProjects);
|
|
2440
2562
|
s.stop("Configuration generated");
|
|
2441
2563
|
const dataPaths = getDataPaths(
|
|
@@ -2464,19 +2586,28 @@ async function runSetupFlow(workspacePath, workspaceName, existingProjects) {
|
|
|
2464
2586
|
summary.push(`Workspace file: ${pc4.cyan(`${workspaceName}.code-workspace`)}`);
|
|
2465
2587
|
}
|
|
2466
2588
|
note3(summary.join("\n"), "Setup Summary");
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
initialValue: true
|
|
2470
|
-
});
|
|
2471
|
-
if (shouldConfigureMCP && !isCancel3(shouldConfigureMCP)) {
|
|
2472
|
-
const { runMCP: runMCP2 } = await Promise.resolve().then(() => (init_mcp(), mcp_exports));
|
|
2473
|
-
await runMCP2();
|
|
2474
|
-
} else {
|
|
2589
|
+
if (config.exposeToMCP) {
|
|
2590
|
+
note3(`${pc4.green("\u2713")} Project exposed to MCP Hub`, "MCP Configuration");
|
|
2475
2591
|
if (linkedProjects.length > 0) {
|
|
2476
2592
|
outro2(pc4.green(`\u2713 Setup complete! Open ${pc4.bold(`${workspaceName}.code-workspace`)} in VSCode to access linked knowledge.`));
|
|
2477
2593
|
} else {
|
|
2478
2594
|
outro2(pc4.green(`\u2713 Setup complete! Your agents are ready to use.`));
|
|
2479
2595
|
}
|
|
2596
|
+
} else {
|
|
2597
|
+
const shouldConfigureMCP = await confirm2({
|
|
2598
|
+
message: "Would you like to configure the MCP server now?",
|
|
2599
|
+
initialValue: true
|
|
2600
|
+
});
|
|
2601
|
+
if (shouldConfigureMCP && !isCancel3(shouldConfigureMCP)) {
|
|
2602
|
+
const { runMCP: runMCP2 } = await Promise.resolve().then(() => (init_mcp(), mcp_exports));
|
|
2603
|
+
await runMCP2();
|
|
2604
|
+
} else {
|
|
2605
|
+
if (linkedProjects.length > 0) {
|
|
2606
|
+
outro2(pc4.green(`\u2713 Setup complete! Open ${pc4.bold(`${workspaceName}.code-workspace`)} in VSCode to access linked knowledge.`));
|
|
2607
|
+
} else {
|
|
2608
|
+
outro2(pc4.green(`\u2713 Setup complete! Your agents are ready to use.`));
|
|
2609
|
+
}
|
|
2610
|
+
}
|
|
2480
2611
|
}
|
|
2481
2612
|
} catch (error) {
|
|
2482
2613
|
s.stop("Error occurred");
|
|
@@ -2546,6 +2677,23 @@ linked_projects:
|
|
|
2546
2677
|
);
|
|
2547
2678
|
generateVSCodeWorkspace(workspacePath, workspaceName, selectedProjects, config.globalPath);
|
|
2548
2679
|
}
|
|
2680
|
+
if (config.exposeToMCP) {
|
|
2681
|
+
try {
|
|
2682
|
+
const { loadMCPConfig: loadMCPConfig2, saveMCPConfig: saveMCPConfig2, setProjectConfig: setProjectConfig2 } = await Promise.resolve().then(() => (init_config(), config_exports));
|
|
2683
|
+
const { getWorkspaceName: getWorkspaceName2 } = await Promise.resolve().then(() => (init_paths(), paths_exports));
|
|
2684
|
+
const mcpConfig = loadMCPConfig2();
|
|
2685
|
+
const currentProjectName = workspaceName;
|
|
2686
|
+
if (config.storageMode === "workspace") {
|
|
2687
|
+
setProjectConfig2(mcpConfig, currentProjectName, true);
|
|
2688
|
+
saveMCPConfig2(mcpConfig);
|
|
2689
|
+
} else {
|
|
2690
|
+
setProjectConfig2(mcpConfig, currentProjectName, true);
|
|
2691
|
+
saveMCPConfig2(mcpConfig);
|
|
2692
|
+
}
|
|
2693
|
+
} catch (e) {
|
|
2694
|
+
console.error("Failed to update MCP config:", e);
|
|
2695
|
+
}
|
|
2696
|
+
}
|
|
2549
2697
|
}
|
|
2550
2698
|
function getDataPaths(mode, workspaceName, workspaceRoot, customGlobalPath) {
|
|
2551
2699
|
const globalPath = path12.join(customGlobalPath || getDefaultRRCEHome(), "workspaces", workspaceName);
|