embark-cli 1.1.7
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/.claude/CLAUDE.md +33 -0
- package/.claude/settings.local.json +32 -0
- package/.github/WORKFLOWS.md +147 -0
- package/.github/workflows/ci.yml +49 -0
- package/.github/workflows/publish.yml +109 -0
- package/.idea/embark-remote-mcp.iml +9 -0
- package/.idea/encodings.xml +4 -0
- package/.idea/indexLayout.xml +8 -0
- package/.idea/vcs.xml +6 -0
- package/.mcp.json +14 -0
- package/GIT_DISCOVERY.md +231 -0
- package/INTEGRATION_TESTING.md +243 -0
- package/MULTI_REPOSITORY_SEARCH.md +242 -0
- package/README.md +434 -0
- package/dist/auth/auth-helper.d.ts +3 -0
- package/dist/auth/auth-helper.d.ts.map +1 -0
- package/dist/auth/auth-helper.js +171 -0
- package/dist/auth/auth-helper.js.map +1 -0
- package/dist/auth/index.d.ts +4 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +24 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/jba-login.d.ts +17 -0
- package/dist/auth/jba-login.d.ts.map +1 -0
- package/dist/auth/jba-login.js +345 -0
- package/dist/auth/jba-login.js.map +1 -0
- package/dist/auth/types.d.ts +16 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +3 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/config.d.ts +26 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +54 -0
- package/dist/config.js.map +1 -0
- package/dist/embark-client.d.ts +56 -0
- package/dist/embark-client.d.ts.map +1 -0
- package/dist/embark-client.js +543 -0
- package/dist/embark-client.js.map +1 -0
- package/dist/git-utils.d.ts +47 -0
- package/dist/git-utils.d.ts.map +1 -0
- package/dist/git-utils.js +232 -0
- package/dist/git-utils.js.map +1 -0
- package/dist/handlers.d.ts +80 -0
- package/dist/handlers.d.ts.map +1 -0
- package/dist/handlers.js +301 -0
- package/dist/handlers.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +165 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +4 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +92 -0
- package/dist/logger.js.map +1 -0
- package/dist/stats-server.d.ts +3 -0
- package/dist/stats-server.d.ts.map +1 -0
- package/dist/stats-server.js +623 -0
- package/dist/stats-server.js.map +1 -0
- package/dist/stats.d.ts +118 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +206 -0
- package/dist/stats.js.map +1 -0
- package/dist/tools.d.ts +9 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +62 -0
- package/dist/tools.js.map +1 -0
- package/package.json +47 -0
- package/test-git-discovery.mjs +322 -0
- package/test-multi-repo-filters.mjs +151 -0
- package/test-multiple-roots.mjs +436 -0
- package/test-roots.mjs +306 -0
- package/test-snippet-extraction.mjs +136 -0
- package/watch-logs.sh +78 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
8
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
9
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
10
|
+
const package_json_1 = __importDefault(require("../package.json"));
|
|
11
|
+
const logger_js_1 = require("./logger.js");
|
|
12
|
+
const config_js_1 = require("./config.js");
|
|
13
|
+
const handlers_js_1 = require("./handlers.js");
|
|
14
|
+
const stats_js_1 = require("./stats.js");
|
|
15
|
+
const stats_server_js_1 = require("./stats-server.js");
|
|
16
|
+
const child_process_1 = require("child_process");
|
|
17
|
+
// Initialize logging on startup
|
|
18
|
+
(0, logger_js_1.initializeLogging)();
|
|
19
|
+
const cliArgs = process.argv.slice(2);
|
|
20
|
+
if (cliArgs[0] === 'stats-server') {
|
|
21
|
+
const port = parsePort(cliArgs.slice(1));
|
|
22
|
+
(0, stats_server_js_1.startStatsServer)(port).catch((error) => {
|
|
23
|
+
(0, logger_js_1.logToFile)('error', 'Stats server failed to start', { error });
|
|
24
|
+
console.error('Failed to start stats server:', error);
|
|
25
|
+
process.exit(1);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
else if (cliArgs[0] === 'stats') {
|
|
29
|
+
const port = parsePort(cliArgs.slice(1));
|
|
30
|
+
startStatsDashboard(port).catch((error) => {
|
|
31
|
+
(0, logger_js_1.logToFile)('error', 'Stats dashboard command failed', { error });
|
|
32
|
+
console.error('Failed to start stats dashboard:', error);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
startEmbarkServer().catch((error) => {
|
|
38
|
+
(0, logger_js_1.logToFile)('error', 'Server runtime error', { error });
|
|
39
|
+
process.exit(1);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function parsePort(args) {
|
|
43
|
+
const defaultPort = 43210;
|
|
44
|
+
for (let i = 0; i < args.length; i++) {
|
|
45
|
+
const token = args[i];
|
|
46
|
+
if (!token)
|
|
47
|
+
continue;
|
|
48
|
+
if (token.startsWith('--port=')) {
|
|
49
|
+
const value = parseInt(token.split('=')[1] || '', 10);
|
|
50
|
+
if (!Number.isNaN(value)) {
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else if (token === '--port' || token === '-p') {
|
|
55
|
+
const next = args[i + 1];
|
|
56
|
+
if (next) {
|
|
57
|
+
const value = parseInt(next, 10);
|
|
58
|
+
if (!Number.isNaN(value)) {
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return defaultPort;
|
|
65
|
+
}
|
|
66
|
+
async function startEmbarkServer() {
|
|
67
|
+
const config = (0, config_js_1.loadConfig)();
|
|
68
|
+
(0, stats_js_1.recordInitializationEvent)(package_json_1.default.version, config, { enableLocalLogs: logger_js_1.LOG_ENABLED });
|
|
69
|
+
const server = new index_js_1.Server({
|
|
70
|
+
name: package_json_1.default.name,
|
|
71
|
+
version: package_json_1.default.version,
|
|
72
|
+
}, {
|
|
73
|
+
capabilities: {
|
|
74
|
+
tools: {},
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
|
|
78
|
+
return await (0, handlers_js_1.handleListTools)();
|
|
79
|
+
});
|
|
80
|
+
server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
81
|
+
const { name, arguments: args } = request.params;
|
|
82
|
+
return await (0, handlers_js_1.handleCallTool)(name, args, config, package_json_1.default, server);
|
|
83
|
+
});
|
|
84
|
+
(0, logger_js_1.logToFile)('info', 'Server launch initiated.');
|
|
85
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
86
|
+
const startupInfo = {
|
|
87
|
+
purpose: 'Provides semantic code search capabilities through Embark API',
|
|
88
|
+
version: package_json_1.default.version,
|
|
89
|
+
about: 'Embark uses AI-powered semantic search to understand code meaning and context, not just keyword matching. It finds relevant code even when exact terms differ. The search works best with detailed, descriptive queries that explain what you are looking for in natural language.',
|
|
90
|
+
queryExamples: {
|
|
91
|
+
good: [
|
|
92
|
+
"function that validates user email addresses and returns boolean",
|
|
93
|
+
"error handling middleware for HTTP requests with logging",
|
|
94
|
+
"React component that renders a modal dialog with close button"
|
|
95
|
+
],
|
|
96
|
+
poor: ["email", "error", "modal"]
|
|
97
|
+
},
|
|
98
|
+
configuration: {
|
|
99
|
+
baseUrl: config.jetbrainsAiUrl,
|
|
100
|
+
defaultRepositoryGitRemoteUrl: config.repositoryGitRemoteUrl,
|
|
101
|
+
defaultRepositoryRevision: config.repositoryRevision || 'Not set',
|
|
102
|
+
typeToken: config.typeToken,
|
|
103
|
+
endpointPrefix: (0, config_js_1.getEndpointPrefix)(config.typeToken),
|
|
104
|
+
jwtToken: process.env.GRAZIE_JWT_TOKEN ? 'Set' : 'Not set',
|
|
105
|
+
oauthSupport: process.env.GRAZIE_JWT_TOKEN ? 'Fallback' : 'Primary'
|
|
106
|
+
},
|
|
107
|
+
availableCommands: {
|
|
108
|
+
semantic_code_search: 'Semantic search for code'
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
(0, logger_js_1.logToFile)('info', 'Embark Remote MCP Server starting', startupInfo);
|
|
112
|
+
try {
|
|
113
|
+
await server.connect(transport);
|
|
114
|
+
(0, logger_js_1.logToFile)('info', 'Server connected to stdio transport');
|
|
115
|
+
// Set up notification handler for roots changes
|
|
116
|
+
server.setNotificationHandler(types_js_1.RootsListChangedNotificationSchema, async () => {
|
|
117
|
+
(0, logger_js_1.logToFile)('info', 'Received roots/list_changed notification, reinitializing repositories');
|
|
118
|
+
await (0, handlers_js_1.initializeRepositories)(server, config);
|
|
119
|
+
});
|
|
120
|
+
// After connection, initialize repositories by requesting roots from the client
|
|
121
|
+
await (0, handlers_js_1.initializeRepositories)(server, config);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
(0, logger_js_1.logToFile)('error', 'Server failed to connect', { error });
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async function startStatsDashboard(port) {
|
|
129
|
+
const server = await (0, stats_server_js_1.startStatsServer)(port);
|
|
130
|
+
const resolvedPort = getServerPort(server, port);
|
|
131
|
+
const url = `http://localhost:${resolvedPort}`;
|
|
132
|
+
(0, logger_js_1.logToFile)('info', 'Stats dashboard running', { url, port: resolvedPort });
|
|
133
|
+
console.error(`[embark-mcp] Opening ${url} in your browser...`);
|
|
134
|
+
openBrowser(url);
|
|
135
|
+
}
|
|
136
|
+
function openBrowser(url) {
|
|
137
|
+
let command;
|
|
138
|
+
let args;
|
|
139
|
+
if (process.platform === 'darwin') {
|
|
140
|
+
command = 'open';
|
|
141
|
+
args = [url];
|
|
142
|
+
}
|
|
143
|
+
else if (process.platform === 'win32') {
|
|
144
|
+
command = 'cmd';
|
|
145
|
+
args = ['/c', 'start', '""', url];
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
command = 'xdg-open';
|
|
149
|
+
args = [url];
|
|
150
|
+
}
|
|
151
|
+
const child = (0, child_process_1.spawn)(command, args, { stdio: 'ignore', detached: true });
|
|
152
|
+
child.on('error', (error) => {
|
|
153
|
+
(0, logger_js_1.logToFile)('error', 'Failed to open browser for stats dashboard', { error, url });
|
|
154
|
+
console.error('Unable to automatically open browser. Visit:', url);
|
|
155
|
+
});
|
|
156
|
+
child.unref();
|
|
157
|
+
}
|
|
158
|
+
function getServerPort(server, fallback) {
|
|
159
|
+
const address = server.address();
|
|
160
|
+
if (address && typeof address === 'object') {
|
|
161
|
+
return address.port;
|
|
162
|
+
}
|
|
163
|
+
return fallback;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,WAAW,SAAoF,CAAC;AAK7G,wBAAgB,iBAAiB,SAmBhC;AAwBD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,QAgCnE"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LOG_ENABLED = void 0;
|
|
7
|
+
exports.initializeLogging = initializeLogging;
|
|
8
|
+
exports.logToFile = logToFile;
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const os_1 = __importDefault(require("os"));
|
|
12
|
+
const package_json_1 = __importDefault(require("../package.json"));
|
|
13
|
+
const stats_js_1 = require("./stats.js");
|
|
14
|
+
// Accept 'true', '1', 'yes', or any truthy string value
|
|
15
|
+
exports.LOG_ENABLED = ['true', '1', 'yes'].includes(process.env.ENABLE_LOCAL_LOGS?.toLowerCase() || '');
|
|
16
|
+
const LOG_DIR = path_1.default.join(os_1.default.homedir(), '.embark');
|
|
17
|
+
const LOG_FILE = path_1.default.join(LOG_DIR, 'debug.log');
|
|
18
|
+
function initializeLogging() {
|
|
19
|
+
if (!exports.LOG_ENABLED) {
|
|
20
|
+
// Write to stderr to help diagnose logging issues
|
|
21
|
+
console.error(`[embark-mcp v${package_json_1.default.version}] Local logging is disabled. Set ENABLE_LOCAL_LOGS=true to enable logging to ${LOG_FILE}`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
if (!fs_1.default.existsSync(LOG_DIR)) {
|
|
26
|
+
fs_1.default.mkdirSync(LOG_DIR, { recursive: true });
|
|
27
|
+
}
|
|
28
|
+
fs_1.default.appendFileSync(LOG_FILE, `\n--- New Session: ${new Date().toISOString()} | Version: ${package_json_1.default.version} ---\n`);
|
|
29
|
+
console.error(`[embark-mcp v${package_json_1.default.version}] Local logging enabled. Writing logs to: ${LOG_FILE}`);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
// Log to both console and file, as this is a critical failure
|
|
33
|
+
const errorMessage = `Failed to create log directory: ${error instanceof Error ? error.message : String(error)}`;
|
|
34
|
+
console.error(errorMessage);
|
|
35
|
+
logToFile('error', errorMessage, { error });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function formatData(data) {
|
|
39
|
+
if (data === undefined || data === null) {
|
|
40
|
+
return data;
|
|
41
|
+
}
|
|
42
|
+
if (data instanceof Error) {
|
|
43
|
+
return { message: data.message, stack: data.stack, name: data.name };
|
|
44
|
+
}
|
|
45
|
+
if (typeof data === 'object') {
|
|
46
|
+
try {
|
|
47
|
+
return JSON.parse(JSON.stringify(data, (key, value) => {
|
|
48
|
+
if (value instanceof Error) {
|
|
49
|
+
return { message: value.message, stack: value.stack };
|
|
50
|
+
}
|
|
51
|
+
return value;
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
return 'Could not stringify object data';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return data;
|
|
59
|
+
}
|
|
60
|
+
function logToFile(level, message, data) {
|
|
61
|
+
const timestamp = new Date().toISOString();
|
|
62
|
+
if (level === 'error') {
|
|
63
|
+
try {
|
|
64
|
+
(0, stats_js_1.recordErrorEvent)({
|
|
65
|
+
level,
|
|
66
|
+
message,
|
|
67
|
+
source: 'log',
|
|
68
|
+
context: formatData(data),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
// Swallow to avoid blocking logging if stats fail
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (!exports.LOG_ENABLED)
|
|
76
|
+
return;
|
|
77
|
+
try {
|
|
78
|
+
const logEntry = {
|
|
79
|
+
timestamp,
|
|
80
|
+
level,
|
|
81
|
+
message,
|
|
82
|
+
...(data && { data: formatData(data) }),
|
|
83
|
+
};
|
|
84
|
+
const logLine = JSON.stringify(logEntry, null, 2) + '\n';
|
|
85
|
+
fs_1.default.appendFileSync(LOG_FILE, logLine);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
// Fallback to console.error if file logging fails
|
|
89
|
+
console.error('Failed to write to log file:', error);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats-server.d.ts","sourceRoot":"","sources":["../src/stats-server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAoDxB,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAiCzE"}
|