@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.
Files changed (210) hide show
  1. package/README.md +296 -0
  2. package/dist/ai/bedrock-client.d.ts +1 -0
  3. package/dist/ai/bedrock-client.d.ts.map +1 -0
  4. package/dist/ai/bedrock-client.js +2 -0
  5. package/dist/ai/bedrock-client.js.map +1 -0
  6. package/dist/ai/knowledge-processor.d.ts +1 -0
  7. package/dist/ai/knowledge-processor.d.ts.map +1 -0
  8. package/dist/ai/knowledge-processor.js +2 -0
  9. package/dist/ai/knowledge-processor.js.map +1 -0
  10. package/dist/cli.d.ts +3 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +70 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/commands/ask.d.ts +3 -0
  15. package/dist/commands/ask.d.ts.map +1 -0
  16. package/dist/commands/ask.js +217 -0
  17. package/dist/commands/ask.js.map +1 -0
  18. package/dist/commands/audit.d.ts +3 -0
  19. package/dist/commands/audit.d.ts.map +1 -0
  20. package/dist/commands/audit.js +153 -0
  21. package/dist/commands/audit.js.map +1 -0
  22. package/dist/commands/auth.d.ts +3 -0
  23. package/dist/commands/auth.d.ts.map +1 -0
  24. package/dist/commands/auth.js +114 -0
  25. package/dist/commands/auth.js.map +1 -0
  26. package/dist/commands/config.d.ts +3 -0
  27. package/dist/commands/config.d.ts.map +1 -0
  28. package/dist/commands/config.js +72 -0
  29. package/dist/commands/config.js.map +1 -0
  30. package/dist/commands/embeddings.d.ts +3 -0
  31. package/dist/commands/embeddings.d.ts.map +1 -0
  32. package/dist/commands/embeddings.js +118 -0
  33. package/dist/commands/embeddings.js.map +1 -0
  34. package/dist/commands/experts.d.ts +3 -0
  35. package/dist/commands/experts.d.ts.map +1 -0
  36. package/dist/commands/experts.js +129 -0
  37. package/dist/commands/experts.js.map +1 -0
  38. package/dist/commands/export-import.d.ts +4 -0
  39. package/dist/commands/export-import.d.ts.map +1 -0
  40. package/dist/commands/export-import.js +285 -0
  41. package/dist/commands/export-import.js.map +1 -0
  42. package/dist/commands/git.d.ts +4 -0
  43. package/dist/commands/git.d.ts.map +1 -0
  44. package/dist/commands/git.js +274 -0
  45. package/dist/commands/git.js.map +1 -0
  46. package/dist/commands/impact.d.ts +3 -0
  47. package/dist/commands/impact.d.ts.map +1 -0
  48. package/dist/commands/impact.js +121 -0
  49. package/dist/commands/impact.js.map +1 -0
  50. package/dist/commands/insights.d.ts +3 -0
  51. package/dist/commands/insights.d.ts.map +1 -0
  52. package/dist/commands/insights.js +113 -0
  53. package/dist/commands/insights.js.map +1 -0
  54. package/dist/commands/learned.d.ts +3 -0
  55. package/dist/commands/learned.d.ts.map +1 -0
  56. package/dist/commands/learned.js +355 -0
  57. package/dist/commands/learned.js.map +1 -0
  58. package/dist/commands/onboard.d.ts +3 -0
  59. package/dist/commands/onboard.d.ts.map +1 -0
  60. package/dist/commands/onboard.js +141 -0
  61. package/dist/commands/onboard.js.map +1 -0
  62. package/dist/commands/recent.d.ts +3 -0
  63. package/dist/commands/recent.d.ts.map +1 -0
  64. package/dist/commands/recent.js +83 -0
  65. package/dist/commands/recent.js.map +1 -0
  66. package/dist/commands/secrets.d.ts +3 -0
  67. package/dist/commands/secrets.d.ts.map +1 -0
  68. package/dist/commands/secrets.js +203 -0
  69. package/dist/commands/secrets.js.map +1 -0
  70. package/dist/commands/stats.d.ts +3 -0
  71. package/dist/commands/stats.d.ts.map +1 -0
  72. package/dist/commands/stats.js +120 -0
  73. package/dist/commands/stats.js.map +1 -0
  74. package/dist/config/index.d.ts +12 -0
  75. package/dist/config/index.d.ts.map +1 -0
  76. package/dist/config/index.js +46 -0
  77. package/dist/config/index.js.map +1 -0
  78. package/dist/database/migrations.d.ts +13 -0
  79. package/dist/database/migrations.d.ts.map +1 -0
  80. package/dist/database/migrations.js +190 -0
  81. package/dist/database/migrations.js.map +1 -0
  82. package/dist/database/postgresql.d.ts +92 -0
  83. package/dist/database/postgresql.d.ts.map +1 -0
  84. package/dist/database/postgresql.js +382 -0
  85. package/dist/database/postgresql.js.map +1 -0
  86. package/dist/database/sqlite.d.ts +54 -0
  87. package/dist/database/sqlite.d.ts.map +1 -0
  88. package/dist/database/sqlite.js +337 -0
  89. package/dist/database/sqlite.js.map +1 -0
  90. package/dist/lambda/admin.d.ts +3 -0
  91. package/dist/lambda/admin.d.ts.map +1 -0
  92. package/dist/lambda/admin.js +818 -0
  93. package/dist/lambda/admin.js.map +1 -0
  94. package/dist/lambda/ai-services.d.ts +6 -0
  95. package/dist/lambda/ai-services.d.ts.map +1 -0
  96. package/dist/lambda/ai-services.js +472 -0
  97. package/dist/lambda/ai-services.js.map +1 -0
  98. package/dist/lambda/analytics.d.ts +3 -0
  99. package/dist/lambda/analytics.d.ts.map +1 -0
  100. package/dist/lambda/analytics.js +481 -0
  101. package/dist/lambda/analytics.js.map +1 -0
  102. package/dist/lambda/api-router.d.ts +3 -0
  103. package/dist/lambda/api-router.d.ts.map +1 -0
  104. package/dist/lambda/api-router.js +162 -0
  105. package/dist/lambda/api-router.js.map +1 -0
  106. package/dist/lambda/custom-topics.d.ts +3 -0
  107. package/dist/lambda/custom-topics.d.ts.map +1 -0
  108. package/dist/lambda/custom-topics.js +425 -0
  109. package/dist/lambda/custom-topics.js.map +1 -0
  110. package/dist/lambda/graph-builder.d.ts +3 -0
  111. package/dist/lambda/graph-builder.d.ts.map +1 -0
  112. package/dist/lambda/graph-builder.js +442 -0
  113. package/dist/lambda/graph-builder.js.map +1 -0
  114. package/dist/lambda/knowledge-ai.d.ts +3 -0
  115. package/dist/lambda/knowledge-ai.d.ts.map +1 -0
  116. package/dist/lambda/knowledge-ai.js +849 -0
  117. package/dist/lambda/knowledge-ai.js.map +1 -0
  118. package/dist/lambda/post-confirmation.d.ts +8 -0
  119. package/dist/lambda/post-confirmation.d.ts.map +1 -0
  120. package/dist/lambda/post-confirmation.js +92 -0
  121. package/dist/lambda/post-confirmation.js.map +1 -0
  122. package/dist/lambda/teams.d.ts +3 -0
  123. package/dist/lambda/teams.d.ts.map +1 -0
  124. package/dist/lambda/teams.js +568 -0
  125. package/dist/lambda/teams.js.map +1 -0
  126. package/dist/lib/export-helpers.d.ts +5 -0
  127. package/dist/lib/export-helpers.d.ts.map +1 -0
  128. package/dist/lib/export-helpers.js +137 -0
  129. package/dist/lib/export-helpers.js.map +1 -0
  130. package/dist/lib/import-helpers.d.ts +5 -0
  131. package/dist/lib/import-helpers.d.ts.map +1 -0
  132. package/dist/lib/import-helpers.js +185 -0
  133. package/dist/lib/import-helpers.js.map +1 -0
  134. package/dist/lib/insights-helpers.d.ts +123 -0
  135. package/dist/lib/insights-helpers.d.ts.map +1 -0
  136. package/dist/lib/insights-helpers.js +374 -0
  137. package/dist/lib/insights-helpers.js.map +1 -0
  138. package/dist/lib/search-helpers.d.ts +4 -0
  139. package/dist/lib/search-helpers.d.ts.map +1 -0
  140. package/dist/lib/search-helpers.js +124 -0
  141. package/dist/lib/search-helpers.js.map +1 -0
  142. package/dist/lib/secret-helpers.d.ts +2 -0
  143. package/dist/lib/secret-helpers.d.ts.map +1 -0
  144. package/dist/lib/secret-helpers.js +85 -0
  145. package/dist/lib/secret-helpers.js.map +1 -0
  146. package/dist/lib/stats-helpers.d.ts +41 -0
  147. package/dist/lib/stats-helpers.d.ts.map +1 -0
  148. package/dist/lib/stats-helpers.js +263 -0
  149. package/dist/lib/stats-helpers.js.map +1 -0
  150. package/dist/services/aws-api.d.ts +81 -0
  151. package/dist/services/aws-api.d.ts.map +1 -0
  152. package/dist/services/aws-api.js +388 -0
  153. package/dist/services/aws-api.js.map +1 -0
  154. package/dist/services/bedrock.d.ts +83 -0
  155. package/dist/services/bedrock.d.ts.map +1 -0
  156. package/dist/services/bedrock.js +434 -0
  157. package/dist/services/bedrock.js.map +1 -0
  158. package/dist/services/commit-learnings.d.ts +25 -0
  159. package/dist/services/commit-learnings.d.ts.map +1 -0
  160. package/dist/services/commit-learnings.js +180 -0
  161. package/dist/services/commit-learnings.js.map +1 -0
  162. package/dist/services/embedding-storage.d.ts +42 -0
  163. package/dist/services/embedding-storage.d.ts.map +1 -0
  164. package/dist/services/embedding-storage.js +124 -0
  165. package/dist/services/embedding-storage.js.map +1 -0
  166. package/dist/services/expert-engine.d.ts +21 -0
  167. package/dist/services/expert-engine.d.ts.map +1 -0
  168. package/dist/services/expert-engine.js +58 -0
  169. package/dist/services/expert-engine.js.map +1 -0
  170. package/dist/services/onboarding-accelerator.d.ts +118 -0
  171. package/dist/services/onboarding-accelerator.d.ts.map +1 -0
  172. package/dist/services/onboarding-accelerator.js +403 -0
  173. package/dist/services/onboarding-accelerator.js.map +1 -0
  174. package/dist/services/secret-detection.d.ts +46 -0
  175. package/dist/services/secret-detection.d.ts.map +1 -0
  176. package/dist/services/secret-detection.js +75 -0
  177. package/dist/services/secret-detection.js.map +1 -0
  178. package/dist/services/secret-manager-simple.d.ts +51 -0
  179. package/dist/services/secret-manager-simple.d.ts.map +1 -0
  180. package/dist/services/secret-manager-simple.js +119 -0
  181. package/dist/services/secret-manager-simple.js.map +1 -0
  182. package/dist/services/secret-manager.d.ts +150 -0
  183. package/dist/services/secret-manager.d.ts.map +1 -0
  184. package/dist/services/secret-manager.js +287 -0
  185. package/dist/services/secret-manager.js.map +1 -0
  186. package/dist/services/vector-embeddings.d.ts +70 -0
  187. package/dist/services/vector-embeddings.d.ts.map +1 -0
  188. package/dist/services/vector-embeddings.js +167 -0
  189. package/dist/services/vector-embeddings.js.map +1 -0
  190. package/dist/services/vector-search.d.ts +28 -0
  191. package/dist/services/vector-search.d.ts.map +1 -0
  192. package/dist/services/vector-search.js +192 -0
  193. package/dist/services/vector-search.js.map +1 -0
  194. package/dist/types/index.d.ts +86 -0
  195. package/dist/types/index.d.ts.map +1 -0
  196. package/dist/types/index.js +4 -0
  197. package/dist/types/index.js.map +1 -0
  198. package/dist/utils/formatting.d.ts +10 -0
  199. package/dist/utils/formatting.d.ts.map +1 -0
  200. package/dist/utils/formatting.js +82 -0
  201. package/dist/utils/formatting.js.map +1 -0
  202. package/dist/utils/git.d.ts +52 -0
  203. package/dist/utils/git.d.ts.map +1 -0
  204. package/dist/utils/git.js +182 -0
  205. package/dist/utils/git.js.map +1 -0
  206. package/dist/utils/validation.d.ts +17 -0
  207. package/dist/utils/validation.d.ts.map +1 -0
  208. package/dist/utils/validation.js +187 -0
  209. package/dist/utils/validation.js.map +1 -0
  210. 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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createSecretsCommand(): Command;
3
+ //# sourceMappingURL=secrets.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createStatsCommand(): Command;
3
+ //# sourceMappingURL=stats.d.ts.map
@@ -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