@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,434 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Amazon Bedrock integration for AI-enhanced knowledge processing
|
|
3
|
+
// Routes through authenticated backend API
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.bedrockService = exports.BedrockService = void 0;
|
|
6
|
+
const vector_embeddings_1 = require("./vector-embeddings");
|
|
7
|
+
const aws_api_1 = require("./aws-api");
|
|
8
|
+
class BedrockService {
|
|
9
|
+
constructor() {
|
|
10
|
+
// API endpoint managed by awsApiService
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Enhance learning entry with AI-generated metadata
|
|
14
|
+
* Routes through authenticated backend API
|
|
15
|
+
*/
|
|
16
|
+
async enhanceKnowledgeEntry(content, authorId) {
|
|
17
|
+
try {
|
|
18
|
+
if (!aws_api_1.awsApiService.isAuthenticated()) {
|
|
19
|
+
console.warn('Not authenticated, using fallback');
|
|
20
|
+
return this.getFallbackResponse(content);
|
|
21
|
+
}
|
|
22
|
+
const response = await aws_api_1.awsApiService.callAPI('/ai/enhance', 'POST', {
|
|
23
|
+
content,
|
|
24
|
+
authorId
|
|
25
|
+
});
|
|
26
|
+
if (response.success && response.data) {
|
|
27
|
+
return {
|
|
28
|
+
topics: response.data.topics || [],
|
|
29
|
+
tags: response.data.tags || [],
|
|
30
|
+
impactScore: response.data.impactScore || 5,
|
|
31
|
+
expertiseLevel: response.data.expertiseLevel || 'intermediate',
|
|
32
|
+
relatedExperts: response.data.relatedExperts || [],
|
|
33
|
+
summary: response.data.summary
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
throw new Error(response.error || 'Failed to enhance knowledge');
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
console.warn('Bedrock enhancement failed, using fallback:', error);
|
|
40
|
+
return this.getFallbackResponse(content);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Enhanced natural language querying with efficient semantic search
|
|
45
|
+
* Uses two-stage filtering: hybrid search pre-filtering + AI ranking for top candidates
|
|
46
|
+
*/
|
|
47
|
+
async processNaturalLanguageQuery(question, searchFunction) {
|
|
48
|
+
try {
|
|
49
|
+
// First analyze the question to extract key terms
|
|
50
|
+
const analysis = await this.analyzeQuestion(question);
|
|
51
|
+
// Stage 1: Efficient hybrid search pre-filtering using database + vector search
|
|
52
|
+
// This reduces the candidate set from thousands to ~20-50 entries
|
|
53
|
+
const keywordCandidates = await this.getHybridCandidates(question, analysis, searchFunction);
|
|
54
|
+
// Stage 2: AI-powered semantic ranking on the small candidate set
|
|
55
|
+
// Only send top candidates to Bedrock to control costs
|
|
56
|
+
const rankedResults = await this.rankTopCandidates(question, analysis, keywordCandidates);
|
|
57
|
+
// Suggest experts based on topics
|
|
58
|
+
const suggestedExperts = await this.suggestExpertsForTopics(analysis.topics);
|
|
59
|
+
return {
|
|
60
|
+
analysis,
|
|
61
|
+
rankedResults,
|
|
62
|
+
suggestedExperts
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
console.warn('Enhanced query processing failed, using fallback:', error);
|
|
67
|
+
return this.getFallbackQueryResult(question, []);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Public method for question analysis
|
|
72
|
+
*/
|
|
73
|
+
async analyzeQuestion(question) {
|
|
74
|
+
try {
|
|
75
|
+
// Call through API for question analysis
|
|
76
|
+
const response = await aws_api_1.awsApiService.callAPI('/ai/analyze-question', 'POST', {
|
|
77
|
+
question
|
|
78
|
+
});
|
|
79
|
+
return response.analysis || this.getFallbackQuestionAnalysis(question);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
console.warn('Question analysis failed, using fallback:', error);
|
|
83
|
+
return this.getFallbackQuestionAnalysis(question);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Stage 1: Efficient hybrid candidate filtering
|
|
88
|
+
* Uses database search + vector similarity to get best candidates
|
|
89
|
+
*/
|
|
90
|
+
async getHybridCandidates(question, analysis, searchFunction) {
|
|
91
|
+
try {
|
|
92
|
+
// Generate embedding for semantic search
|
|
93
|
+
const questionEmbedding = await this.generateQuestionEmbedding(question);
|
|
94
|
+
// Use hybrid search if embedding generation succeeded
|
|
95
|
+
if (questionEmbedding.length > 0) {
|
|
96
|
+
return await searchFunction(question, questionEmbedding, 30);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.warn('Hybrid search failed, falling back to keyword search:', error);
|
|
101
|
+
}
|
|
102
|
+
// Fallback to multi-term keyword search
|
|
103
|
+
const searchTerms = [
|
|
104
|
+
question,
|
|
105
|
+
...analysis.topics,
|
|
106
|
+
...analysis.suggestedSearchTerms
|
|
107
|
+
];
|
|
108
|
+
const candidateSet = new Map();
|
|
109
|
+
const maxCandidatesPerTerm = 10;
|
|
110
|
+
const maxTotalCandidates = 30;
|
|
111
|
+
// Search with multiple terms to get diverse candidates
|
|
112
|
+
for (const term of searchTerms.slice(0, 5)) { // Limit search terms to control cost
|
|
113
|
+
try {
|
|
114
|
+
const results = await searchFunction(term, undefined, maxCandidatesPerTerm);
|
|
115
|
+
results.forEach(entry => {
|
|
116
|
+
if (candidateSet.size < maxTotalCandidates) {
|
|
117
|
+
candidateSet.set(entry.id || entry.content, entry);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
console.warn(`Search failed for term: ${term}`, error);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return Array.from(candidateSet.values());
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Generate embedding for question using real Titan embeddings
|
|
129
|
+
*/
|
|
130
|
+
async generateQuestionEmbedding(question) {
|
|
131
|
+
try {
|
|
132
|
+
// Use the real vector embedding service
|
|
133
|
+
return await vector_embeddings_1.vectorEmbeddingService.generateEmbedding(question);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
console.warn('Failed to generate question embedding:', error);
|
|
137
|
+
return []; // Fallback to keyword search
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Stage 2: AI-powered semantic ranking on small candidate set
|
|
142
|
+
* Only processes top candidates to control Bedrock costs
|
|
143
|
+
*/
|
|
144
|
+
async rankTopCandidates(question, _analysis, candidates) {
|
|
145
|
+
if (candidates.length === 0)
|
|
146
|
+
return [];
|
|
147
|
+
// Limit candidates sent to Bedrock to control costs
|
|
148
|
+
const maxBedrockCandidates = 15;
|
|
149
|
+
const topCandidates = candidates.slice(0, maxBedrockCandidates);
|
|
150
|
+
try {
|
|
151
|
+
// TODO: Route through API for ranking
|
|
152
|
+
// const prompt = this.buildEfficientRankingPrompt(question, analysis, topCandidates);
|
|
153
|
+
// const response = await awsApiService.callAPI('/ai/rank', 'POST', { question, analysis, candidates: topCandidates });
|
|
154
|
+
return this.getBasicRelevanceRanking(question, topCandidates);
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
console.warn('AI ranking failed, using basic scoring:', error);
|
|
158
|
+
return this.getBasicRelevanceRanking(question, topCandidates);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Optimized ranking prompt that processes fewer entries more efficiently
|
|
163
|
+
*/
|
|
164
|
+
_buildEfficientRankingPrompt(question, analysis, candidates) {
|
|
165
|
+
// Create concise summaries to fit more entries in the prompt
|
|
166
|
+
const candidateSummaries = candidates.map((entry, index) => ({
|
|
167
|
+
index,
|
|
168
|
+
content: entry.content.substring(0, 150), // Shorter content to save tokens
|
|
169
|
+
topics: (entry.aiTopics || []).slice(0, 3), // Limit topics
|
|
170
|
+
impact: entry.impactScore || 0
|
|
171
|
+
}));
|
|
172
|
+
return `Rank knowledge entries by relevance to this developer question.
|
|
173
|
+
|
|
174
|
+
Question: "${question}"
|
|
175
|
+
Intent: ${analysis.intent}
|
|
176
|
+
Key Topics: ${analysis.topics.slice(0, 3).join(', ')}
|
|
177
|
+
|
|
178
|
+
Candidates (${candidates.length} entries):
|
|
179
|
+
${candidateSummaries.map(c => `${c.index}: "${c.content}" [Topics: ${c.topics.join(', ')}] [Impact: ${c.impact}]`).join('\n')}
|
|
180
|
+
|
|
181
|
+
Return JSON array with objects containing:
|
|
182
|
+
- entryIndex: number
|
|
183
|
+
- relevanceScore: 0-10 (only include if >= 6)
|
|
184
|
+
- matchReason: brief explanation
|
|
185
|
+
|
|
186
|
+
Focus on semantic relevance, not just keyword matching. Prioritize high-impact entries.
|
|
187
|
+
Respond with JSON only.`;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Suggest experts based on identified topics
|
|
191
|
+
*/
|
|
192
|
+
async suggestExpertsForTopics(topics) {
|
|
193
|
+
const expertMapping = {
|
|
194
|
+
'react': ['Frontend Lead', 'React Specialist', 'UI/UX Developer'],
|
|
195
|
+
'typescript': ['TypeScript Expert', 'Frontend Architect', 'Full-stack Developer'],
|
|
196
|
+
'docker': ['DevOps Engineer', 'Infrastructure Specialist', 'Platform Engineer'],
|
|
197
|
+
'aws': ['Cloud Architect', 'AWS Specialist', 'DevOps Engineer'],
|
|
198
|
+
'database': ['Database Administrator', 'Backend Developer', 'Data Engineer'],
|
|
199
|
+
'api': ['Backend Developer', 'API Architect', 'Full-stack Developer'],
|
|
200
|
+
'security': ['Security Engineer', 'DevSecOps Specialist', 'Infrastructure Lead'],
|
|
201
|
+
'performance': ['Performance Engineer', 'Senior Developer', 'System Architect']
|
|
202
|
+
};
|
|
203
|
+
const suggestedExperts = new Set();
|
|
204
|
+
topics.forEach(topic => {
|
|
205
|
+
const topicLower = topic.toLowerCase();
|
|
206
|
+
Object.keys(expertMapping).forEach(key => {
|
|
207
|
+
if (topicLower.includes(key)) {
|
|
208
|
+
expertMapping[key].forEach(expert => suggestedExperts.add(expert));
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
return Array.from(suggestedExperts).slice(0, 3);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Generate insights from learning patterns
|
|
216
|
+
*/
|
|
217
|
+
async generateInsights(entries, _teamId) {
|
|
218
|
+
try {
|
|
219
|
+
// TODO: Route through API for insights generation
|
|
220
|
+
// const response = await awsApiService.callAPI('/ai/insights', 'POST', { entries, teamId });
|
|
221
|
+
return this.getFallbackInsights(entries);
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
console.warn('Insights generation failed, using fallback:', error);
|
|
225
|
+
return this.getFallbackInsights(entries);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
_buildKnowledgeEnhancementPrompt(content, authorId) {
|
|
229
|
+
return `You are an AI assistant helping developers organize and enhance their knowledge entries.
|
|
230
|
+
|
|
231
|
+
Analyze this learning entry and provide structured metadata:
|
|
232
|
+
|
|
233
|
+
Content: "${content}"
|
|
234
|
+
Author: ${authorId}
|
|
235
|
+
|
|
236
|
+
Please respond with a JSON object containing:
|
|
237
|
+
- topics: Array of 3-5 relevant technical topics/keywords
|
|
238
|
+
- tags: Array of 2-4 concise tags for categorization
|
|
239
|
+
- impactScore: Number from 1-10 indicating potential impact/usefulness
|
|
240
|
+
- expertiseLevel: "beginner", "intermediate", or "expert" based on content complexity
|
|
241
|
+
- relatedExperts: Array of potential expert roles who might know about this topic
|
|
242
|
+
- summary: Brief 1-sentence summary if content is long
|
|
243
|
+
|
|
244
|
+
Focus on:
|
|
245
|
+
- Technical accuracy and relevance
|
|
246
|
+
- Practical usefulness for developers
|
|
247
|
+
- Clear categorization for searchability
|
|
248
|
+
|
|
249
|
+
Respond only with valid JSON, no additional text.`;
|
|
250
|
+
}
|
|
251
|
+
_buildQuestionAnalysisPrompt(question) {
|
|
252
|
+
return `You are an AI assistant helping developers find relevant knowledge by analyzing their questions.
|
|
253
|
+
|
|
254
|
+
Analyze this developer question:
|
|
255
|
+
"${question}"
|
|
256
|
+
|
|
257
|
+
Please respond with a JSON object containing:
|
|
258
|
+
- intent: Brief description of what the developer is trying to accomplish
|
|
259
|
+
- topics: Array of 3-5 technical topics related to this question
|
|
260
|
+
- confidence: Number from 0-1 indicating how well you understand the question
|
|
261
|
+
- suggestedSearchTerms: Array of 3-5 alternative search terms that might find relevant knowledge
|
|
262
|
+
|
|
263
|
+
Focus on:
|
|
264
|
+
- Understanding the developer's actual need
|
|
265
|
+
- Identifying key technical concepts
|
|
266
|
+
- Providing good search alternatives
|
|
267
|
+
|
|
268
|
+
Respond only with valid JSON, no additional text.`;
|
|
269
|
+
}
|
|
270
|
+
_buildInsightsPrompt(entries, teamId) {
|
|
271
|
+
const recentTopics = entries.slice(0, 10).map(e => e.aiTopics || []).flat();
|
|
272
|
+
const topicCounts = recentTopics.reduce((acc, topic) => {
|
|
273
|
+
acc[topic] = (acc[topic] || 0) + 1;
|
|
274
|
+
return acc;
|
|
275
|
+
}, {});
|
|
276
|
+
return `You are an AI assistant analyzing team learning patterns to provide insights.
|
|
277
|
+
|
|
278
|
+
Team: ${teamId}
|
|
279
|
+
Recent learning topics: ${Object.keys(topicCounts).slice(0, 10).join(', ')}
|
|
280
|
+
Total entries analyzed: ${entries.length}
|
|
281
|
+
|
|
282
|
+
Generate 3-5 actionable insights about this team's learning patterns. Focus on:
|
|
283
|
+
- Learning trends and focus areas
|
|
284
|
+
- Knowledge gaps that might exist
|
|
285
|
+
- Recommendations for skill development
|
|
286
|
+
- Opportunities for knowledge sharing
|
|
287
|
+
|
|
288
|
+
Respond with a JSON array of insight strings, each being a complete, actionable sentence.
|
|
289
|
+
Example: ["Your team is actively learning React optimization patterns", "Consider exploring database performance tuning"]
|
|
290
|
+
|
|
291
|
+
Respond only with valid JSON array, no additional text.`;
|
|
292
|
+
}
|
|
293
|
+
_parseKnowledgeResponse(response) {
|
|
294
|
+
try {
|
|
295
|
+
const parsed = JSON.parse(response);
|
|
296
|
+
return {
|
|
297
|
+
topics: parsed.topics || [],
|
|
298
|
+
tags: parsed.tags || [],
|
|
299
|
+
impactScore: Math.max(1, Math.min(10, parsed.impactScore || 5)),
|
|
300
|
+
expertiseLevel: ['beginner', 'intermediate', 'expert'].includes(parsed.expertiseLevel)
|
|
301
|
+
? parsed.expertiseLevel
|
|
302
|
+
: 'beginner',
|
|
303
|
+
relatedExperts: parsed.relatedExperts || [],
|
|
304
|
+
summary: parsed.summary
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
console.warn('Failed to parse Bedrock response:', error);
|
|
309
|
+
return this.getFallbackResponse('');
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
_parseQuestionResponse(response) {
|
|
313
|
+
try {
|
|
314
|
+
const parsed = JSON.parse(response);
|
|
315
|
+
return {
|
|
316
|
+
intent: parsed.intent || 'General question',
|
|
317
|
+
topics: parsed.topics || [],
|
|
318
|
+
confidence: Math.max(0, Math.min(1, parsed.confidence || 0.5)),
|
|
319
|
+
suggestedSearchTerms: parsed.suggestedSearchTerms || []
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
console.warn('Failed to parse question analysis:', error);
|
|
324
|
+
return this.getFallbackQuestionAnalysis('');
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
_parseRelevanceResponse(response, entries) {
|
|
328
|
+
try {
|
|
329
|
+
const parsed = JSON.parse(response);
|
|
330
|
+
if (!Array.isArray(parsed))
|
|
331
|
+
return [];
|
|
332
|
+
return parsed
|
|
333
|
+
.filter(item => item.entryIndex < entries.length && item.relevanceScore >= 6)
|
|
334
|
+
.map(item => ({
|
|
335
|
+
entry: entries[item.entryIndex],
|
|
336
|
+
relevanceScore: item.relevanceScore,
|
|
337
|
+
matchReason: item.matchReason || 'Relevant match found'
|
|
338
|
+
}))
|
|
339
|
+
.sort((a, b) => b.relevanceScore - a.relevanceScore);
|
|
340
|
+
}
|
|
341
|
+
catch (error) {
|
|
342
|
+
console.warn('Failed to parse relevance response:', error);
|
|
343
|
+
return [];
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
_parseInsightsResponse(response) {
|
|
347
|
+
try {
|
|
348
|
+
const parsed = JSON.parse(response);
|
|
349
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
350
|
+
}
|
|
351
|
+
catch (error) {
|
|
352
|
+
console.warn('Failed to parse insights response:', error);
|
|
353
|
+
return this.getFallbackInsights([]);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
getFallbackResponse(content) {
|
|
357
|
+
// Simple keyword extraction as fallback
|
|
358
|
+
const words = content.toLowerCase().split(/\s+/);
|
|
359
|
+
const techKeywords = ['react', 'typescript', 'javascript', 'python', 'aws', 'docker', 'api', 'database', 'css', 'html'];
|
|
360
|
+
const foundTopics = techKeywords.filter(keyword => words.some(word => word.includes(keyword)));
|
|
361
|
+
return {
|
|
362
|
+
topics: foundTopics.slice(0, 3),
|
|
363
|
+
tags: foundTopics.slice(0, 2),
|
|
364
|
+
impactScore: Math.floor(Math.random() * 5) + 3, // 3-7 range
|
|
365
|
+
expertiseLevel: content.length > 200 ? 'intermediate' : 'beginner',
|
|
366
|
+
relatedExperts: ['senior-developer', 'tech-lead'],
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
getFallbackQuestionAnalysis(question) {
|
|
370
|
+
const words = question.toLowerCase().split(/\s+/);
|
|
371
|
+
const techKeywords = ['react', 'typescript', 'javascript', 'python', 'aws', 'docker', 'api', 'database'];
|
|
372
|
+
const foundTopics = techKeywords.filter(keyword => words.some(word => word.includes(keyword)));
|
|
373
|
+
return {
|
|
374
|
+
intent: 'Developer seeking technical guidance',
|
|
375
|
+
topics: foundTopics.slice(0, 3),
|
|
376
|
+
confidence: 0.6,
|
|
377
|
+
suggestedSearchTerms: foundTopics.concat(words.filter(w => w.length > 3).slice(0, 2))
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
getBasicRelevanceRanking(question, entries) {
|
|
381
|
+
const questionWords = question.toLowerCase().split(/\s+/);
|
|
382
|
+
return entries
|
|
383
|
+
.map(entry => {
|
|
384
|
+
const contentWords = entry.content.toLowerCase().split(/\s+/);
|
|
385
|
+
const topicWords = (entry.aiTopics || []).join(' ').toLowerCase().split(/\s+/);
|
|
386
|
+
let score = 0;
|
|
387
|
+
questionWords.forEach(qWord => {
|
|
388
|
+
if (qWord.length > 3) {
|
|
389
|
+
if (contentWords.some((cWord) => cWord.includes(qWord)))
|
|
390
|
+
score += 2;
|
|
391
|
+
if (topicWords.some((tWord) => tWord.includes(qWord)))
|
|
392
|
+
score += 3;
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
return {
|
|
396
|
+
entry,
|
|
397
|
+
relevanceScore: Math.min(10, score),
|
|
398
|
+
matchReason: score > 0 ? 'Keyword match found' : 'No direct match'
|
|
399
|
+
};
|
|
400
|
+
})
|
|
401
|
+
.filter(item => item.relevanceScore >= 3)
|
|
402
|
+
.sort((a, b) => b.relevanceScore - a.relevanceScore);
|
|
403
|
+
}
|
|
404
|
+
getFallbackQueryResult(question, entries) {
|
|
405
|
+
const analysis = this.getFallbackQuestionAnalysis(question);
|
|
406
|
+
const rankedResults = this.getBasicRelevanceRanking(question, entries);
|
|
407
|
+
const suggestedExperts = ['Senior Developer', 'Tech Lead', 'Subject Matter Expert'];
|
|
408
|
+
return { analysis, rankedResults, suggestedExperts };
|
|
409
|
+
}
|
|
410
|
+
getFallbackInsights(_entries) {
|
|
411
|
+
const fallbackInsights = [
|
|
412
|
+
'Your team is actively sharing knowledge and learning new technologies',
|
|
413
|
+
'Consider documenting more architectural decisions and design patterns',
|
|
414
|
+
'Knowledge sharing frequency has increased - great for team collaboration',
|
|
415
|
+
'Look for opportunities to cross-train team members on different technologies'
|
|
416
|
+
];
|
|
417
|
+
return fallbackInsights.slice(0, 3);
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Check if Bedrock is available and configured
|
|
421
|
+
*/
|
|
422
|
+
async isAvailable() {
|
|
423
|
+
try {
|
|
424
|
+
// Check if API is available
|
|
425
|
+
return aws_api_1.awsApiService.isAuthenticated();
|
|
426
|
+
}
|
|
427
|
+
catch (error) {
|
|
428
|
+
return false;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
exports.BedrockService = BedrockService;
|
|
433
|
+
exports.bedrockService = new BedrockService();
|
|
434
|
+
//# sourceMappingURL=bedrock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bedrock.js","sourceRoot":"","sources":["../../src/services/bedrock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service for generating learning entries from git commits
|
|
3
|
+
*/
|
|
4
|
+
import { GitCommit } from '../utils/git';
|
|
5
|
+
export interface CommitLearning {
|
|
6
|
+
content: string;
|
|
7
|
+
context: string;
|
|
8
|
+
topics: string[];
|
|
9
|
+
commitHash: string;
|
|
10
|
+
commitMessage: string;
|
|
11
|
+
isFromGitPush: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Generate a learning entry from a well-structured commit
|
|
15
|
+
* @param commit - The git commit to analyze
|
|
16
|
+
* @returns A learning entry object or null if not suitable
|
|
17
|
+
*/
|
|
18
|
+
export declare function generateLearningFromCommit(commit: GitCommit): Promise<CommitLearning | null>;
|
|
19
|
+
/**
|
|
20
|
+
* Process multiple commits and generate learning entries
|
|
21
|
+
* @param commits - Array of commits to process
|
|
22
|
+
* @returns Array of learning entries generated from well-structured commits
|
|
23
|
+
*/
|
|
24
|
+
export declare function generateLearningsFromCommits(commits: GitCommit[]): Promise<CommitLearning[]>;
|
|
25
|
+
//# sourceMappingURL=commit-learnings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-learnings.d.ts","sourceRoot":"","sources":["../../src/services/commit-learnings.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,SAAS,EAAgE,MAAM,cAAc,CAAC;AAEvG,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAsB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA+DlG;AAkHD;;;;GAIG;AACH,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAWlG"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Service for generating learning entries from git commits
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generateLearningFromCommit = generateLearningFromCommit;
|
|
7
|
+
exports.generateLearningsFromCommits = generateLearningsFromCommits;
|
|
8
|
+
const bedrock_1 = require("./bedrock");
|
|
9
|
+
const git_1 = require("../utils/git");
|
|
10
|
+
/**
|
|
11
|
+
* Generate a learning entry from a well-structured commit
|
|
12
|
+
* @param commit - The git commit to analyze
|
|
13
|
+
* @returns A learning entry object or null if not suitable
|
|
14
|
+
*/
|
|
15
|
+
async function generateLearningFromCommit(commit) {
|
|
16
|
+
// First, check if the commit is well-structured
|
|
17
|
+
const analysis = (0, git_1.analyzeCommitStructure)(commit);
|
|
18
|
+
if (!analysis.isWellStructured) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
// Extract context from the commit
|
|
22
|
+
const context = (0, git_1.extractCommitContext)(commit);
|
|
23
|
+
// Use Bedrock AI to generate a comprehensive learning entry
|
|
24
|
+
const bedrockAvailable = await bedrock_1.bedrockService.isAvailable();
|
|
25
|
+
let learningContent;
|
|
26
|
+
let topics = [];
|
|
27
|
+
if (bedrockAvailable) {
|
|
28
|
+
try {
|
|
29
|
+
// Create a prompt for Bedrock to generate learning content
|
|
30
|
+
const prompt = `Analyze this git commit and create a comprehensive learning entry that captures the key knowledge and insights:
|
|
31
|
+
|
|
32
|
+
${context}
|
|
33
|
+
|
|
34
|
+
Please provide:
|
|
35
|
+
1. A detailed explanation of what was learned or implemented
|
|
36
|
+
2. Why this change was made (the reasoning behind it)
|
|
37
|
+
3. Any technical patterns, best practices, or important considerations
|
|
38
|
+
4. Potential gotchas or things to watch out for
|
|
39
|
+
5. How this knowledge could be applied in the future
|
|
40
|
+
|
|
41
|
+
Write this as a learning entry that would be valuable for team members and future reference. Focus on the knowledge gained, not just the change made.`;
|
|
42
|
+
// Use Bedrock to generate enhanced learning content
|
|
43
|
+
const enhancedResult = await bedrock_1.bedrockService.enhanceKnowledgeEntry(prompt, 'git-system');
|
|
44
|
+
if (enhancedResult && enhancedResult.summary) {
|
|
45
|
+
learningContent = enhancedResult.summary;
|
|
46
|
+
topics = enhancedResult.topics || [];
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
// Fallback to basic learning content
|
|
50
|
+
learningContent = generateBasicLearningContent(commit, analysis, context);
|
|
51
|
+
topics = extractTopicsFromCommit(commit, analysis);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.warn('Bedrock enhancement failed, using basic learning generation:', error);
|
|
56
|
+
learningContent = generateBasicLearningContent(commit, analysis, context);
|
|
57
|
+
topics = extractTopicsFromCommit(commit, analysis);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Generate basic learning content without Bedrock
|
|
62
|
+
learningContent = generateBasicLearningContent(commit, analysis, context);
|
|
63
|
+
topics = extractTopicsFromCommit(commit, analysis);
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
content: learningContent,
|
|
67
|
+
context,
|
|
68
|
+
topics,
|
|
69
|
+
commitHash: commit.hash,
|
|
70
|
+
commitMessage: commit.message,
|
|
71
|
+
isFromGitPush: true
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Generate basic learning content when Bedrock is not available
|
|
76
|
+
*/
|
|
77
|
+
function generateBasicLearningContent(commit, analysis, context) {
|
|
78
|
+
let content = `**Learning from commit: ${commit.message}**\n\n`;
|
|
79
|
+
if (analysis.conventionalType) {
|
|
80
|
+
content += `**Type:** ${analysis.conventionalType}\n`;
|
|
81
|
+
if (analysis.scope) {
|
|
82
|
+
content += `**Scope:** ${analysis.scope}\n`;
|
|
83
|
+
}
|
|
84
|
+
content += `**Description:** ${analysis.description}\n\n`;
|
|
85
|
+
}
|
|
86
|
+
content += `**What was done:**\n`;
|
|
87
|
+
content += `${commit.message}\n\n`;
|
|
88
|
+
content += `**Files affected:**\n`;
|
|
89
|
+
commit.files.forEach(file => {
|
|
90
|
+
content += `- ${file}\n`;
|
|
91
|
+
});
|
|
92
|
+
content += '\n';
|
|
93
|
+
content += `**Key takeaways:**\n`;
|
|
94
|
+
content += `- This change demonstrates ${analysis.conventionalType || 'a development'} in the codebase\n`;
|
|
95
|
+
content += `- Modified ${commit.files.length} file(s)\n`;
|
|
96
|
+
if (analysis.reasons.length > 0) {
|
|
97
|
+
content += `\n**Quality indicators:**\n`;
|
|
98
|
+
analysis.reasons.forEach((reason) => {
|
|
99
|
+
content += `- ${reason}\n`;
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
content += `\n**Context:**\n`;
|
|
103
|
+
content += `Author: ${commit.author}\n`;
|
|
104
|
+
content += `Date: ${commit.date.toLocaleDateString()}\n`;
|
|
105
|
+
return content;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Extract topics from commit information
|
|
109
|
+
*/
|
|
110
|
+
function extractTopicsFromCommit(commit, analysis) {
|
|
111
|
+
const topics = [];
|
|
112
|
+
// Add conventional commit type as a topic
|
|
113
|
+
if (analysis.conventionalType) {
|
|
114
|
+
topics.push(analysis.conventionalType);
|
|
115
|
+
}
|
|
116
|
+
// Add scope as a topic if present
|
|
117
|
+
if (analysis.scope) {
|
|
118
|
+
topics.push(analysis.scope);
|
|
119
|
+
}
|
|
120
|
+
// Extract topics from file extensions
|
|
121
|
+
const extensions = new Set();
|
|
122
|
+
commit.files.forEach(file => {
|
|
123
|
+
const ext = file.split('.').pop();
|
|
124
|
+
if (ext && ext.length < 10) {
|
|
125
|
+
extensions.add(ext);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
extensions.forEach(ext => {
|
|
129
|
+
const topicMap = {
|
|
130
|
+
'ts': 'TypeScript',
|
|
131
|
+
'js': 'JavaScript',
|
|
132
|
+
'py': 'Python',
|
|
133
|
+
'go': 'Go',
|
|
134
|
+
'java': 'Java',
|
|
135
|
+
'rb': 'Ruby',
|
|
136
|
+
'sh': 'Shell',
|
|
137
|
+
'yml': 'YAML',
|
|
138
|
+
'yaml': 'YAML',
|
|
139
|
+
'json': 'JSON',
|
|
140
|
+
'md': 'Documentation',
|
|
141
|
+
'sql': 'SQL',
|
|
142
|
+
'tf': 'Terraform',
|
|
143
|
+
};
|
|
144
|
+
if (topicMap[ext]) {
|
|
145
|
+
topics.push(topicMap[ext]);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
// Extract topics from file paths (directories)
|
|
149
|
+
const directories = new Set();
|
|
150
|
+
commit.files.forEach(file => {
|
|
151
|
+
const parts = file.split('/');
|
|
152
|
+
if (parts.length > 1) {
|
|
153
|
+
directories.add(parts[0]);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
// Add relevant directory names as topics
|
|
157
|
+
const relevantDirs = ['src', 'lib', 'tests', 'docs', 'api', 'ui', 'services', 'utils', 'components'];
|
|
158
|
+
directories.forEach(dir => {
|
|
159
|
+
if (relevantDirs.includes(dir.toLowerCase())) {
|
|
160
|
+
topics.push(dir);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
return [...new Set(topics)]; // Remove duplicates
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Process multiple commits and generate learning entries
|
|
167
|
+
* @param commits - Array of commits to process
|
|
168
|
+
* @returns Array of learning entries generated from well-structured commits
|
|
169
|
+
*/
|
|
170
|
+
async function generateLearningsFromCommits(commits) {
|
|
171
|
+
const learnings = [];
|
|
172
|
+
for (const commit of commits) {
|
|
173
|
+
const learning = await generateLearningFromCommit(commit);
|
|
174
|
+
if (learning) {
|
|
175
|
+
learnings.push(learning);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return learnings;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=commit-learnings.js.map
|