@benchcubed/today-cli 1.0.0
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 +296 -0
- package/dist/ai/bedrock-client.d.ts +1 -0
- package/dist/ai/bedrock-client.d.ts.map +1 -0
- package/dist/ai/bedrock-client.js +2 -0
- package/dist/ai/bedrock-client.js.map +1 -0
- package/dist/ai/knowledge-processor.d.ts +1 -0
- package/dist/ai/knowledge-processor.d.ts.map +1 -0
- package/dist/ai/knowledge-processor.js +2 -0
- package/dist/ai/knowledge-processor.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +70 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/ask.d.ts +3 -0
- package/dist/commands/ask.d.ts.map +1 -0
- package/dist/commands/ask.js +217 -0
- package/dist/commands/ask.js.map +1 -0
- package/dist/commands/audit.d.ts +3 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +153 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +114 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +72 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/embeddings.d.ts +3 -0
- package/dist/commands/embeddings.d.ts.map +1 -0
- package/dist/commands/embeddings.js +118 -0
- package/dist/commands/embeddings.js.map +1 -0
- package/dist/commands/experts.d.ts +3 -0
- package/dist/commands/experts.d.ts.map +1 -0
- package/dist/commands/experts.js +129 -0
- package/dist/commands/experts.js.map +1 -0
- package/dist/commands/export-import.d.ts +4 -0
- package/dist/commands/export-import.d.ts.map +1 -0
- package/dist/commands/export-import.js +285 -0
- package/dist/commands/export-import.js.map +1 -0
- package/dist/commands/git.d.ts +4 -0
- package/dist/commands/git.d.ts.map +1 -0
- package/dist/commands/git.js +274 -0
- package/dist/commands/git.js.map +1 -0
- package/dist/commands/impact.d.ts +3 -0
- package/dist/commands/impact.d.ts.map +1 -0
- package/dist/commands/impact.js +121 -0
- package/dist/commands/impact.js.map +1 -0
- package/dist/commands/insights.d.ts +3 -0
- package/dist/commands/insights.d.ts.map +1 -0
- package/dist/commands/insights.js +113 -0
- package/dist/commands/insights.js.map +1 -0
- package/dist/commands/learned.d.ts +3 -0
- package/dist/commands/learned.d.ts.map +1 -0
- package/dist/commands/learned.js +355 -0
- package/dist/commands/learned.js.map +1 -0
- package/dist/commands/onboard.d.ts +3 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +141 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/recent.d.ts +3 -0
- package/dist/commands/recent.d.ts.map +1 -0
- package/dist/commands/recent.js +83 -0
- package/dist/commands/recent.js.map +1 -0
- package/dist/commands/secrets.d.ts +3 -0
- package/dist/commands/secrets.d.ts.map +1 -0
- package/dist/commands/secrets.js +203 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/stats.d.ts +3 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +120 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/config/index.d.ts +12 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +46 -0
- package/dist/config/index.js.map +1 -0
- package/dist/database/migrations.d.ts +13 -0
- package/dist/database/migrations.d.ts.map +1 -0
- package/dist/database/migrations.js +190 -0
- package/dist/database/migrations.js.map +1 -0
- package/dist/database/postgresql.d.ts +92 -0
- package/dist/database/postgresql.d.ts.map +1 -0
- package/dist/database/postgresql.js +382 -0
- package/dist/database/postgresql.js.map +1 -0
- package/dist/database/sqlite.d.ts +54 -0
- package/dist/database/sqlite.d.ts.map +1 -0
- package/dist/database/sqlite.js +337 -0
- package/dist/database/sqlite.js.map +1 -0
- package/dist/lambda/admin.d.ts +3 -0
- package/dist/lambda/admin.d.ts.map +1 -0
- package/dist/lambda/admin.js +818 -0
- package/dist/lambda/admin.js.map +1 -0
- package/dist/lambda/ai-services.d.ts +6 -0
- package/dist/lambda/ai-services.d.ts.map +1 -0
- package/dist/lambda/ai-services.js +472 -0
- package/dist/lambda/ai-services.js.map +1 -0
- package/dist/lambda/analytics.d.ts +3 -0
- package/dist/lambda/analytics.d.ts.map +1 -0
- package/dist/lambda/analytics.js +481 -0
- package/dist/lambda/analytics.js.map +1 -0
- package/dist/lambda/api-router.d.ts +3 -0
- package/dist/lambda/api-router.d.ts.map +1 -0
- package/dist/lambda/api-router.js +162 -0
- package/dist/lambda/api-router.js.map +1 -0
- package/dist/lambda/custom-topics.d.ts +3 -0
- package/dist/lambda/custom-topics.d.ts.map +1 -0
- package/dist/lambda/custom-topics.js +425 -0
- package/dist/lambda/custom-topics.js.map +1 -0
- package/dist/lambda/graph-builder.d.ts +3 -0
- package/dist/lambda/graph-builder.d.ts.map +1 -0
- package/dist/lambda/graph-builder.js +442 -0
- package/dist/lambda/graph-builder.js.map +1 -0
- package/dist/lambda/knowledge-ai.d.ts +3 -0
- package/dist/lambda/knowledge-ai.d.ts.map +1 -0
- package/dist/lambda/knowledge-ai.js +849 -0
- package/dist/lambda/knowledge-ai.js.map +1 -0
- package/dist/lambda/post-confirmation.d.ts +8 -0
- package/dist/lambda/post-confirmation.d.ts.map +1 -0
- package/dist/lambda/post-confirmation.js +92 -0
- package/dist/lambda/post-confirmation.js.map +1 -0
- package/dist/lambda/teams.d.ts +3 -0
- package/dist/lambda/teams.d.ts.map +1 -0
- package/dist/lambda/teams.js +568 -0
- package/dist/lambda/teams.js.map +1 -0
- package/dist/lib/export-helpers.d.ts +5 -0
- package/dist/lib/export-helpers.d.ts.map +1 -0
- package/dist/lib/export-helpers.js +137 -0
- package/dist/lib/export-helpers.js.map +1 -0
- package/dist/lib/import-helpers.d.ts +5 -0
- package/dist/lib/import-helpers.d.ts.map +1 -0
- package/dist/lib/import-helpers.js +185 -0
- package/dist/lib/import-helpers.js.map +1 -0
- package/dist/lib/insights-helpers.d.ts +123 -0
- package/dist/lib/insights-helpers.d.ts.map +1 -0
- package/dist/lib/insights-helpers.js +374 -0
- package/dist/lib/insights-helpers.js.map +1 -0
- package/dist/lib/search-helpers.d.ts +4 -0
- package/dist/lib/search-helpers.d.ts.map +1 -0
- package/dist/lib/search-helpers.js +124 -0
- package/dist/lib/search-helpers.js.map +1 -0
- package/dist/lib/secret-helpers.d.ts +2 -0
- package/dist/lib/secret-helpers.d.ts.map +1 -0
- package/dist/lib/secret-helpers.js +85 -0
- package/dist/lib/secret-helpers.js.map +1 -0
- package/dist/lib/stats-helpers.d.ts +41 -0
- package/dist/lib/stats-helpers.d.ts.map +1 -0
- package/dist/lib/stats-helpers.js +263 -0
- package/dist/lib/stats-helpers.js.map +1 -0
- package/dist/services/aws-api.d.ts +81 -0
- package/dist/services/aws-api.d.ts.map +1 -0
- package/dist/services/aws-api.js +388 -0
- package/dist/services/aws-api.js.map +1 -0
- package/dist/services/bedrock.d.ts +83 -0
- package/dist/services/bedrock.d.ts.map +1 -0
- package/dist/services/bedrock.js +434 -0
- package/dist/services/bedrock.js.map +1 -0
- package/dist/services/commit-learnings.d.ts +25 -0
- package/dist/services/commit-learnings.d.ts.map +1 -0
- package/dist/services/commit-learnings.js +180 -0
- package/dist/services/commit-learnings.js.map +1 -0
- package/dist/services/embedding-storage.d.ts +42 -0
- package/dist/services/embedding-storage.d.ts.map +1 -0
- package/dist/services/embedding-storage.js +124 -0
- package/dist/services/embedding-storage.js.map +1 -0
- package/dist/services/expert-engine.d.ts +21 -0
- package/dist/services/expert-engine.d.ts.map +1 -0
- package/dist/services/expert-engine.js +58 -0
- package/dist/services/expert-engine.js.map +1 -0
- package/dist/services/onboarding-accelerator.d.ts +118 -0
- package/dist/services/onboarding-accelerator.d.ts.map +1 -0
- package/dist/services/onboarding-accelerator.js +403 -0
- package/dist/services/onboarding-accelerator.js.map +1 -0
- package/dist/services/secret-detection.d.ts +46 -0
- package/dist/services/secret-detection.d.ts.map +1 -0
- package/dist/services/secret-detection.js +75 -0
- package/dist/services/secret-detection.js.map +1 -0
- package/dist/services/secret-manager-simple.d.ts +51 -0
- package/dist/services/secret-manager-simple.d.ts.map +1 -0
- package/dist/services/secret-manager-simple.js +119 -0
- package/dist/services/secret-manager-simple.js.map +1 -0
- package/dist/services/secret-manager.d.ts +150 -0
- package/dist/services/secret-manager.d.ts.map +1 -0
- package/dist/services/secret-manager.js +287 -0
- package/dist/services/secret-manager.js.map +1 -0
- package/dist/services/vector-embeddings.d.ts +70 -0
- package/dist/services/vector-embeddings.d.ts.map +1 -0
- package/dist/services/vector-embeddings.js +167 -0
- package/dist/services/vector-embeddings.js.map +1 -0
- package/dist/services/vector-search.d.ts +28 -0
- package/dist/services/vector-search.d.ts.map +1 -0
- package/dist/services/vector-search.js +192 -0
- package/dist/services/vector-search.js.map +1 -0
- package/dist/types/index.d.ts +86 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/formatting.d.ts +10 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +82 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/git.d.ts +52 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +182 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/validation.d.ts +17 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +187 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recent.js","sourceRoot":"","sources":["../../src/commands/recent.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,kDA+CC;AApDD,yCAAoC;AACpC,kDAA0B;AAC1B,8CAAsB;AACtB,oDAA8E;AAE9E,SAAgB,mBAAmB;IACjC,MAAM,GAAG,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC,CAAC;IAElC,GAAG;SACA,WAAW,CAAC,yCAAyC,CAAC;SACtD,MAAM,CAAC,sBAAsB,EAAE,2BAA2B,EAAE,GAAG,CAAC;SAChE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,kCAAkC,CAAC,CAAC,KAAK,EAAE,CAAC;QAEhE,IAAI,CAAC;YACH,6BAA6B;YAC7B,MAAM,EAAE,aAAa,EAAE,GAAG,wDAAa,qBAAqB,GAAC,CAAC;YAC9D,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,EAAE,CAAC;gBACrC,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC,CAAC;gBAC/E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC,CAAC;gBAC3F,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAE/D,OAAO,CAAC,OAAO,CAAC,WAAW,OAAO,CAAC,MAAM,4BAA4B,CAAC,CAAC;YAEvE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,mFAAmF,CAAC,CAAC,CAAC;gBAC/G,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC;gBACjE,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,IAAA,gCAAmB,EAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC,CAAC;QAErE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YACrD,OAAO,CAAC,KAAK,CAAC,IAAA,+BAAkB,EAAC,KAAc,CAAC,CAAC,CAAC;YAElD,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACvE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC,CAAC;gBACnE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC,CAAC;YACxF,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/commands/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,oBAAoB,IAAI,OAAO,CAyL9C"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.createSecretsCommand = createSecretsCommand;
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const ora_1 = __importDefault(require("ora"));
|
|
43
|
+
const config_1 = require("../config");
|
|
44
|
+
const formatting_1 = require("../utils/formatting");
|
|
45
|
+
function createSecretsCommand() {
|
|
46
|
+
const cmd = new commander_1.Command('secrets');
|
|
47
|
+
cmd.description('Enterprise secret management and discovery');
|
|
48
|
+
// List subcommand
|
|
49
|
+
const listCmd = new commander_1.Command('list')
|
|
50
|
+
.description('List discovered secrets for your team')
|
|
51
|
+
.option('--status <status>', 'Filter by status (discovered, approved, managed)')
|
|
52
|
+
.option('--risk <level>', 'Filter by risk level (low, medium, high, critical)')
|
|
53
|
+
.action(async (options) => {
|
|
54
|
+
const spinner = (0, ora_1.default)();
|
|
55
|
+
try {
|
|
56
|
+
spinner.start('Loading team secret discoveries...');
|
|
57
|
+
const { enterpriseSecretManagerService } = await Promise.resolve().then(() => __importStar(require('../services/secret-manager')));
|
|
58
|
+
const config = config_1.configManager.getConfig();
|
|
59
|
+
const teamId = config.teamId || 'demo_team';
|
|
60
|
+
// Check if service is available
|
|
61
|
+
const available = await enterpriseSecretManagerService.isAvailable();
|
|
62
|
+
if (!available) {
|
|
63
|
+
spinner.fail('Enterprise Secret Manager not available');
|
|
64
|
+
console.log(chalk_1.default.yellow('💡 This feature requires AWS Secrets Manager access in your account'));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// For demo, show mock discoveries
|
|
68
|
+
const mockDiscoveries = [
|
|
69
|
+
{
|
|
70
|
+
id: 'disc_1',
|
|
71
|
+
secretName: `${teamId}/production/api-key-123456`,
|
|
72
|
+
secretType: 'api_key',
|
|
73
|
+
environment: 'production',
|
|
74
|
+
status: 'discovered',
|
|
75
|
+
riskLevel: 'critical',
|
|
76
|
+
valuePreview: 'tui_***...s0t',
|
|
77
|
+
discoveredBy: 'alice-dev',
|
|
78
|
+
discoveredAt: new Date('2025-01-15'),
|
|
79
|
+
description: 'TUI production API key detected in knowledge entry'
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
id: 'disc_2',
|
|
83
|
+
secretName: `${teamId}/staging/database-connection-789`,
|
|
84
|
+
secretType: 'connection_string',
|
|
85
|
+
environment: 'staging',
|
|
86
|
+
status: 'approved',
|
|
87
|
+
riskLevel: 'high',
|
|
88
|
+
valuePreview: 'postgres://***...@host',
|
|
89
|
+
discoveredBy: 'bob-dev',
|
|
90
|
+
discoveredAt: new Date('2025-01-14'),
|
|
91
|
+
description: 'Database connection string for staging environment'
|
|
92
|
+
}
|
|
93
|
+
];
|
|
94
|
+
let discoveries = mockDiscoveries;
|
|
95
|
+
// Apply filters
|
|
96
|
+
if (options.status) {
|
|
97
|
+
discoveries = discoveries.filter(d => d.status === options.status);
|
|
98
|
+
}
|
|
99
|
+
if (options.risk) {
|
|
100
|
+
discoveries = discoveries.filter(d => d.riskLevel === options.risk);
|
|
101
|
+
}
|
|
102
|
+
spinner.succeed(`Found ${discoveries.length} secret discoveries`);
|
|
103
|
+
if (discoveries.length === 0) {
|
|
104
|
+
console.log(chalk_1.default.green('🔒 No secret discoveries found matching your criteria'));
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
console.log(chalk_1.default.cyan('\n🔐 Team Secret Discoveries:\n'));
|
|
108
|
+
discoveries.forEach((discovery, index) => {
|
|
109
|
+
const statusIcon = discovery.status === 'discovered' ? '🔍' :
|
|
110
|
+
discovery.status === 'approved' ? '✅' : '🏢';
|
|
111
|
+
const riskColor = discovery.riskLevel === 'critical' ? chalk_1.default.red :
|
|
112
|
+
discovery.riskLevel === 'high' ? chalk_1.default.yellow :
|
|
113
|
+
discovery.riskLevel === 'medium' ? chalk_1.default.blue : chalk_1.default.gray;
|
|
114
|
+
console.log(chalk_1.default.white(`${index + 1}. ${discovery.secretName}`));
|
|
115
|
+
console.log(chalk_1.default.gray(` Type: ${discovery.secretType} | Environment: ${discovery.environment}`));
|
|
116
|
+
console.log(chalk_1.default.gray(` Status: ${statusIcon} ${discovery.status}`));
|
|
117
|
+
console.log(riskColor(` Risk: ${discovery.riskLevel.toUpperCase()}`));
|
|
118
|
+
console.log(chalk_1.default.gray(` Preview: ${discovery.valuePreview}`));
|
|
119
|
+
console.log(chalk_1.default.gray(` Discovered by: ${discovery.discoveredBy} on ${discovery.discoveredAt.toLocaleDateString()}`));
|
|
120
|
+
console.log(chalk_1.default.gray(` Description: ${discovery.description}`));
|
|
121
|
+
console.log('');
|
|
122
|
+
});
|
|
123
|
+
console.log(chalk_1.default.blue('💡 Next Steps:'));
|
|
124
|
+
console.log(chalk_1.default.gray(' • Use `today secrets template <secret-name>` to generate deployment templates'));
|
|
125
|
+
console.log(chalk_1.default.gray(' • Deploy to your own AWS Secrets Manager for secure access'));
|
|
126
|
+
console.log(chalk_1.default.gray(' • All actual secret values remain in YOUR infrastructure'));
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
spinner.fail('Failed to list secret discoveries');
|
|
130
|
+
console.error((0, formatting_1.formatErrorMessage)(error));
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
// Template subcommand
|
|
134
|
+
const templateCmd = new commander_1.Command('template')
|
|
135
|
+
.description('Generate deployment templates for a discovered secret')
|
|
136
|
+
.argument('<secret-name>', 'Name of the secret to generate templates for')
|
|
137
|
+
.option('--format <format>', 'Template format (terraform, cloudformation, aws-cli)', 'terraform')
|
|
138
|
+
.option('--output <dir>', 'Output directory for templates', './secret-templates')
|
|
139
|
+
.action(async (secretName, options) => {
|
|
140
|
+
const spinner = (0, ora_1.default)();
|
|
141
|
+
try {
|
|
142
|
+
spinner.start(`Generating deployment templates for ${secretName}...`);
|
|
143
|
+
const { enterpriseSecretManagerService } = await Promise.resolve().then(() => __importStar(require('../services/secret-manager')));
|
|
144
|
+
// Mock discovery for demo
|
|
145
|
+
const mockDiscovery = {
|
|
146
|
+
id: 'disc_1',
|
|
147
|
+
discoveredBy: 'alice-dev',
|
|
148
|
+
teamId: config_1.configManager.getConfig().teamId || 'demo_team',
|
|
149
|
+
secretType: 'api_key',
|
|
150
|
+
secretName,
|
|
151
|
+
description: 'TUI production API key detected in knowledge entry',
|
|
152
|
+
context: 'Detected in knowledge entry',
|
|
153
|
+
environment: 'production',
|
|
154
|
+
status: 'discovered',
|
|
155
|
+
approvalRequired: true,
|
|
156
|
+
discoveredAt: new Date(),
|
|
157
|
+
tags: ['risk-critical', 'source-bedrock', 'api'],
|
|
158
|
+
riskLevel: 'critical',
|
|
159
|
+
valueHash: 'abc123...',
|
|
160
|
+
valuePreview: 'tui_***...s0t'
|
|
161
|
+
};
|
|
162
|
+
const template = await enterpriseSecretManagerService.generateSecretTemplate(mockDiscovery);
|
|
163
|
+
spinner.succeed('Templates generated successfully!');
|
|
164
|
+
console.log(chalk_1.default.green(`\n🏗️ Deployment Templates for: ${secretName}\n`));
|
|
165
|
+
if (options.format === 'terraform' || options.format === 'all') {
|
|
166
|
+
console.log(chalk_1.default.cyan('📄 Terraform Template:'));
|
|
167
|
+
console.log(chalk_1.default.gray('```hcl'));
|
|
168
|
+
console.log(template.terraformTemplate);
|
|
169
|
+
console.log(chalk_1.default.gray('```\n'));
|
|
170
|
+
}
|
|
171
|
+
if (options.format === 'cloudformation' || options.format === 'all') {
|
|
172
|
+
console.log(chalk_1.default.cyan('📄 CloudFormation Template:'));
|
|
173
|
+
console.log(chalk_1.default.gray('```yaml'));
|
|
174
|
+
console.log(template.cloudFormationTemplate);
|
|
175
|
+
console.log(chalk_1.default.gray('```\n'));
|
|
176
|
+
}
|
|
177
|
+
if (options.format === 'aws-cli' || options.format === 'all') {
|
|
178
|
+
console.log(chalk_1.default.cyan('📄 AWS CLI Commands:'));
|
|
179
|
+
console.log(chalk_1.default.gray('```bash'));
|
|
180
|
+
template.awsCliCommands.forEach(cmd => console.log(cmd));
|
|
181
|
+
console.log(chalk_1.default.gray('```\n'));
|
|
182
|
+
}
|
|
183
|
+
console.log(chalk_1.default.green('🔒 Security Benefits:'));
|
|
184
|
+
console.log(chalk_1.default.gray(' • No actual secret values stored outside your infrastructure'));
|
|
185
|
+
console.log(chalk_1.default.gray(' • Deploy to your own AWS Secrets Manager'));
|
|
186
|
+
console.log(chalk_1.default.gray(' • Compliance with enterprise security policies'));
|
|
187
|
+
console.log(chalk_1.default.gray(' • Full audit trail and access control'));
|
|
188
|
+
console.log(chalk_1.default.blue('\n💡 Deployment Instructions:'));
|
|
189
|
+
console.log(chalk_1.default.gray(' 1. Review the generated template'));
|
|
190
|
+
console.log(chalk_1.default.gray(' 2. Replace "YOUR_ACTUAL_SECRET_VALUE_HERE" with the real value'));
|
|
191
|
+
console.log(chalk_1.default.gray(' 3. Deploy using terraform apply or aws cloudformation deploy'));
|
|
192
|
+
console.log(chalk_1.default.gray(' 4. Configure IAM policies for team access'));
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
spinner.fail('Failed to generate templates');
|
|
196
|
+
console.error((0, formatting_1.formatErrorMessage)(error));
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
cmd.addCommand(listCmd);
|
|
200
|
+
cmd.addCommand(templateCmd);
|
|
201
|
+
return cmd;
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/commands/secrets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,kBAAkB,IAAI,OAAO,CAyF5C"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.createStatsCommand = createStatsCommand;
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const ora_1 = __importDefault(require("ora"));
|
|
43
|
+
const config_1 = require("../config");
|
|
44
|
+
const formatting_1 = require("../utils/formatting");
|
|
45
|
+
const stats_helpers_1 = require("../lib/stats-helpers");
|
|
46
|
+
function createStatsCommand() {
|
|
47
|
+
const cmd = new commander_1.Command('stats');
|
|
48
|
+
cmd
|
|
49
|
+
.description('Show comprehensive productivity statistics and ROI metrics from cloud data')
|
|
50
|
+
.option('--period <period>', 'Time period (today, week, month, all)', 'week')
|
|
51
|
+
.option('--team', 'Show team-wide statistics')
|
|
52
|
+
.action(async (options) => {
|
|
53
|
+
const spinner = (0, ora_1.default)('Analyzing cloud productivity metrics...').start();
|
|
54
|
+
try {
|
|
55
|
+
// Check authentication first
|
|
56
|
+
const { awsApiService } = await Promise.resolve().then(() => __importStar(require('../services/aws-api')));
|
|
57
|
+
if (!awsApiService.isAuthenticated()) {
|
|
58
|
+
spinner.fail('Authentication required');
|
|
59
|
+
console.log(chalk_1.default.red('❌ You must authenticate first to view productivity statistics'));
|
|
60
|
+
console.log(chalk_1.default.gray('💡 Run: today auth --username demo-user --password DemoPass123!'));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
spinner.text = 'Fetching knowledge entries from cloud...';
|
|
64
|
+
// Get entries from cloud backend
|
|
65
|
+
const entries = await awsApiService.getKnowledgeEntries(1000);
|
|
66
|
+
if (entries.length === 0) {
|
|
67
|
+
spinner.succeed('Analysis complete');
|
|
68
|
+
console.log(chalk_1.default.yellow('\n📊 No knowledge entries found in cloud database'));
|
|
69
|
+
console.log(chalk_1.default.gray('💡 Start capturing knowledge with: today learned "Your learning here"'));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const userId = config_1.configManager.getConfig().userId || 'demo_user';
|
|
73
|
+
const teamId = config_1.configManager.getConfig().teamId || 'demo_team';
|
|
74
|
+
// Filter entries based on scope and period
|
|
75
|
+
// For demo purposes, if config doesn't match any entries, use all entries for the authenticated user
|
|
76
|
+
let filteredEntries = options.team
|
|
77
|
+
? entries.filter(entry => entry.teamId === teamId)
|
|
78
|
+
: entries.filter(entry => entry.authorId === userId);
|
|
79
|
+
// If no entries match the config, use all entries (for demo purposes)
|
|
80
|
+
if (filteredEntries.length === 0 && entries.length > 0) {
|
|
81
|
+
filteredEntries = entries;
|
|
82
|
+
}
|
|
83
|
+
// Apply time period filter
|
|
84
|
+
const now = new Date();
|
|
85
|
+
const periodStart = (0, stats_helpers_1.getPeriodStart)(options.period, now);
|
|
86
|
+
filteredEntries = filteredEntries.filter(entry => new Date(entry.createdAt) >= periodStart);
|
|
87
|
+
spinner.text = 'Calculating ROI and productivity gains...';
|
|
88
|
+
// Calculate comprehensive metrics from cloud data
|
|
89
|
+
const stats = (0, stats_helpers_1.calculateProductivityMetrics)(filteredEntries, options.team);
|
|
90
|
+
// Try to get enhanced cloud analytics
|
|
91
|
+
try {
|
|
92
|
+
spinner.text = 'Fetching enhanced cloud analytics...';
|
|
93
|
+
const cloudAnalytics = await awsApiService.getAnalytics(options.period, options.team);
|
|
94
|
+
if (cloudAnalytics) {
|
|
95
|
+
// Merge cloud analytics with calculated stats
|
|
96
|
+
stats.cloudEnhanced = true;
|
|
97
|
+
stats.cloudMetrics = cloudAnalytics;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
// Continue with calculated stats only
|
|
102
|
+
stats.cloudEnhanced = false;
|
|
103
|
+
}
|
|
104
|
+
spinner.succeed(`Cloud productivity analysis complete (${options.period})`);
|
|
105
|
+
// Display comprehensive stats
|
|
106
|
+
(0, stats_helpers_1.displayProductivityStats)(stats, options.period, options.team);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
spinner.fail('Failed to analyze cloud productivity metrics');
|
|
110
|
+
console.error((0, formatting_1.formatErrorMessage)(error));
|
|
111
|
+
if (error instanceof Error && error.message.includes('Authentication')) {
|
|
112
|
+
console.log(chalk_1.default.yellow('\n💡 Make sure you are authenticated:'));
|
|
113
|
+
console.log(chalk_1.default.gray(' today auth --username demo-user --password DemoPass123!'));
|
|
114
|
+
}
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
return cmd;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { TodayConfig } from '../types';
|
|
2
|
+
export declare class ConfigManager {
|
|
3
|
+
private config;
|
|
4
|
+
private explorer;
|
|
5
|
+
constructor();
|
|
6
|
+
private loadConfig;
|
|
7
|
+
getConfig(): TodayConfig;
|
|
8
|
+
updateConfig(updates: Partial<TodayConfig>): void;
|
|
9
|
+
isConfigured(): boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare const configManager: ConfigManager;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAYvC,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,QAAQ,CAA+B;;IAM/C,OAAO,CAAC,UAAU;IAaX,SAAS,IAAI,WAAW;IAIxB,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAOjD,YAAY,IAAI,OAAO;CAG/B;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.configManager = exports.ConfigManager = void 0;
|
|
4
|
+
const cosmiconfig_1 = require("cosmiconfig");
|
|
5
|
+
const moduleName = 'today';
|
|
6
|
+
const defaultConfig = {
|
|
7
|
+
awsRegion: 'eu-west-2', // Updated to match our deployment
|
|
8
|
+
// AWS API configuration from Terraform outputs
|
|
9
|
+
apiEndpoint: 'https://vwnifvxmp2.execute-api.eu-west-2.amazonaws.com/competition/api',
|
|
10
|
+
userPoolId: 'eu-west-2_eJTe4e4oW',
|
|
11
|
+
clientId: '57a94nddco7si2sabtdgloq72r',
|
|
12
|
+
};
|
|
13
|
+
class ConfigManager {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.explorer = (0, cosmiconfig_1.cosmiconfigSync)(moduleName);
|
|
16
|
+
this.config = this.loadConfig();
|
|
17
|
+
}
|
|
18
|
+
loadConfig() {
|
|
19
|
+
try {
|
|
20
|
+
const result = this.explorer.search();
|
|
21
|
+
return {
|
|
22
|
+
...defaultConfig,
|
|
23
|
+
...result?.config,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
console.warn('Failed to load config, using defaults:', error);
|
|
28
|
+
return defaultConfig;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
getConfig() {
|
|
32
|
+
return { ...this.config };
|
|
33
|
+
}
|
|
34
|
+
updateConfig(updates) {
|
|
35
|
+
this.config = {
|
|
36
|
+
...this.config,
|
|
37
|
+
...updates,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
isConfigured() {
|
|
41
|
+
return !!(this.config.apiKey && this.config.teamId && this.config.userId);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.ConfigManager = ConfigManager;
|
|
45
|
+
exports.configManager = new ConfigManager();
|
|
46
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":";;;AAAA,6CAA8C;AAG9C,MAAM,UAAU,GAAG,OAAO,CAAC;AAE3B,MAAM,aAAa,GAAgB;IACjC,SAAS,EAAE,WAAW,EAAE,kCAAkC;IAC1D,+CAA+C;IAC/C,WAAW,EAAE,wEAAwE;IACrF,UAAU,EAAE,qBAAqB;IACjC,QAAQ,EAAE,4BAA4B;CACvC,CAAC;AAEF,MAAa,aAAa;IAIxB;QAFQ,aAAQ,GAAG,IAAA,6BAAe,EAAC,UAAU,CAAC,CAAC;QAG7C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAClC,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO;gBACL,GAAG,aAAa;gBAChB,GAAG,MAAM,EAAE,MAAM;aAClB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;YAC9D,OAAO,aAAa,CAAC;QACvB,CAAC;IACH,CAAC;IAEM,SAAS;QACd,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;IAEM,YAAY,CAAC,OAA6B;QAC/C,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,IAAI,CAAC,MAAM;YACd,GAAG,OAAO;SACX,CAAC;IACJ,CAAC;IAEM,YAAY;QACjB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5E,CAAC;CACF;AAnCD,sCAmCC;AAEY,QAAA,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PostgreSQLService } from './postgresql';
|
|
2
|
+
export declare class DatabaseMigrations {
|
|
3
|
+
private db;
|
|
4
|
+
constructor(db: PostgreSQLService);
|
|
5
|
+
runInitialMigration(): Promise<void>;
|
|
6
|
+
createMigrationTable(): Promise<void>;
|
|
7
|
+
recordMigration(version: string, description: string): Promise<void>;
|
|
8
|
+
checkDatabaseExists(): Promise<boolean>;
|
|
9
|
+
setupCompetitionDemo(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export declare function initializeDatabase(secretArn?: string): Promise<PostgreSQLService>;
|
|
12
|
+
export declare function runLocalMigrations(): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/database/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAIjD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,EAAE,CAAoB;gBAElB,EAAE,EAAE,iBAAiB;IAI3B,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBpC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAarC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpE,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAQvC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;CAiH5C;AAGD,wBAAsB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAevF;AAGD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAaxD"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DatabaseMigrations = void 0;
|
|
4
|
+
exports.initializeDatabase = initializeDatabase;
|
|
5
|
+
exports.runLocalMigrations = runLocalMigrations;
|
|
6
|
+
const postgresql_1 = require("./postgresql");
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
class DatabaseMigrations {
|
|
10
|
+
constructor(db) {
|
|
11
|
+
this.db = db;
|
|
12
|
+
}
|
|
13
|
+
async runInitialMigration() {
|
|
14
|
+
try {
|
|
15
|
+
console.log('Running initial database migration...');
|
|
16
|
+
// Read the schema SQL file
|
|
17
|
+
const schemaPath = (0, path_1.join)(__dirname, 'schema.sql');
|
|
18
|
+
const schemaSql = (0, fs_1.readFileSync)(schemaPath, 'utf-8');
|
|
19
|
+
// Run the migration
|
|
20
|
+
await this.db.runMigration(schemaSql);
|
|
21
|
+
console.log('Initial migration completed successfully');
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
console.error('Initial migration failed:', error);
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async createMigrationTable() {
|
|
29
|
+
const createTableSql = `
|
|
30
|
+
CREATE TABLE IF NOT EXISTS schema_migrations (
|
|
31
|
+
id SERIAL PRIMARY KEY,
|
|
32
|
+
version VARCHAR(255) NOT NULL UNIQUE,
|
|
33
|
+
applied_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
34
|
+
description TEXT
|
|
35
|
+
);
|
|
36
|
+
`;
|
|
37
|
+
await this.db.runMigration(createTableSql);
|
|
38
|
+
}
|
|
39
|
+
async recordMigration(version, description) {
|
|
40
|
+
// This is a simple implementation - in production you'd want proper migration tracking
|
|
41
|
+
console.log(`Recording migration: ${version} - ${description}`);
|
|
42
|
+
}
|
|
43
|
+
async checkDatabaseExists() {
|
|
44
|
+
try {
|
|
45
|
+
return await this.db.healthCheck();
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async setupCompetitionDemo() {
|
|
52
|
+
console.log('Setting up competition demo data...');
|
|
53
|
+
// The demo data is already included in schema.sql
|
|
54
|
+
// This method can be used for additional demo setup if needed
|
|
55
|
+
const additionalDemoSql = `
|
|
56
|
+
-- Additional demo learning entries
|
|
57
|
+
INSERT INTO learning_entries (
|
|
58
|
+
id, team_id, author_id, content, ai_topics, expertise_level,
|
|
59
|
+
impact_score, onboarding_relevance, visibility
|
|
60
|
+
) VALUES
|
|
61
|
+
(
|
|
62
|
+
'550e8400-e29b-41d4-a716-446655440010',
|
|
63
|
+
'550e8400-e29b-41d4-a716-446655440000',
|
|
64
|
+
'550e8400-e29b-41d4-a716-446655440001',
|
|
65
|
+
'Learned how to optimize React components using useMemo and useCallback hooks. This reduced our app bundle size by 15% and improved rendering performance significantly.',
|
|
66
|
+
ARRAY['react', 'performance', 'optimization'],
|
|
67
|
+
'intermediate',
|
|
68
|
+
8,
|
|
69
|
+
true,
|
|
70
|
+
'team'
|
|
71
|
+
),
|
|
72
|
+
(
|
|
73
|
+
'550e8400-e29b-41d4-a716-446655440011',
|
|
74
|
+
'550e8400-e29b-41d4-a716-446655440000',
|
|
75
|
+
'550e8400-e29b-41d4-a716-446655440002',
|
|
76
|
+
'Discovered that PostgreSQL EXPLAIN ANALYZE is crucial for query optimization. Found a missing index that was causing 5-second delays in our user dashboard.',
|
|
77
|
+
ARRAY['postgresql', 'performance', 'database'],
|
|
78
|
+
'intermediate',
|
|
79
|
+
9,
|
|
80
|
+
true,
|
|
81
|
+
'team'
|
|
82
|
+
),
|
|
83
|
+
(
|
|
84
|
+
'550e8400-e29b-41d4-a716-446655440012',
|
|
85
|
+
'550e8400-e29b-41d4-a716-446655440000',
|
|
86
|
+
'550e8400-e29b-41d4-a716-446655440003',
|
|
87
|
+
'CSS Grid is much more powerful than I thought! Replaced 200 lines of flexbox hacks with 20 lines of clean grid code for our responsive layout.',
|
|
88
|
+
ARRAY['css', 'frontend', 'responsive'],
|
|
89
|
+
'beginner',
|
|
90
|
+
6,
|
|
91
|
+
true,
|
|
92
|
+
'team'
|
|
93
|
+
)
|
|
94
|
+
ON CONFLICT (id) DO NOTHING;
|
|
95
|
+
|
|
96
|
+
-- Demo productivity impacts
|
|
97
|
+
INSERT INTO productivity_impacts (
|
|
98
|
+
user_id, team_id, date, times_saved_minutes, duplicate_questions_avoided,
|
|
99
|
+
knowledge_reused, expert_connections_made, estimated_cost_savings,
|
|
100
|
+
activity_type, related_entry_id
|
|
101
|
+
) VALUES
|
|
102
|
+
(
|
|
103
|
+
'550e8400-e29b-41d4-a716-446655440001',
|
|
104
|
+
'550e8400-e29b-41d4-a716-446655440000',
|
|
105
|
+
CURRENT_DATE - INTERVAL '1 day',
|
|
106
|
+
45,
|
|
107
|
+
3,
|
|
108
|
+
2,
|
|
109
|
+
1,
|
|
110
|
+
56.25,
|
|
111
|
+
'knowledge_capture',
|
|
112
|
+
'550e8400-e29b-41d4-a716-446655440010'
|
|
113
|
+
),
|
|
114
|
+
(
|
|
115
|
+
'550e8400-e29b-41d4-a716-446655440002',
|
|
116
|
+
'550e8400-e29b-41d4-a716-446655440000',
|
|
117
|
+
CURRENT_DATE - INTERVAL '2 days',
|
|
118
|
+
120,
|
|
119
|
+
5,
|
|
120
|
+
3,
|
|
121
|
+
2,
|
|
122
|
+
150.00,
|
|
123
|
+
'knowledge_capture',
|
|
124
|
+
'550e8400-e29b-41d4-a716-446655440011'
|
|
125
|
+
)
|
|
126
|
+
ON CONFLICT (user_id, date, activity_type, related_entry_id) DO NOTHING;
|
|
127
|
+
|
|
128
|
+
-- Demo expert connections
|
|
129
|
+
INSERT INTO expert_connections (
|
|
130
|
+
team_id, seeker_id, expert_id, topic, question, connection_method, was_helpful, feedback_rating
|
|
131
|
+
) VALUES
|
|
132
|
+
(
|
|
133
|
+
'550e8400-e29b-41d4-a716-446655440000',
|
|
134
|
+
'550e8400-e29b-41d4-a716-446655440003',
|
|
135
|
+
'550e8400-e29b-41d4-a716-446655440001',
|
|
136
|
+
'react',
|
|
137
|
+
'How do I optimize component re-renders?',
|
|
138
|
+
'ai_suggestion',
|
|
139
|
+
true,
|
|
140
|
+
5
|
|
141
|
+
),
|
|
142
|
+
(
|
|
143
|
+
'550e8400-e29b-41d4-a716-446655440000',
|
|
144
|
+
'550e8400-e29b-41d4-a716-446655440003',
|
|
145
|
+
'550e8400-e29b-41d4-a716-446655440002',
|
|
146
|
+
'postgresql',
|
|
147
|
+
'Why are my queries so slow?',
|
|
148
|
+
'ai_suggestion',
|
|
149
|
+
true,
|
|
150
|
+
4
|
|
151
|
+
)
|
|
152
|
+
ON CONFLICT (seeker_id, expert_id, topic, created_at::date) DO NOTHING;
|
|
153
|
+
`;
|
|
154
|
+
try {
|
|
155
|
+
await this.db.runMigration(additionalDemoSql);
|
|
156
|
+
console.log('Competition demo data setup completed');
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
console.warn('Demo data setup failed (may already exist):', error);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
exports.DatabaseMigrations = DatabaseMigrations;
|
|
164
|
+
// Utility function for Lambda functions to initialize database
|
|
165
|
+
async function initializeDatabase(secretArn) {
|
|
166
|
+
const db = new postgresql_1.PostgreSQLService();
|
|
167
|
+
await db.connect(secretArn);
|
|
168
|
+
const migrations = new DatabaseMigrations(db);
|
|
169
|
+
// Check if database is properly initialized
|
|
170
|
+
const isHealthy = await migrations.checkDatabaseExists();
|
|
171
|
+
if (!isHealthy) {
|
|
172
|
+
console.log('Database not initialized, running migrations...');
|
|
173
|
+
await migrations.runInitialMigration();
|
|
174
|
+
await migrations.setupCompetitionDemo();
|
|
175
|
+
}
|
|
176
|
+
return db;
|
|
177
|
+
}
|
|
178
|
+
// CLI utility for running migrations
|
|
179
|
+
async function runLocalMigrations() {
|
|
180
|
+
console.log('Running database migrations...');
|
|
181
|
+
const db = new postgresql_1.PostgreSQLService();
|
|
182
|
+
await db.connect(); // Uses environment variables
|
|
183
|
+
const migrations = new DatabaseMigrations(db);
|
|
184
|
+
await migrations.createMigrationTable();
|
|
185
|
+
await migrations.runInitialMigration();
|
|
186
|
+
await migrations.setupCompetitionDemo();
|
|
187
|
+
await db.disconnect();
|
|
188
|
+
console.log('Local migrations completed');
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=migrations.js.map
|