fraim 2.0.179 → 2.0.182
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/src/ai-hub/desktop-main.js +2 -2
- package/dist/src/api/admin/payments.js +33 -0
- package/dist/src/api/admin/sales-leads.js +21 -0
- package/dist/src/api/payment/create-session.js +338 -0
- package/dist/src/api/payment/dashboard-link.js +149 -0
- package/dist/src/api/payment/session-details.js +31 -0
- package/dist/src/api/payment/webhook.js +587 -0
- package/dist/src/api/personas/me.js +29 -0
- package/dist/src/api/pricing/get-config.js +25 -0
- package/dist/src/api/sales/contact.js +44 -0
- package/dist/src/cli/commands/add-ide.js +9 -2
- package/dist/src/cli/commands/setup.js +14 -44
- package/dist/src/cli/distribution/marketplace-bundles.js +5 -1
- package/dist/src/cli/setup/ide-detector.js +7 -2
- package/dist/src/core/config-loader.js +10 -8
- package/dist/src/core/types.js +2 -1
- package/dist/src/db/payment-repository.js +61 -0
- package/dist/src/fraim/config-loader.js +11 -0
- package/dist/src/fraim/db-service.js +2387 -0
- package/dist/src/fraim/issues.js +152 -0
- package/dist/src/fraim/template-processor.js +184 -0
- package/dist/src/fraim/utils/request-utils.js +23 -0
- package/dist/src/middleware/auth.js +266 -0
- package/dist/src/middleware/cors-config.js +111 -0
- package/dist/src/middleware/logger.js +116 -0
- package/dist/src/middleware/rate-limit.js +110 -0
- package/dist/src/middleware/reject-query-api-key.js +45 -0
- package/dist/src/middleware/security-headers.js +41 -0
- package/dist/src/middleware/telemetry.js +134 -0
- package/dist/src/models/payment.js +2 -0
- package/dist/src/routes/analytics.js +1447 -0
- package/dist/src/routes/app-routes.js +32 -0
- package/dist/src/routes/auth-routes.js +505 -0
- package/dist/src/routes/oauth-routes.js +325 -0
- package/dist/src/routes/payment-routes.js +186 -0
- package/dist/src/routes/persona-catalog-routes.js +84 -0
- package/dist/src/services/admin-service.js +229 -0
- package/dist/src/services/audit-log-persistence.js +60 -0
- package/dist/src/services/audit-log.js +69 -0
- package/dist/src/services/cookie-service.js +129 -0
- package/dist/src/services/dashboard-access.js +27 -0
- package/dist/src/services/demo-seed-service.js +139 -0
- package/dist/src/services/email-code.js +23 -0
- package/dist/src/services/email-service-clean.js +782 -0
- package/dist/src/services/email-service.js +951 -0
- package/dist/src/services/installer-service.js +131 -0
- package/dist/src/services/mcp-oauth-store.js +33 -0
- package/dist/src/services/mcp-service.js +823 -0
- package/dist/src/services/oauth-helpers.js +127 -0
- package/dist/src/services/org-service.js +89 -0
- package/dist/src/services/persona-entitlement-service.js +288 -0
- package/dist/src/services/provider-service.js +215 -0
- package/dist/src/services/registry-service.js +628 -0
- package/dist/src/services/session-service.js +86 -0
- package/dist/src/services/trial-reminder-service.js +120 -0
- package/dist/src/services/usage-analytics-service.js +419 -0
- package/dist/src/services/workspace-identity.js +21 -0
- package/dist/src/types/analytics.js +2 -0
- package/dist/src/utils/payment-calculator.js +52 -0
- package/extensions/office-word/favicon.ico +0 -0
- package/extensions/office-word/icon-64.png +0 -0
- package/extensions/office-word/manifest.xml +33 -0
- package/extensions/office-word/taskpane.html +242 -0
- package/package.json +12 -2
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createSalesLead = createSalesLead;
|
|
4
|
+
async function createSalesLead(req, res, dbService) {
|
|
5
|
+
try {
|
|
6
|
+
const { name, email, company, teamSize, useCase, projectDetails, timeline, budget } = req.body;
|
|
7
|
+
// Validation
|
|
8
|
+
if (!email || !email.includes('@')) {
|
|
9
|
+
return res.status(400).json({ error: 'Valid email is required' });
|
|
10
|
+
}
|
|
11
|
+
if (!company || company.trim().length === 0) {
|
|
12
|
+
return res.status(400).json({ error: 'Company is required' });
|
|
13
|
+
}
|
|
14
|
+
const validTeamSizes = ['1-10', '11-50', '51-200', '201-500', '500+'];
|
|
15
|
+
if (!teamSize || !validTeamSizes.includes(teamSize)) {
|
|
16
|
+
return res.status(400).json({
|
|
17
|
+
error: 'Invalid teamSize. Must be one of: 1-10, 11-50, 51-200, 201-500, 500+'
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
// Create sales inquiry using existing collection
|
|
21
|
+
await dbService.createSalesInquiry({
|
|
22
|
+
email: email.trim().toLowerCase(),
|
|
23
|
+
company: company.trim(),
|
|
24
|
+
projectDetails: projectDetails?.trim() || useCase?.trim() || '',
|
|
25
|
+
teamSize,
|
|
26
|
+
timeline: timeline?.trim(),
|
|
27
|
+
budget: budget?.trim(),
|
|
28
|
+
source: 'fraim-website-payment',
|
|
29
|
+
timestamp: new Date(),
|
|
30
|
+
ipAddress: req.ip,
|
|
31
|
+
userAgent: req.get('user-agent'),
|
|
32
|
+
});
|
|
33
|
+
console.log(`✅ Sales inquiry created: ${email}`);
|
|
34
|
+
// TODO: Send notification emails
|
|
35
|
+
res.json({
|
|
36
|
+
success: true,
|
|
37
|
+
message: 'Thank you for your interest! Our sales team will contact you within 24 hours.',
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.error('❌ Error creating sales inquiry:', error);
|
|
42
|
+
res.status(500).json({ error: 'Failed to create sales inquiry', details: error.message });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -345,7 +345,7 @@ const runAddIDE = async (options) => {
|
|
|
345
345
|
// Check if any provider tokens exist
|
|
346
346
|
const allProviderIds = await (0, provider_registry_1.getAllProviderIds)();
|
|
347
347
|
const hasAnyToken = allProviderIds.some(id => platformTokens[id]);
|
|
348
|
-
if (!hasAnyToken && !isConversationalMode) {
|
|
348
|
+
if (!hasAnyToken && !isConversationalMode && !options.skipTokenPrompts) {
|
|
349
349
|
console.log(chalk_1.default.yellow('⚠️ No provider tokens found in configuration.'));
|
|
350
350
|
// Prompt for first integrated provider as default
|
|
351
351
|
const integratedProviders = await (0, provider_registry_1.getProvidersWithCapability)('integrated');
|
|
@@ -434,7 +434,14 @@ const runAddIDE = async (options) => {
|
|
|
434
434
|
});
|
|
435
435
|
}
|
|
436
436
|
if (results.successful.length > 0) {
|
|
437
|
-
const { describeConfiguredInvocationSurfaces } = await Promise.resolve().then(() => __importStar(require('../setup/ide-global-integration')));
|
|
437
|
+
const { installSlashCommands, installGlobalRules, describeConfiguredInvocationSurfaces } = await Promise.resolve().then(() => __importStar(require('../setup/ide-global-integration')));
|
|
438
|
+
try {
|
|
439
|
+
await installSlashCommands();
|
|
440
|
+
await installGlobalRules();
|
|
441
|
+
}
|
|
442
|
+
catch (e) {
|
|
443
|
+
console.log(chalk_1.default.yellow(`⚠️ IDE surface installation encountered issues: ${e.message}`));
|
|
444
|
+
}
|
|
438
445
|
const successfulIDEs = idesToConfigure.filter(ide => results.successful.includes(ide.name));
|
|
439
446
|
const invocationSummaries = describeConfiguredInvocationSurfaces(successfulIDEs);
|
|
440
447
|
console.log(chalk_1.default.blue('\n🔄 Next steps:'));
|
|
@@ -43,7 +43,7 @@ const chalk_1 = __importDefault(require("chalk"));
|
|
|
43
43
|
const prompts_1 = __importDefault(require("prompts"));
|
|
44
44
|
const fs_1 = __importDefault(require("fs"));
|
|
45
45
|
const path_1 = __importDefault(require("path"));
|
|
46
|
-
const
|
|
46
|
+
const add_ide_1 = require("./add-ide");
|
|
47
47
|
const provider_registry_1 = require("../providers/provider-registry");
|
|
48
48
|
const script_sync_utils_1 = require("../utils/script-sync-utils");
|
|
49
49
|
function parseModeOption(mode) {
|
|
@@ -252,7 +252,7 @@ const runSetup = async (options) => {
|
|
|
252
252
|
console.log(chalk_1.default.blue('\n💾 Saving global configuration...'));
|
|
253
253
|
(0, exports.saveGlobalConfig)(fraimKey, mode);
|
|
254
254
|
console.log(chalk_1.default.blue('\n🔌 Configuring MCP servers...'));
|
|
255
|
-
await (0,
|
|
255
|
+
await (0, add_ide_1.runAddIDE)({ ide: options.ide, all: !options.ide, skipTokenPrompts: true });
|
|
256
256
|
console.log(chalk_1.default.green('\n🎯 Reconfiguration complete!'));
|
|
257
257
|
console.log(chalk_1.default.cyan('\n💡 To connect platforms, run: fraim add-provider <github|gitlab|ado|jira>'));
|
|
258
258
|
return;
|
|
@@ -280,39 +280,19 @@ const runSetup = async (options) => {
|
|
|
280
280
|
// Save global configuration (key + mode only; provider tokens live in IDE MCP configs)
|
|
281
281
|
console.log(chalk_1.default.blue('💾 Saving global configuration...'));
|
|
282
282
|
(0, exports.saveGlobalConfig)(fraimKey, mode);
|
|
283
|
-
// Configure MCP servers
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
}
|
|
290
|
-
try {
|
|
291
|
-
await (0, auto_mcp_setup_1.autoConfigureMCP)(fraimKey, options.ide ? [options.ide] : undefined);
|
|
292
|
-
}
|
|
293
|
-
catch (e) {
|
|
294
|
-
console.log(chalk_1.default.yellow('⚠️ MCP configuration encountered issues'));
|
|
295
|
-
console.log(chalk_1.default.gray(' You can configure MCP manually or run setup again later\n'));
|
|
296
|
-
}
|
|
283
|
+
// Configure MCP servers and install IDE surfaces (slash commands, rules)
|
|
284
|
+
// Delegates entirely to add-ide so there is one implementation of this logic.
|
|
285
|
+
console.log(chalk_1.default.blue(isUpdate ? '\n🔄 Updating IDE MCP configurations...' : '\n🔌 Configuring MCP servers...'));
|
|
286
|
+
if (!isUpdate && mode === 'conversational') {
|
|
287
|
+
console.log(chalk_1.default.yellow('ℹ️ Conversational mode: Configuring FRAIM MCP server'));
|
|
288
|
+
console.log(chalk_1.default.gray(' FRAIM jobs will work; platform-specific features are added via fraim add-provider\n'));
|
|
297
289
|
}
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
console.log(chalk_1.default.gray(' No IDE configurations found to update'));
|
|
305
|
-
}
|
|
306
|
-
else {
|
|
307
|
-
const ideNames = installedIDEs.map(ide => ide.name);
|
|
308
|
-
await (0, auto_mcp_setup_1.autoConfigureMCP)(fraimKey, ideNames);
|
|
309
|
-
console.log(chalk_1.default.green(`✅ Updated MCP configs for: ${ideNames.join(', ')}`));
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
catch (e) {
|
|
313
|
-
console.log(chalk_1.default.yellow('⚠️ Failed to update IDE MCP configurations'));
|
|
314
|
-
console.log(chalk_1.default.gray(' You can update them manually with: fraim add-ide <ide-name>\n'));
|
|
315
|
-
}
|
|
290
|
+
try {
|
|
291
|
+
await (0, add_ide_1.runAddIDE)({ ide: options.ide, all: isUpdate || !options.ide, skipTokenPrompts: true });
|
|
292
|
+
}
|
|
293
|
+
catch (e) {
|
|
294
|
+
console.log(chalk_1.default.yellow('⚠️ MCP configuration encountered issues'));
|
|
295
|
+
console.log(chalk_1.default.gray(' You can configure MCP manually or run setup again later\n'));
|
|
316
296
|
}
|
|
317
297
|
// Sync user-level FRAIM artifacts (always, on both initial and update)
|
|
318
298
|
try {
|
|
@@ -324,16 +304,6 @@ const runSetup = async (options) => {
|
|
|
324
304
|
console.log(chalk_1.default.yellow(`⚠️ User-level content sync encountered issues: ${e.message}`));
|
|
325
305
|
console.log(chalk_1.default.gray(' You can sync later with: fraim sync --global'));
|
|
326
306
|
}
|
|
327
|
-
// Install IDE slash commands and global rules
|
|
328
|
-
try {
|
|
329
|
-
const { installSlashCommands, installGlobalRules } = await Promise.resolve().then(() => __importStar(require('../setup/ide-global-integration')));
|
|
330
|
-
console.log(chalk_1.default.blue('\n🔗 Installing IDE integrations...'));
|
|
331
|
-
await installSlashCommands();
|
|
332
|
-
await installGlobalRules();
|
|
333
|
-
}
|
|
334
|
-
catch (e) {
|
|
335
|
-
console.log(chalk_1.default.yellow(`⚠️ IDE integration encountered issues: ${e.message}`));
|
|
336
|
-
}
|
|
337
307
|
// Show mode-aware summary with clear value prop and next steps
|
|
338
308
|
console.log(chalk_1.default.green('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
|
|
339
309
|
console.log(chalk_1.default.green(' FRAIM is ready!'));
|
|
@@ -22,7 +22,7 @@ const REQUIRED_TARGET_IDS = [
|
|
|
22
22
|
'vscode-copilot-agent-plugin',
|
|
23
23
|
'gemini-cli-extension'
|
|
24
24
|
];
|
|
25
|
-
const ACCEPTED_LOCAL_STATUSES = new Set(['package-prepared', 'submission-ready', 'submitted']);
|
|
25
|
+
const ACCEPTED_LOCAL_STATUSES = new Set(['package-prepared', 'submission-ready', 'submitted', 'accepted']);
|
|
26
26
|
const TEXT_EXTENSIONS = new Set(['.json', '.md', '.txt', '.toml', '.yaml', '.yml']);
|
|
27
27
|
const SECRET_PATTERNS = [
|
|
28
28
|
{ label: 'OpenAI-style API key', pattern: /sk-[A-Za-z0-9_-]{20,}/ },
|
|
@@ -432,6 +432,10 @@ function validateMcpRegistryPackage(repoRoot, result, targetDetails) {
|
|
|
432
432
|
requireHttpsUrl(serverJson.$schema, serverRelPath, '$schema', result);
|
|
433
433
|
assertEqual(serverJson.name, 'io.github.mathursrus/fraim', serverRelPath, 'name', result);
|
|
434
434
|
assertEqual(serverJson.title, 'FRAIM', serverRelPath, 'title', result);
|
|
435
|
+
const description = stringValue(serverJson.description);
|
|
436
|
+
if (!description || description.length > 100) {
|
|
437
|
+
addIssue(result.errors, serverRelPath, 'description must be a non-empty string of at most 100 characters');
|
|
438
|
+
}
|
|
435
439
|
assertEqual(serverJson.version, targetDetails.productVersion, serverRelPath, 'version', result);
|
|
436
440
|
requireHttpsUrl(serverJson.websiteUrl, serverRelPath, 'websiteUrl', result);
|
|
437
441
|
const repository = asObject(serverJson.repository);
|
|
@@ -161,14 +161,19 @@ exports.IDE_CONFIGS = [
|
|
|
161
161
|
},
|
|
162
162
|
{
|
|
163
163
|
name: 'Claude Desktop / Cowork',
|
|
164
|
-
configPath:
|
|
164
|
+
configPath: process.platform === 'win32'
|
|
165
|
+
? '~/AppData/Roaming/Claude/claude_desktop_config.json'
|
|
166
|
+
: process.platform === 'darwin'
|
|
167
|
+
? '~/Library/Application Support/Claude/claude_desktop_config.json'
|
|
168
|
+
: '~/.config/Claude/claude_desktop_config.json',
|
|
165
169
|
configFormat: 'json',
|
|
166
170
|
configType: 'claude',
|
|
167
171
|
invocationProfile: 'launch-phrase',
|
|
168
172
|
detectMethod: guiAppDetect(detectClaude, 'Claude'),
|
|
169
173
|
aliases: ['claude', 'claude-desktop', 'claude desktop', 'claude-cowork', 'cowork', 'claude cowork'],
|
|
170
174
|
alternativePaths: [
|
|
171
|
-
'~/
|
|
175
|
+
'~/AppData/Roaming/Claude/claude_desktop_config.json',
|
|
176
|
+
'~/Library/Application Support/Claude/claude_desktop_config.json',
|
|
172
177
|
],
|
|
173
178
|
description: 'Anthropic Claude Desktop chat and Cowork surfaces',
|
|
174
179
|
downloadUrl: 'https://claude.ai/download',
|
|
@@ -46,17 +46,18 @@ function normalizeAutomation(config) {
|
|
|
46
46
|
const support = config?.automation?.support;
|
|
47
47
|
if (!support || typeof support !== 'object')
|
|
48
48
|
return undefined;
|
|
49
|
+
const playbooks = support.playbooks && typeof support.playbooks === 'object'
|
|
50
|
+
? support.playbooks
|
|
51
|
+
: {};
|
|
49
52
|
return {
|
|
50
53
|
support: {
|
|
51
54
|
startMode: support.startMode,
|
|
52
55
|
defaultDecisionMode: support.defaultDecisionMode,
|
|
53
|
-
playbooks:
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
: undefined,
|
|
56
|
+
playbooks: {
|
|
57
|
+
directory: playbooks.directory || types_1.DEFAULT_SUPPORT_PLAYBOOKS_DIRECTORY,
|
|
58
|
+
decisionCommand: playbooks.decisionCommand,
|
|
59
|
+
decisionTimeoutMs: playbooks.decisionTimeoutMs
|
|
60
|
+
},
|
|
60
61
|
actionAdapters: support.actionAdapters && typeof support.actionAdapters === 'object'
|
|
61
62
|
? support.actionAdapters
|
|
62
63
|
: undefined,
|
|
@@ -71,7 +72,8 @@ function normalizeAutomation(config) {
|
|
|
71
72
|
pollIntervalSeconds: support.queue.pollIntervalSeconds,
|
|
72
73
|
successState: support.queue.successState,
|
|
73
74
|
failureState: support.queue.failureState,
|
|
74
|
-
closeState: support.queue.closeState
|
|
75
|
+
closeState: support.queue.closeState,
|
|
76
|
+
accessScript: support.queue.accessScript
|
|
75
77
|
}
|
|
76
78
|
: undefined,
|
|
77
79
|
requestTypes: support.requestTypes && typeof support.requestTypes === 'object'
|
package/dist/src/core/types.js
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* TypeScript types for the workspace FRAIM config file.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.DEFAULT_FRAIM_CONFIG = void 0;
|
|
7
|
+
exports.DEFAULT_FRAIM_CONFIG = exports.DEFAULT_SUPPORT_PLAYBOOKS_DIRECTORY = void 0;
|
|
8
|
+
exports.DEFAULT_SUPPORT_PLAYBOOKS_DIRECTORY = 'playbooks/support';
|
|
8
9
|
/**
|
|
9
10
|
* Default configuration values
|
|
10
11
|
*/
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PaymentRepository = void 0;
|
|
4
|
+
const COLLECTION_NAME = 'fraim_payments';
|
|
5
|
+
class PaymentRepository {
|
|
6
|
+
constructor(client, dbName = 'fraim') {
|
|
7
|
+
this.db = client.db(dbName);
|
|
8
|
+
this.collection = this.db.collection(COLLECTION_NAME);
|
|
9
|
+
}
|
|
10
|
+
async ensureIndexes() {
|
|
11
|
+
await this.collection.createIndex({ email: 1 });
|
|
12
|
+
await this.collection.createIndex({ timestamp: -1 });
|
|
13
|
+
await this.collection.createIndex({ status: 1 });
|
|
14
|
+
await this.collection.createIndex({ stripeCustomerId: 1 });
|
|
15
|
+
}
|
|
16
|
+
async createPayment(payment) {
|
|
17
|
+
const result = await this.collection.insertOne(payment);
|
|
18
|
+
return { ...payment, _id: result.insertedId.toString() };
|
|
19
|
+
}
|
|
20
|
+
async updatePaymentStatus(stripePaymentIntentId, status, metadata) {
|
|
21
|
+
const result = await this.collection.updateOne({ stripePaymentIntentId }, {
|
|
22
|
+
$set: {
|
|
23
|
+
status,
|
|
24
|
+
...(metadata && { metadata })
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
return result.modifiedCount > 0;
|
|
28
|
+
}
|
|
29
|
+
async getPaymentById(id) {
|
|
30
|
+
return await this.collection.findOne({ _id: id });
|
|
31
|
+
}
|
|
32
|
+
async getPaymentByStripePaymentIntent(stripePaymentIntentId) {
|
|
33
|
+
return await this.collection.findOne({ stripePaymentIntentId });
|
|
34
|
+
}
|
|
35
|
+
async getPaymentsByEmail(email) {
|
|
36
|
+
return await this.collection.find({ email }).sort({ timestamp: -1 }).toArray();
|
|
37
|
+
}
|
|
38
|
+
async listPayments(filters) {
|
|
39
|
+
const query = {};
|
|
40
|
+
if (filters.plan)
|
|
41
|
+
query.plan = filters.plan;
|
|
42
|
+
if (filters.status)
|
|
43
|
+
query.status = filters.status;
|
|
44
|
+
if (filters.startDate || filters.endDate) {
|
|
45
|
+
query.timestamp = {};
|
|
46
|
+
if (filters.startDate)
|
|
47
|
+
query.timestamp.$gte = filters.startDate;
|
|
48
|
+
if (filters.endDate)
|
|
49
|
+
query.timestamp.$lte = filters.endDate;
|
|
50
|
+
}
|
|
51
|
+
const total = await this.collection.countDocuments(query);
|
|
52
|
+
const payments = await this.collection
|
|
53
|
+
.find(query)
|
|
54
|
+
.sort({ timestamp: -1 })
|
|
55
|
+
.skip(filters.offset || 0)
|
|
56
|
+
.limit(filters.limit || 50)
|
|
57
|
+
.toArray();
|
|
58
|
+
return { payments, total };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.PaymentRepository = PaymentRepository;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getRepositoryInfo = exports.getConfigValue = exports.loadFraimConfig = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Backward-compatible re-export.
|
|
6
|
+
* Canonical config loader lives in src/core/config-loader.ts.
|
|
7
|
+
*/
|
|
8
|
+
var config_loader_1 = require("../core/config-loader");
|
|
9
|
+
Object.defineProperty(exports, "loadFraimConfig", { enumerable: true, get: function () { return config_loader_1.loadFraimConfig; } });
|
|
10
|
+
Object.defineProperty(exports, "getConfigValue", { enumerable: true, get: function () { return config_loader_1.getConfigValue; } });
|
|
11
|
+
Object.defineProperty(exports, "getRepositoryInfo", { enumerable: true, get: function () { return config_loader_1.getRepositoryInfo; } });
|