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.
@@ -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(os_1.default.homedir(), '.fraim', 'config.json');
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
  }
@@ -59,7 +59,7 @@ exports.IDE_CONFIGS = [
59
59
  name: 'Claude Code',
60
60
  configPath: '~/.claude.json',
61
61
  configFormat: 'json',
62
- configType: 'claude',
62
+ configType: 'claude-code',
63
63
  detectMethod: detectClaude,
64
64
  alternativePaths: [
65
65
  '~/.claude/settings.json'
@@ -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
- serverUrl: JIRA_MCP_URL,
134
- headers: {
135
- Authorization: `Bearer ${tokens.jira}`
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
- type: "http",
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
- type: 'http',
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
- type: 'http',
182
- url: JIRA_MCP_URL,
183
- headers: {
184
- Authorization: `Bearer ${tokens.jira}`
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.generateClaudeMCPServers = generateClaudeMCPServers;
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
- url: JIRA_MCP_URL,
229
- headers: {
230
- Authorization: `Bearer ${tokens.jira}`
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
- config += `
264
- [mcp_servers.jira]
265
- url = "${JIRA_MCP_URL}"
266
- http_headers = { Authorization = "Bearer ${escapedJiraToken}" }
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
- /** VS Code uses "servers" key and requires type: "stdio" for stdio servers */
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: 'http',
328
- url: JIRA_MCP_URL,
329
- headers: {
330
- Authorization: `Bearer ${tokens.jira}`
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-fetch', JIRA_MCP_URL],
416
+ args: ['-y', '@modelcontextprotocol/server-jira'],
378
417
  env: {
379
- JIRA_TOKEN: tokens.jira
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 do not have a stable prefix; enforce a minimum length.
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
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env node
2
2
 
3
3
  /**
4
4
  * FRAIM Framework - Smart Entry Point
package/package.json CHANGED
@@ -1,116 +1,116 @@
1
- {
2
- "name": "fraim-framework",
3
- "version": "2.0.78",
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
+ }