fraim-framework 2.0.78 → 2.0.80
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/README.md +77 -1
- package/bin/fraim-mcp.js +1 -1
- package/bin/fraim.js +1 -1
- package/dist/src/cli/commands/add-ide.js +15 -13
- package/dist/src/cli/commands/setup.js +292 -16
- package/dist/src/cli/commands/test-mcp.js +2 -2
- package/dist/src/cli/setup/auto-mcp-setup.js +5 -5
- package/dist/src/cli/setup/codex-local-config.js +3 -3
- package/dist/src/cli/setup/first-run.js +2 -1
- package/dist/src/cli/setup/ide-detector.js +1 -1
- package/dist/src/cli/setup/mcp-config-generator.js +107 -64
- package/dist/src/cli/setup/token-validator.js +2 -2
- package/index.js +1 -1
- package/package.json +116 -116
- package/dist/src/cli/commands/init.js +0 -148
- package/dist/src/cli/commands/mcp.js +0 -65
- package/dist/src/cli/commands/wizard.js +0 -35
|
@@ -212,7 +212,7 @@ const validateSetupResults = async (configuredIDEs) => {
|
|
|
212
212
|
}
|
|
213
213
|
};
|
|
214
214
|
exports.validateSetupResults = validateSetupResults;
|
|
215
|
-
const configureIDEMCP = async (ide, fraimKey, tokenInput) => {
|
|
215
|
+
const configureIDEMCP = async (ide, fraimKey, tokenInput, jiraConfig) => {
|
|
216
216
|
const tokens = normalizePlatformTokens(tokenInput);
|
|
217
217
|
const configPath = (0, ide_detector_1.expandPath)(ide.configPath);
|
|
218
218
|
console.log(chalk_1.default.blue(`🔧 Configuring ${ide.name}...`));
|
|
@@ -244,7 +244,7 @@ const configureIDEMCP = async (ide, fraimKey, tokenInput) => {
|
|
|
244
244
|
existingTomlContent = fs_1.default.readFileSync(configPath, 'utf8');
|
|
245
245
|
console.log(chalk_1.default.gray(` 📋 Found existing TOML config`));
|
|
246
246
|
}
|
|
247
|
-
const newTomlContent = (0, mcp_config_generator_1.generateMCPConfig)(ide.configType, fraimKey, tokens);
|
|
247
|
+
const newTomlContent = (0, mcp_config_generator_1.generateMCPConfig)(ide.configType, fraimKey, tokens, jiraConfig);
|
|
248
248
|
const serversToAdd = ['fraim', 'git', 'github', 'gitlab', 'jira', 'playwright'];
|
|
249
249
|
const mergeResult = (0, mcp_config_generator_1.mergeTomlMCPServers)(existingTomlContent, newTomlContent, serversToAdd);
|
|
250
250
|
fs_1.default.writeFileSync(configPath, mergeResult.content);
|
|
@@ -260,7 +260,7 @@ const configureIDEMCP = async (ide, fraimKey, tokenInput) => {
|
|
|
260
260
|
}
|
|
261
261
|
else {
|
|
262
262
|
// For JSON configs - intelligent merging
|
|
263
|
-
const newConfig = (0, mcp_config_generator_1.generateMCPConfig)(ide.configType, fraimKey, tokens);
|
|
263
|
+
const newConfig = (0, mcp_config_generator_1.generateMCPConfig)(ide.configType, fraimKey, tokens, jiraConfig);
|
|
264
264
|
const newMCPServers = newConfig[serversKey] || newConfig.mcpServers || {};
|
|
265
265
|
// Merge MCP servers intelligently
|
|
266
266
|
const mergedMCPServers = { ...existingMCPServers };
|
|
@@ -296,7 +296,7 @@ const configureIDEMCP = async (ide, fraimKey, tokenInput) => {
|
|
|
296
296
|
console.log(chalk_1.default.green(` ✅ ${status} local Codex config: ${localResult.path}`));
|
|
297
297
|
}
|
|
298
298
|
};
|
|
299
|
-
const autoConfigureMCP = async (fraimKey, tokenInput, selectedIDEs) => {
|
|
299
|
+
const autoConfigureMCP = async (fraimKey, tokenInput, selectedIDEs, jiraConfig) => {
|
|
300
300
|
const tokens = normalizePlatformTokens(tokenInput);
|
|
301
301
|
const detectedIDEs = (0, ide_detector_1.detectInstalledIDEs)();
|
|
302
302
|
if (detectedIDEs.length === 0) {
|
|
@@ -343,7 +343,7 @@ const autoConfigureMCP = async (fraimKey, tokenInput, selectedIDEs) => {
|
|
|
343
343
|
};
|
|
344
344
|
for (const ide of idesToConfigure) {
|
|
345
345
|
try {
|
|
346
|
-
await configureIDEMCP(ide, fraimKey, tokens);
|
|
346
|
+
await configureIDEMCP(ide, fraimKey, tokens, jiraConfig);
|
|
347
347
|
results.successful.push(ide.name);
|
|
348
348
|
}
|
|
349
349
|
catch (error) {
|
|
@@ -8,9 +8,9 @@ const fs_1 = __importDefault(require("fs"));
|
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
9
|
const mcp_config_generator_1 = require("./mcp-config-generator");
|
|
10
10
|
const escapeTomlString = (value) => value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
11
|
-
const buildFraimCwdBlock = (projectRoot) => `
|
|
12
|
-
[mcp_servers.fraim]
|
|
13
|
-
cwd = "${escapeTomlString(projectRoot)}"
|
|
11
|
+
const buildFraimCwdBlock = (projectRoot) => `
|
|
12
|
+
[mcp_servers.fraim]
|
|
13
|
+
cwd = "${escapeTomlString(projectRoot)}"
|
|
14
14
|
`;
|
|
15
15
|
const ensureCodexLocalConfig = (projectRoot) => {
|
|
16
16
|
const codexDir = path_1.default.join(projectRoot, '.codex');
|
|
@@ -42,8 +42,9 @@ const chalk_1 = __importDefault(require("chalk"));
|
|
|
42
42
|
const fs_1 = __importDefault(require("fs"));
|
|
43
43
|
const path_1 = __importDefault(require("path"));
|
|
44
44
|
const os_1 = __importDefault(require("os"));
|
|
45
|
+
const script_sync_utils_1 = require("../utils/script-sync-utils");
|
|
45
46
|
const loadGlobalConfig = () => {
|
|
46
|
-
const globalConfigPath = path_1.default.join(
|
|
47
|
+
const globalConfigPath = path_1.default.join((0, script_sync_utils_1.getUserFraimDir)(), 'config.json');
|
|
47
48
|
if (!fs_1.default.existsSync(globalConfigPath)) {
|
|
48
49
|
return null;
|
|
49
50
|
}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.generateMCPConfig = exports.generateWindsurfMCPServers = exports.generateVSCodeMCPServers = exports.generateCodexMCPServers = exports.generateKiroMCPServers = exports.generateClaudeMCPServers = exports.generateStandardMCPServers = exports.mergeTomlMCPServers = exports.extractTomlMcpServerBlock = void 0;
|
|
3
|
+
exports.generateMCPConfig = exports.generateWindsurfMCPServers = exports.generateVSCodeMCPServers = exports.generateCodexMCPServers = exports.generateKiroMCPServers = exports.generateClaudeCodeMCPServers = exports.generateClaudeMCPServers = exports.generateStandardMCPServers = exports.mergeTomlMCPServers = exports.extractTomlMcpServerBlock = void 0;
|
|
4
4
|
const GITHUB_MCP_URL = 'https://api.githubcopilot.com/mcp/';
|
|
5
5
|
const GITLAB_MCP_URL = 'https://gitlab.com/api/v4/mcp';
|
|
6
|
-
const JIRA_MCP_URL = 'https://mcp.atlassian.com/v1/sse';
|
|
7
6
|
const normalizeTokens = (tokenInput) => {
|
|
8
7
|
if (!tokenInput)
|
|
9
8
|
return {};
|
|
@@ -93,7 +92,7 @@ const mergeTomlMCPServers = (existingContent, generatedContent, servers) => {
|
|
|
93
92
|
};
|
|
94
93
|
};
|
|
95
94
|
exports.mergeTomlMCPServers = mergeTomlMCPServers;
|
|
96
|
-
const generateStandardMCPServers = (fraimKey, tokenInput) => {
|
|
95
|
+
const generateStandardMCPServers = (fraimKey, tokenInput, jiraConfig) => {
|
|
97
96
|
const tokens = normalizeTokens(tokenInput);
|
|
98
97
|
const servers = {
|
|
99
98
|
git: {
|
|
@@ -128,18 +127,45 @@ const generateStandardMCPServers = (fraimKey, tokenInput) => {
|
|
|
128
127
|
}
|
|
129
128
|
};
|
|
130
129
|
}
|
|
131
|
-
if (tokens.jira) {
|
|
130
|
+
if (tokens.jira && jiraConfig?.baseUrl && jiraConfig?.email) {
|
|
132
131
|
servers.jira = {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
132
|
+
command: "npx",
|
|
133
|
+
args: ["-y", "@modelcontextprotocol/server-jira"],
|
|
134
|
+
env: {
|
|
135
|
+
JIRA_URL: jiraConfig.baseUrl.startsWith('http') ? jiraConfig.baseUrl : `https://${jiraConfig.baseUrl}`,
|
|
136
|
+
JIRA_EMAIL: jiraConfig.email,
|
|
137
|
+
JIRA_API_TOKEN: tokens.jira
|
|
136
138
|
}
|
|
137
139
|
};
|
|
138
140
|
}
|
|
139
141
|
return { mcpServers: servers };
|
|
140
142
|
};
|
|
141
143
|
exports.generateStandardMCPServers = generateStandardMCPServers;
|
|
142
|
-
const generateClaudeMCPServers = (fraimKey, tokenInput) => {
|
|
144
|
+
const generateClaudeMCPServers = (fraimKey, tokenInput, jiraConfig) => {
|
|
145
|
+
const servers = {
|
|
146
|
+
git: {
|
|
147
|
+
command: "npx",
|
|
148
|
+
args: ["-y", "@cyanheads/git-mcp-server"]
|
|
149
|
+
},
|
|
150
|
+
playwright: {
|
|
151
|
+
command: "npx",
|
|
152
|
+
args: ["-y", "@playwright/mcp"]
|
|
153
|
+
},
|
|
154
|
+
fraim: {
|
|
155
|
+
command: "fraim-mcp",
|
|
156
|
+
env: {
|
|
157
|
+
FRAIM_API_KEY: fraimKey,
|
|
158
|
+
FRAIM_REMOTE_URL: "https://fraim.wellnessatwork.me"
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
// Claude Desktop does not support HTTPS MCP servers (GitHub, GitLab, Jira)
|
|
163
|
+
// These cause Claude Desktop to break on boot
|
|
164
|
+
// See: https://github.com/mathursrus/FRAIM/issues/132
|
|
165
|
+
return { mcpServers: servers };
|
|
166
|
+
};
|
|
167
|
+
exports.generateClaudeMCPServers = generateClaudeMCPServers;
|
|
168
|
+
const generateClaudeCodeMCPServers = (fraimKey, tokenInput, jiraConfig) => {
|
|
143
169
|
const tokens = normalizeTokens(tokenInput);
|
|
144
170
|
const servers = {
|
|
145
171
|
git: {
|
|
@@ -158,10 +184,10 @@ const generateClaudeMCPServers = (fraimKey, tokenInput) => {
|
|
|
158
184
|
}
|
|
159
185
|
}
|
|
160
186
|
};
|
|
187
|
+
// Claude Code supports HTTPS MCP servers
|
|
161
188
|
if (tokens.github) {
|
|
162
189
|
servers.github = {
|
|
163
|
-
|
|
164
|
-
url: GITHUB_MCP_URL,
|
|
190
|
+
serverUrl: GITHUB_MCP_URL,
|
|
165
191
|
headers: {
|
|
166
192
|
Authorization: `Bearer ${tokens.github}`
|
|
167
193
|
}
|
|
@@ -169,26 +195,27 @@ const generateClaudeMCPServers = (fraimKey, tokenInput) => {
|
|
|
169
195
|
}
|
|
170
196
|
if (tokens.gitlab) {
|
|
171
197
|
servers.gitlab = {
|
|
172
|
-
|
|
173
|
-
url: GITLAB_MCP_URL,
|
|
198
|
+
serverUrl: GITLAB_MCP_URL,
|
|
174
199
|
headers: {
|
|
175
200
|
Authorization: `Bearer ${tokens.gitlab}`
|
|
176
201
|
}
|
|
177
202
|
};
|
|
178
203
|
}
|
|
179
|
-
if (tokens.jira) {
|
|
204
|
+
if (tokens.jira && jiraConfig?.baseUrl && jiraConfig?.email) {
|
|
180
205
|
servers.jira = {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
206
|
+
command: "npx",
|
|
207
|
+
args: ["-y", "@modelcontextprotocol/server-jira"],
|
|
208
|
+
env: {
|
|
209
|
+
JIRA_URL: jiraConfig.baseUrl.startsWith('http') ? jiraConfig.baseUrl : `https://${jiraConfig.baseUrl}`,
|
|
210
|
+
JIRA_EMAIL: jiraConfig.email,
|
|
211
|
+
JIRA_API_TOKEN: tokens.jira
|
|
185
212
|
}
|
|
186
213
|
};
|
|
187
214
|
}
|
|
188
215
|
return { mcpServers: servers };
|
|
189
216
|
};
|
|
190
|
-
exports.
|
|
191
|
-
const generateKiroMCPServers = (fraimKey, tokenInput) => {
|
|
217
|
+
exports.generateClaudeCodeMCPServers = generateClaudeCodeMCPServers;
|
|
218
|
+
const generateKiroMCPServers = (fraimKey, tokenInput, jiraConfig) => {
|
|
192
219
|
const tokens = normalizeTokens(tokenInput);
|
|
193
220
|
const servers = {
|
|
194
221
|
git: {
|
|
@@ -223,66 +250,75 @@ const generateKiroMCPServers = (fraimKey, tokenInput) => {
|
|
|
223
250
|
}
|
|
224
251
|
};
|
|
225
252
|
}
|
|
226
|
-
if (tokens.jira) {
|
|
253
|
+
if (tokens.jira && jiraConfig?.baseUrl && jiraConfig?.email) {
|
|
227
254
|
servers.jira = {
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
255
|
+
command: "npx",
|
|
256
|
+
args: ["-y", "@modelcontextprotocol/server-jira"],
|
|
257
|
+
env: {
|
|
258
|
+
JIRA_URL: jiraConfig.baseUrl.startsWith('http') ? jiraConfig.baseUrl : `https://${jiraConfig.baseUrl}`,
|
|
259
|
+
JIRA_EMAIL: jiraConfig.email,
|
|
260
|
+
JIRA_API_TOKEN: tokens.jira
|
|
231
261
|
}
|
|
232
262
|
};
|
|
233
263
|
}
|
|
234
264
|
return { mcpServers: servers };
|
|
235
265
|
};
|
|
236
266
|
exports.generateKiroMCPServers = generateKiroMCPServers;
|
|
237
|
-
const generateCodexMCPServers = (fraimKey, tokenInput) => {
|
|
267
|
+
const generateCodexMCPServers = (fraimKey, tokenInput, jiraConfig) => {
|
|
238
268
|
const tokens = normalizeTokens(tokenInput);
|
|
239
269
|
const escapedFraimKey = escapeTomlString(fraimKey);
|
|
240
|
-
let config = `
|
|
241
|
-
[mcp_servers.git]
|
|
242
|
-
command = "npx"
|
|
243
|
-
args = ["-y", "@cyanheads/git-mcp-server"]
|
|
270
|
+
let config = `
|
|
271
|
+
[mcp_servers.git]
|
|
272
|
+
command = "npx"
|
|
273
|
+
args = ["-y", "@cyanheads/git-mcp-server"]
|
|
244
274
|
`;
|
|
245
275
|
if (tokens.github) {
|
|
246
276
|
const escapedGithubToken = escapeTomlString(tokens.github);
|
|
247
|
-
config += `
|
|
248
|
-
[mcp_servers.github]
|
|
249
|
-
url = "${GITHUB_MCP_URL}"
|
|
250
|
-
http_headers = { Authorization = "Bearer ${escapedGithubToken}" }
|
|
277
|
+
config += `
|
|
278
|
+
[mcp_servers.github]
|
|
279
|
+
url = "${GITHUB_MCP_URL}"
|
|
280
|
+
http_headers = { Authorization = "Bearer ${escapedGithubToken}" }
|
|
251
281
|
`;
|
|
252
282
|
}
|
|
253
283
|
if (tokens.gitlab) {
|
|
254
284
|
const escapedGitLabToken = escapeTomlString(tokens.gitlab);
|
|
255
|
-
config += `
|
|
256
|
-
[mcp_servers.gitlab]
|
|
257
|
-
url = "${GITLAB_MCP_URL}"
|
|
258
|
-
http_headers = { Authorization = "Bearer ${escapedGitLabToken}" }
|
|
285
|
+
config += `
|
|
286
|
+
[mcp_servers.gitlab]
|
|
287
|
+
url = "${GITLAB_MCP_URL}"
|
|
288
|
+
http_headers = { Authorization = "Bearer ${escapedGitLabToken}" }
|
|
259
289
|
`;
|
|
260
290
|
}
|
|
261
|
-
if (tokens.jira) {
|
|
291
|
+
if (tokens.jira && jiraConfig?.baseUrl && jiraConfig?.email) {
|
|
262
292
|
const escapedJiraToken = escapeTomlString(tokens.jira);
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
293
|
+
const escapedJiraUrl = escapeTomlString(jiraConfig.baseUrl.startsWith('http') ? jiraConfig.baseUrl : `https://${jiraConfig.baseUrl}`);
|
|
294
|
+
const escapedJiraEmail = escapeTomlString(jiraConfig.email);
|
|
295
|
+
config += `
|
|
296
|
+
[mcp_servers.jira]
|
|
297
|
+
command = "npx"
|
|
298
|
+
args = ["-y", "@modelcontextprotocol/server-jira"]
|
|
299
|
+
|
|
300
|
+
[mcp_servers.jira.env]
|
|
301
|
+
JIRA_URL = "${escapedJiraUrl}"
|
|
302
|
+
JIRA_EMAIL = "${escapedJiraEmail}"
|
|
303
|
+
JIRA_API_TOKEN = "${escapedJiraToken}"
|
|
267
304
|
`;
|
|
268
305
|
}
|
|
269
|
-
config += `
|
|
270
|
-
[mcp_servers.playwright]
|
|
306
|
+
config += `
|
|
307
|
+
[mcp_servers.playwright]
|
|
271
308
|
command = "npx"
|
|
272
309
|
args = ["-y", "@playwright/mcp"]
|
|
273
310
|
|
|
274
311
|
[mcp_servers.fraim]
|
|
275
312
|
command = "fraim-mcp"
|
|
276
313
|
|
|
277
|
-
[mcp_servers.fraim.env]
|
|
278
|
-
FRAIM_API_KEY = "${escapedFraimKey}"
|
|
279
|
-
FRAIM_REMOTE_URL = "https://fraim.wellnessatwork.me"
|
|
314
|
+
[mcp_servers.fraim.env]
|
|
315
|
+
FRAIM_API_KEY = "${escapedFraimKey}"
|
|
316
|
+
FRAIM_REMOTE_URL = "https://fraim.wellnessatwork.me"
|
|
280
317
|
`;
|
|
281
318
|
return config;
|
|
282
319
|
};
|
|
283
320
|
exports.generateCodexMCPServers = generateCodexMCPServers;
|
|
284
|
-
|
|
285
|
-
const generateVSCodeMCPServers = (fraimKey, tokenInput) => {
|
|
321
|
+
const generateVSCodeMCPServers = (fraimKey, tokenInput, jiraConfig) => {
|
|
286
322
|
const tokens = normalizeTokens(tokenInput);
|
|
287
323
|
const servers = {
|
|
288
324
|
git: {
|
|
@@ -322,19 +358,22 @@ const generateVSCodeMCPServers = (fraimKey, tokenInput) => {
|
|
|
322
358
|
}
|
|
323
359
|
};
|
|
324
360
|
}
|
|
325
|
-
if (tokens.jira) {
|
|
361
|
+
if (tokens.jira && jiraConfig?.baseUrl && jiraConfig?.email) {
|
|
326
362
|
servers.jira = {
|
|
327
|
-
type: '
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
363
|
+
type: 'stdio',
|
|
364
|
+
command: 'npx',
|
|
365
|
+
args: ['-y', '@modelcontextprotocol/server-jira'],
|
|
366
|
+
env: {
|
|
367
|
+
JIRA_URL: jiraConfig.baseUrl.startsWith('http') ? jiraConfig.baseUrl : `https://${jiraConfig.baseUrl}`,
|
|
368
|
+
JIRA_EMAIL: jiraConfig.email,
|
|
369
|
+
JIRA_API_TOKEN: tokens.jira
|
|
331
370
|
}
|
|
332
371
|
};
|
|
333
372
|
}
|
|
334
373
|
return { servers };
|
|
335
374
|
};
|
|
336
375
|
exports.generateVSCodeMCPServers = generateVSCodeMCPServers;
|
|
337
|
-
const generateWindsurfMCPServers = (fraimKey, tokenInput) => {
|
|
376
|
+
const generateWindsurfMCPServers = (fraimKey, tokenInput, jiraConfig) => {
|
|
338
377
|
const tokens = normalizeTokens(tokenInput);
|
|
339
378
|
const servers = {
|
|
340
379
|
git: {
|
|
@@ -371,32 +410,36 @@ const generateWindsurfMCPServers = (fraimKey, tokenInput) => {
|
|
|
371
410
|
}
|
|
372
411
|
};
|
|
373
412
|
}
|
|
374
|
-
if (tokens.jira) {
|
|
413
|
+
if (tokens.jira && jiraConfig?.baseUrl && jiraConfig?.email) {
|
|
375
414
|
servers.jira = {
|
|
376
415
|
command: 'npx',
|
|
377
|
-
args: ['-y', '@modelcontextprotocol/server-
|
|
416
|
+
args: ['-y', '@modelcontextprotocol/server-jira'],
|
|
378
417
|
env: {
|
|
379
|
-
|
|
418
|
+
JIRA_URL: jiraConfig.baseUrl.startsWith('http') ? jiraConfig.baseUrl : `https://${jiraConfig.baseUrl}`,
|
|
419
|
+
JIRA_EMAIL: jiraConfig.email,
|
|
420
|
+
JIRA_API_TOKEN: tokens.jira
|
|
380
421
|
}
|
|
381
422
|
};
|
|
382
423
|
}
|
|
383
424
|
return { mcpServers: servers };
|
|
384
425
|
};
|
|
385
426
|
exports.generateWindsurfMCPServers = generateWindsurfMCPServers;
|
|
386
|
-
const generateMCPConfig = (configType, fraimKey, tokenInput) => {
|
|
427
|
+
const generateMCPConfig = (configType, fraimKey, tokenInput, jiraConfig) => {
|
|
387
428
|
switch (configType) {
|
|
388
429
|
case 'standard':
|
|
389
|
-
return (0, exports.generateStandardMCPServers)(fraimKey, tokenInput);
|
|
430
|
+
return (0, exports.generateStandardMCPServers)(fraimKey, tokenInput, jiraConfig);
|
|
390
431
|
case 'claude':
|
|
391
|
-
return (0, exports.generateClaudeMCPServers)(fraimKey, tokenInput);
|
|
432
|
+
return (0, exports.generateClaudeMCPServers)(fraimKey, tokenInput, jiraConfig);
|
|
433
|
+
case 'claude-code':
|
|
434
|
+
return (0, exports.generateClaudeCodeMCPServers)(fraimKey, tokenInput, jiraConfig);
|
|
392
435
|
case 'kiro':
|
|
393
|
-
return (0, exports.generateKiroMCPServers)(fraimKey, tokenInput);
|
|
436
|
+
return (0, exports.generateKiroMCPServers)(fraimKey, tokenInput, jiraConfig);
|
|
394
437
|
case 'vscode':
|
|
395
|
-
return (0, exports.generateVSCodeMCPServers)(fraimKey, tokenInput);
|
|
438
|
+
return (0, exports.generateVSCodeMCPServers)(fraimKey, tokenInput, jiraConfig);
|
|
396
439
|
case 'codex':
|
|
397
|
-
return (0, exports.generateCodexMCPServers)(fraimKey, tokenInput);
|
|
440
|
+
return (0, exports.generateCodexMCPServers)(fraimKey, tokenInput, jiraConfig);
|
|
398
441
|
case 'windsurf':
|
|
399
|
-
return (0, exports.generateWindsurfMCPServers)(fraimKey, tokenInput);
|
|
442
|
+
return (0, exports.generateWindsurfMCPServers)(fraimKey, tokenInput, jiraConfig);
|
|
400
443
|
default:
|
|
401
444
|
throw new Error(`Unsupported config type: ${configType}`);
|
|
402
445
|
}
|
|
@@ -49,8 +49,8 @@ const isValidTokenFormat = (token, type) => {
|
|
|
49
49
|
return token.startsWith('glpat-') || token.length >= 20;
|
|
50
50
|
}
|
|
51
51
|
if (type === 'jira') {
|
|
52
|
-
// Jira API tokens
|
|
53
|
-
return token.length >= 20;
|
|
52
|
+
// Jira API tokens typically start with ATATT3 and have a minimum length.
|
|
53
|
+
return token.startsWith('ATATT3') && token.length >= 20;
|
|
54
54
|
}
|
|
55
55
|
return false;
|
|
56
56
|
};
|
package/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,116 +1,116 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "fraim-framework",
|
|
3
|
-
"version": "2.0.
|
|
4
|
-
"description": "FRAIM v2: Framework for Rigor-based AI Management - Transform from solo developer to AI manager orchestrating production-ready code with enterprise-grade discipline",
|
|
5
|
-
"main": "index.js",
|
|
6
|
-
"bin": {
|
|
7
|
-
"fraim": "./index.js",
|
|
8
|
-
"fraim-framework": "./index.js",
|
|
9
|
-
"fraim-mcp": "./bin/fraim-mcp.js"
|
|
10
|
-
},
|
|
11
|
-
"scripts": {
|
|
12
|
-
"dev": "tsx --watch src/fraim-mcp-server.ts > server.log 2>&1",
|
|
13
|
-
"dev:prod": "npm run build && node dist/src/fraim-mcp-server.js > server.log 2>&1",
|
|
14
|
-
"build": "tsc && npm run build:stubs && node scripts/copy-ai-manager-rules.js && npm run validate:registry && tsx scripts/validate-purity.ts",
|
|
15
|
-
"build:stubs": "tsx scripts/build-stub-registry.ts",
|
|
16
|
-
"test-all": "npm run test && npm run test:ui",
|
|
17
|
-
"test": "node scripts/test-with-server.js",
|
|
18
|
-
"test:ui": "playwright test",
|
|
19
|
-
"test:ui:headed": "playwright test --headed",
|
|
20
|
-
"start:fraim": "tsx src/fraim-mcp-server.ts",
|
|
21
|
-
"dev:fraim": "tsx --watch src/fraim-mcp-server.ts",
|
|
22
|
-
"serve:website": "node fraim-pro/serve.js",
|
|
23
|
-
"watch:fraimlogs": "tsx scripts/watch-fraim-logs.ts > prodlogs.log 2>&1",
|
|
24
|
-
"manage-keys": "tsx scripts/fraim/manage-keys.ts",
|
|
25
|
-
"view-signups": "tsx scripts/view-signups.ts",
|
|
26
|
-
"fraim:init": "npm run build && node index.js init",
|
|
27
|
-
"fraim:sync": "node index.js sync --local",
|
|
28
|
-
"postinstall": "fraim sync --skip-updates || echo 'FRAIM setup skipped.'",
|
|
29
|
-
"prepublishOnly": "npm run build",
|
|
30
|
-
"release": "npm version patch && npm publish",
|
|
31
|
-
"validate:registry": "tsx scripts/verify-registry-paths.ts && npm run validate:workflows && npm run validate:skills && npm run validate:platform-agnostic && npm run validate:template-namespaces && npm run validate:config-fallbacks && npm run validate:bootstrap-config-coverage && npm run validate:provider-action-mappings",
|
|
32
|
-
"validate:workflows": "tsx scripts/validate-workflows.ts",
|
|
33
|
-
"validate:platform-agnostic": "tsx scripts/validate-platform-agnostic.ts",
|
|
34
|
-
"validate:skills": "tsx scripts/validate-skills.ts",
|
|
35
|
-
"validate:template-namespaces": "tsx scripts/validate-template-namespaces.ts",
|
|
36
|
-
"validate:config-fallbacks": "tsx scripts/validate-config-fallbacks.ts",
|
|
37
|
-
"validate:bootstrap-config-coverage": "tsx scripts/validate-bootstrap-config-coverage.ts",
|
|
38
|
-
"validate:provider-action-mappings": "tsx scripts/validate-provider-action-mappings.ts"
|
|
39
|
-
},
|
|
40
|
-
"repository": {
|
|
41
|
-
"type": "git",
|
|
42
|
-
"url": "git+https://github.com/mathursrus/FRAIM.git"
|
|
43
|
-
},
|
|
44
|
-
"keywords": [
|
|
45
|
-
"fraim",
|
|
46
|
-
"ai-management",
|
|
47
|
-
"ai-coordination",
|
|
48
|
-
"ai-agents",
|
|
49
|
-
"multi-agent",
|
|
50
|
-
"github",
|
|
51
|
-
"workflow",
|
|
52
|
-
"automation",
|
|
53
|
-
"gitops",
|
|
54
|
-
"cursor",
|
|
55
|
-
"claude",
|
|
56
|
-
"windsurf",
|
|
57
|
-
"rigor",
|
|
58
|
-
"enterprise",
|
|
59
|
-
"framework",
|
|
60
|
-
"ai-managers"
|
|
61
|
-
],
|
|
62
|
-
"author": "Sid Mathur <sid.mathur@gmail.com>",
|
|
63
|
-
"license": "MIT",
|
|
64
|
-
"bugs": {
|
|
65
|
-
"url": "https://github.com/mathursrus/FRAIM/issues"
|
|
66
|
-
},
|
|
67
|
-
"homepage": "https://github.com/mathursrus/FRAIM#readme",
|
|
68
|
-
"engines": {
|
|
69
|
-
"node": ">=16.0.0"
|
|
70
|
-
},
|
|
71
|
-
"devDependencies": {
|
|
72
|
-
"@playwright/test": "^1.58.2",
|
|
73
|
-
"@types/cors": "^2.8.19",
|
|
74
|
-
"@types/express": "^5.0.6",
|
|
75
|
-
"@types/node": "^20.0.0",
|
|
76
|
-
"@types/prompts": "^2.4.9",
|
|
77
|
-
"fast-glob": "^3.3.3",
|
|
78
|
-
"html-to-docx": "^1.8.0",
|
|
79
|
-
"markdown-it": "^14.1.0",
|
|
80
|
-
"markdown-it-highlightjs": "^4.2.0",
|
|
81
|
-
"playwright": "^1.58.2",
|
|
82
|
-
"pptxgenjs": "^4.0.1",
|
|
83
|
-
"puppeteer": "^24.36.1",
|
|
84
|
-
"qrcode": "^1.5.4",
|
|
85
|
-
"sharp": "^0.34.5",
|
|
86
|
-
"tsx": "^4.0.0",
|
|
87
|
-
"typescript": "^5.0.0"
|
|
88
|
-
},
|
|
89
|
-
"files": [
|
|
90
|
-
"dist/src/local-mcp-server/",
|
|
91
|
-
"dist/src/cli/",
|
|
92
|
-
"dist/src/core/",
|
|
93
|
-
"bin/fraim.js",
|
|
94
|
-
"bin/fraim-mcp.js",
|
|
95
|
-
"index.js",
|
|
96
|
-
"README.md",
|
|
97
|
-
"CHANGELOG.md",
|
|
98
|
-
"LICENSE",
|
|
99
|
-
"package.json"
|
|
100
|
-
],
|
|
101
|
-
"publishConfig": {
|
|
102
|
-
"access": "public"
|
|
103
|
-
},
|
|
104
|
-
"dependencies": {
|
|
105
|
-
"axios": "^1.7.0",
|
|
106
|
-
"chalk": "4.1.2",
|
|
107
|
-
"commander": "^14.0.2",
|
|
108
|
-
"cors": "^2.8.5",
|
|
109
|
-
"dotenv": "^16.4.7",
|
|
110
|
-
"express": "^5.2.1",
|
|
111
|
-
"mongodb": "^7.0.0",
|
|
112
|
-
"prompts": "^2.4.2",
|
|
113
|
-
"stripe": "^20.3.1",
|
|
114
|
-
"tree-kill": "^1.2.2"
|
|
115
|
-
}
|
|
116
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "fraim-framework",
|
|
3
|
+
"version": "2.0.80",
|
|
4
|
+
"description": "FRAIM v2: Framework for Rigor-based AI Management - Transform from solo developer to AI manager orchestrating production-ready code with enterprise-grade discipline",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"fraim": "./index.js",
|
|
8
|
+
"fraim-framework": "./index.js",
|
|
9
|
+
"fraim-mcp": "./bin/fraim-mcp.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"dev": "tsx --watch src/fraim-mcp-server.ts > server.log 2>&1",
|
|
13
|
+
"dev:prod": "npm run build && node dist/src/fraim-mcp-server.js > server.log 2>&1",
|
|
14
|
+
"build": "tsc && npm run build:stubs && node scripts/copy-ai-manager-rules.js && npm run validate:registry && tsx scripts/validate-purity.ts",
|
|
15
|
+
"build:stubs": "tsx scripts/build-stub-registry.ts",
|
|
16
|
+
"test-all": "npm run test && npm run test:ui",
|
|
17
|
+
"test": "node scripts/test-with-server.js",
|
|
18
|
+
"test:ui": "playwright test",
|
|
19
|
+
"test:ui:headed": "playwright test --headed",
|
|
20
|
+
"start:fraim": "tsx src/fraim-mcp-server.ts",
|
|
21
|
+
"dev:fraim": "tsx --watch src/fraim-mcp-server.ts",
|
|
22
|
+
"serve:website": "node fraim-pro/serve.js",
|
|
23
|
+
"watch:fraimlogs": "tsx scripts/watch-fraim-logs.ts > prodlogs.log 2>&1",
|
|
24
|
+
"manage-keys": "tsx scripts/fraim/manage-keys.ts",
|
|
25
|
+
"view-signups": "tsx scripts/view-signups.ts",
|
|
26
|
+
"fraim:init": "npm run build && node index.js init",
|
|
27
|
+
"fraim:sync": "node index.js sync --local",
|
|
28
|
+
"postinstall": "fraim sync --skip-updates || echo 'FRAIM setup skipped.'",
|
|
29
|
+
"prepublishOnly": "npm run build",
|
|
30
|
+
"release": "npm version patch && npm publish",
|
|
31
|
+
"validate:registry": "tsx scripts/verify-registry-paths.ts && npm run validate:workflows && npm run validate:skills && npm run validate:platform-agnostic && npm run validate:template-namespaces && npm run validate:config-fallbacks && npm run validate:bootstrap-config-coverage && npm run validate:provider-action-mappings",
|
|
32
|
+
"validate:workflows": "tsx scripts/validate-workflows.ts",
|
|
33
|
+
"validate:platform-agnostic": "tsx scripts/validate-platform-agnostic.ts",
|
|
34
|
+
"validate:skills": "tsx scripts/validate-skills.ts",
|
|
35
|
+
"validate:template-namespaces": "tsx scripts/validate-template-namespaces.ts",
|
|
36
|
+
"validate:config-fallbacks": "tsx scripts/validate-config-fallbacks.ts",
|
|
37
|
+
"validate:bootstrap-config-coverage": "tsx scripts/validate-bootstrap-config-coverage.ts",
|
|
38
|
+
"validate:provider-action-mappings": "tsx scripts/validate-provider-action-mappings.ts"
|
|
39
|
+
},
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": "git+https://github.com/mathursrus/FRAIM.git"
|
|
43
|
+
},
|
|
44
|
+
"keywords": [
|
|
45
|
+
"fraim",
|
|
46
|
+
"ai-management",
|
|
47
|
+
"ai-coordination",
|
|
48
|
+
"ai-agents",
|
|
49
|
+
"multi-agent",
|
|
50
|
+
"github",
|
|
51
|
+
"workflow",
|
|
52
|
+
"automation",
|
|
53
|
+
"gitops",
|
|
54
|
+
"cursor",
|
|
55
|
+
"claude",
|
|
56
|
+
"windsurf",
|
|
57
|
+
"rigor",
|
|
58
|
+
"enterprise",
|
|
59
|
+
"framework",
|
|
60
|
+
"ai-managers"
|
|
61
|
+
],
|
|
62
|
+
"author": "Sid Mathur <sid.mathur@gmail.com>",
|
|
63
|
+
"license": "MIT",
|
|
64
|
+
"bugs": {
|
|
65
|
+
"url": "https://github.com/mathursrus/FRAIM/issues"
|
|
66
|
+
},
|
|
67
|
+
"homepage": "https://github.com/mathursrus/FRAIM#readme",
|
|
68
|
+
"engines": {
|
|
69
|
+
"node": ">=16.0.0"
|
|
70
|
+
},
|
|
71
|
+
"devDependencies": {
|
|
72
|
+
"@playwright/test": "^1.58.2",
|
|
73
|
+
"@types/cors": "^2.8.19",
|
|
74
|
+
"@types/express": "^5.0.6",
|
|
75
|
+
"@types/node": "^20.0.0",
|
|
76
|
+
"@types/prompts": "^2.4.9",
|
|
77
|
+
"fast-glob": "^3.3.3",
|
|
78
|
+
"html-to-docx": "^1.8.0",
|
|
79
|
+
"markdown-it": "^14.1.0",
|
|
80
|
+
"markdown-it-highlightjs": "^4.2.0",
|
|
81
|
+
"playwright": "^1.58.2",
|
|
82
|
+
"pptxgenjs": "^4.0.1",
|
|
83
|
+
"puppeteer": "^24.36.1",
|
|
84
|
+
"qrcode": "^1.5.4",
|
|
85
|
+
"sharp": "^0.34.5",
|
|
86
|
+
"tsx": "^4.0.0",
|
|
87
|
+
"typescript": "^5.0.0"
|
|
88
|
+
},
|
|
89
|
+
"files": [
|
|
90
|
+
"dist/src/local-mcp-server/",
|
|
91
|
+
"dist/src/cli/",
|
|
92
|
+
"dist/src/core/",
|
|
93
|
+
"bin/fraim.js",
|
|
94
|
+
"bin/fraim-mcp.js",
|
|
95
|
+
"index.js",
|
|
96
|
+
"README.md",
|
|
97
|
+
"CHANGELOG.md",
|
|
98
|
+
"LICENSE",
|
|
99
|
+
"package.json"
|
|
100
|
+
],
|
|
101
|
+
"publishConfig": {
|
|
102
|
+
"access": "public"
|
|
103
|
+
},
|
|
104
|
+
"dependencies": {
|
|
105
|
+
"axios": "^1.7.0",
|
|
106
|
+
"chalk": "4.1.2",
|
|
107
|
+
"commander": "^14.0.2",
|
|
108
|
+
"cors": "^2.8.5",
|
|
109
|
+
"dotenv": "^16.4.7",
|
|
110
|
+
"express": "^5.2.1",
|
|
111
|
+
"mongodb": "^7.0.0",
|
|
112
|
+
"prompts": "^2.4.2",
|
|
113
|
+
"stripe": "^20.3.1",
|
|
114
|
+
"tree-kill": "^1.2.2"
|
|
115
|
+
}
|
|
116
|
+
}
|