@mathrunet/masamune_firebase_workflow_marketing 3.8.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/CHANGELOG.md +361 -0
- package/LICENSE +21 -0
- package/README.md +70 -0
- package/assets/fonts/NotoSans-Bold.ttf +1439 -0
- package/assets/fonts/NotoSans-Regular.ttf +1439 -0
- package/assets/fonts/NotoSans.ttf +0 -0
- package/assets/fonts/NotoSansJP-Bold.ttf +0 -0
- package/assets/fonts/NotoSansJP-Regular.ttf +0 -0
- package/assets/fonts/NotoSansKR-Bold.ttf +1439 -0
- package/assets/fonts/NotoSansKR-Regular.ttf +1439 -0
- package/assets/fonts/NotoSansKR.ttf +0 -0
- package/assets/fonts/NotoSansSC-Bold.ttf +1439 -0
- package/assets/fonts/NotoSansSC-Regular.ttf +1439 -0
- package/assets/fonts/NotoSansSC.ttf +0 -0
- package/dist/clients/app_store_client.d.ts +54 -0
- package/dist/clients/app_store_client.js +280 -0
- package/dist/clients/app_store_client.js.map +1 -0
- package/dist/clients/firebase_analytics_client.d.ts +67 -0
- package/dist/clients/firebase_analytics_client.js +411 -0
- package/dist/clients/firebase_analytics_client.js.map +1 -0
- package/dist/clients/github_content_client.d.ts +83 -0
- package/dist/clients/github_content_client.js +443 -0
- package/dist/clients/github_content_client.js.map +1 -0
- package/dist/clients/google_play_client.d.ts +49 -0
- package/dist/clients/google_play_client.js +275 -0
- package/dist/clients/google_play_client.js.map +1 -0
- package/dist/functions/analyze_github_init.d.ts +37 -0
- package/dist/functions/analyze_github_init.js +299 -0
- package/dist/functions/analyze_github_init.js.map +1 -0
- package/dist/functions/analyze_github_process.d.ts +25 -0
- package/dist/functions/analyze_github_process.js +268 -0
- package/dist/functions/analyze_github_process.js.map +1 -0
- package/dist/functions/analyze_github_summary.d.ts +32 -0
- package/dist/functions/analyze_github_summary.js +270 -0
- package/dist/functions/analyze_github_summary.js.map +1 -0
- package/dist/functions/analyze_market_research.d.ts +40 -0
- package/dist/functions/analyze_market_research.js +346 -0
- package/dist/functions/analyze_market_research.js.map +1 -0
- package/dist/functions/analyze_marketing_data.d.ts +96 -0
- package/dist/functions/analyze_marketing_data.js +990 -0
- package/dist/functions/analyze_marketing_data.js.map +1 -0
- package/dist/functions/collect_from_app_store.d.ts +25 -0
- package/dist/functions/collect_from_app_store.js +148 -0
- package/dist/functions/collect_from_app_store.js.map +1 -0
- package/dist/functions/collect_from_firebase_analytics.d.ts +25 -0
- package/dist/functions/collect_from_firebase_analytics.js +142 -0
- package/dist/functions/collect_from_firebase_analytics.js.map +1 -0
- package/dist/functions/collect_from_google_play_console.d.ts +25 -0
- package/dist/functions/collect_from_google_play_console.js +142 -0
- package/dist/functions/collect_from_google_play_console.js.map +1 -0
- package/dist/functions/generate_marketing_markdown.d.ts +89 -0
- package/dist/functions/generate_marketing_markdown.js +653 -0
- package/dist/functions/generate_marketing_markdown.js.map +1 -0
- package/dist/functions/generate_marketing_pdf.d.ts +25 -0
- package/dist/functions/generate_marketing_pdf.js +175 -0
- package/dist/functions/generate_marketing_pdf.js.map +1 -0
- package/dist/functions/research_market.d.ts +56 -0
- package/dist/functions/research_market.js +434 -0
- package/dist/functions/research_market.js.map +1 -0
- package/dist/functions.d.ts +571 -0
- package/dist/functions.js +648 -0
- package/dist/functions.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/locales/de_DE.d.ts +5 -0
- package/dist/locales/de_DE.js +111 -0
- package/dist/locales/de_DE.js.map +1 -0
- package/dist/locales/en.d.ts +5 -0
- package/dist/locales/en.js +111 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/locales/es_ES.d.ts +5 -0
- package/dist/locales/es_ES.js +111 -0
- package/dist/locales/es_ES.js.map +1 -0
- package/dist/locales/fr_FR.d.ts +5 -0
- package/dist/locales/fr_FR.js +111 -0
- package/dist/locales/fr_FR.js.map +1 -0
- package/dist/locales/id_ID.d.ts +5 -0
- package/dist/locales/id_ID.js +111 -0
- package/dist/locales/id_ID.js.map +1 -0
- package/dist/locales/index.d.ts +59 -0
- package/dist/locales/index.js +155 -0
- package/dist/locales/index.js.map +1 -0
- package/dist/locales/ja.d.ts +5 -0
- package/dist/locales/ja.js +111 -0
- package/dist/locales/ja.js.map +1 -0
- package/dist/locales/ko_KR.d.ts +5 -0
- package/dist/locales/ko_KR.js +111 -0
- package/dist/locales/ko_KR.js.map +1 -0
- package/dist/locales/pt_PT.d.ts +5 -0
- package/dist/locales/pt_PT.js +111 -0
- package/dist/locales/pt_PT.js.map +1 -0
- package/dist/locales/ru_RU.d.ts +5 -0
- package/dist/locales/ru_RU.js +111 -0
- package/dist/locales/ru_RU.js.map +1 -0
- package/dist/locales/types.d.ts +105 -0
- package/dist/locales/types.js +8 -0
- package/dist/locales/types.js.map +1 -0
- package/dist/locales/zh_CN.d.ts +5 -0
- package/dist/locales/zh_CN.js +111 -0
- package/dist/locales/zh_CN.js.map +1 -0
- package/dist/models/app_store_data.d.ts +87 -0
- package/dist/models/app_store_data.js +8 -0
- package/dist/models/app_store_data.js.map +1 -0
- package/dist/models/chart_data.d.ts +104 -0
- package/dist/models/chart_data.js +8 -0
- package/dist/models/chart_data.js.map +1 -0
- package/dist/models/common.d.ts +42 -0
- package/dist/models/common.js +8 -0
- package/dist/models/common.js.map +1 -0
- package/dist/models/firebase_analytics_data.d.ts +134 -0
- package/dist/models/firebase_analytics_data.js +8 -0
- package/dist/models/firebase_analytics_data.js.map +1 -0
- package/dist/models/github_analysis_data.d.ts +266 -0
- package/dist/models/github_analysis_data.js +101 -0
- package/dist/models/github_analysis_data.js.map +1 -0
- package/dist/models/google_play_data.d.ts +115 -0
- package/dist/models/google_play_data.js +8 -0
- package/dist/models/google_play_data.js.map +1 -0
- package/dist/models/index.d.ts +14 -0
- package/dist/models/index.js +36 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/market_research_data.d.ts +259 -0
- package/dist/models/market_research_data.js +8 -0
- package/dist/models/market_research_data.js.map +1 -0
- package/dist/models/marketing_analysis_data.d.ts +200 -0
- package/dist/models/marketing_analysis_data.js +8 -0
- package/dist/models/marketing_analysis_data.js.map +1 -0
- package/dist/models/pdf_data.d.ts +112 -0
- package/dist/models/pdf_data.js +8 -0
- package/dist/models/pdf_data.js.map +1 -0
- package/dist/services/chart_service.d.ts +54 -0
- package/dist/services/chart_service.js +436 -0
- package/dist/services/chart_service.js.map +1 -0
- package/dist/services/github_analysis_service.d.ts +73 -0
- package/dist/services/github_analysis_service.js +488 -0
- package/dist/services/github_analysis_service.js.map +1 -0
- package/dist/services/pdf_service.d.ts +112 -0
- package/dist/services/pdf_service.js +1397 -0
- package/dist/services/pdf_service.js.map +1 -0
- package/dist/utils/github_analysis_storage.d.ts +88 -0
- package/dist/utils/github_analysis_storage.js +154 -0
- package/dist/utils/github_analysis_storage.js.map +1 -0
- package/package.json +64 -0
- package/scripts/cleanup_test_data.ts +304 -0
- package/scripts/list_test_data.ts +85 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Analysis Service
|
|
3
|
+
*
|
|
4
|
+
* AI-powered code analysis using Gemini:
|
|
5
|
+
* - File summarization
|
|
6
|
+
* - Folder summarization
|
|
7
|
+
* - Final repository analysis
|
|
8
|
+
*
|
|
9
|
+
* @see https://ai.google.dev/
|
|
10
|
+
*/
|
|
11
|
+
import { FrameworkInfo, FileSummary, FolderSummary, GitHubRepositoryAnalysis } from "../models";
|
|
12
|
+
/**
|
|
13
|
+
* Result of AI generation including token usage.
|
|
14
|
+
*/
|
|
15
|
+
interface GenerationResult<T> {
|
|
16
|
+
data: T;
|
|
17
|
+
inputTokens: number;
|
|
18
|
+
outputTokens: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Configuration for GitHub Analysis Service.
|
|
22
|
+
*/
|
|
23
|
+
export interface GitHubAnalysisServiceConfig {
|
|
24
|
+
/** GCP Project ID */
|
|
25
|
+
projectId: string;
|
|
26
|
+
/** GCP Region */
|
|
27
|
+
region?: string;
|
|
28
|
+
/** Gemini model name */
|
|
29
|
+
modelName?: string;
|
|
30
|
+
/** Locale for response language */
|
|
31
|
+
locale?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* GitHub Analysis Service using Gemini AI.
|
|
35
|
+
*/
|
|
36
|
+
export declare class GitHubAnalysisService {
|
|
37
|
+
private genai;
|
|
38
|
+
private modelName;
|
|
39
|
+
private translations;
|
|
40
|
+
constructor(config: GitHubAnalysisServiceConfig);
|
|
41
|
+
/**
|
|
42
|
+
* Get language from file path.
|
|
43
|
+
*/
|
|
44
|
+
getLanguageFromPath(path: string): string | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Summarize a single file.
|
|
47
|
+
*/
|
|
48
|
+
summarizeFile(content: string, path: string, framework: string): Promise<GenerationResult<FileSummary>>;
|
|
49
|
+
/**
|
|
50
|
+
* Analyze all files in a folder in a single AI call.
|
|
51
|
+
* Returns both individual file summaries and folder summary.
|
|
52
|
+
*/
|
|
53
|
+
analyzeFolderBatch(files: Array<{
|
|
54
|
+
path: string;
|
|
55
|
+
content: string;
|
|
56
|
+
}>, folderPath: string, framework: string): Promise<GenerationResult<{
|
|
57
|
+
files: FileSummary[];
|
|
58
|
+
folder: FolderSummary;
|
|
59
|
+
}>>;
|
|
60
|
+
/**
|
|
61
|
+
* Summarize a folder from its file summaries.
|
|
62
|
+
*/
|
|
63
|
+
summarizeFolder(fileSummaries: FileSummary[], folderPath: string, framework: string): Promise<GenerationResult<FolderSummary>>;
|
|
64
|
+
/**
|
|
65
|
+
* Generate final repository analysis.
|
|
66
|
+
*/
|
|
67
|
+
generateFinalSummary(folderSummaries: FolderSummary[], frameworkInfo: FrameworkInfo, repository: string, analyzedPath: string): Promise<GenerationResult<GitHubRepositoryAnalysis>>;
|
|
68
|
+
/**
|
|
69
|
+
* Calculate cost from token usage.
|
|
70
|
+
*/
|
|
71
|
+
calculateCost(inputTokens: number, outputTokens: number): number;
|
|
72
|
+
}
|
|
73
|
+
export {};
|
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GitHub Analysis Service
|
|
4
|
+
*
|
|
5
|
+
* AI-powered code analysis using Gemini:
|
|
6
|
+
* - File summarization
|
|
7
|
+
* - Folder summarization
|
|
8
|
+
* - Final repository analysis
|
|
9
|
+
*
|
|
10
|
+
* @see https://ai.google.dev/
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.GitHubAnalysisService = void 0;
|
|
14
|
+
const genai_1 = require("@google/genai");
|
|
15
|
+
const models_1 = require("../models");
|
|
16
|
+
const locales_1 = require("../locales");
|
|
17
|
+
/**
|
|
18
|
+
* GitHub Analysis Service using Gemini AI.
|
|
19
|
+
*/
|
|
20
|
+
class GitHubAnalysisService {
|
|
21
|
+
genai;
|
|
22
|
+
modelName;
|
|
23
|
+
translations;
|
|
24
|
+
constructor(config) {
|
|
25
|
+
this.genai = new genai_1.GoogleGenAI({
|
|
26
|
+
vertexai: true,
|
|
27
|
+
project: config.projectId,
|
|
28
|
+
location: config.region || "us-central1",
|
|
29
|
+
});
|
|
30
|
+
this.modelName = config.modelName || process.env.GEMINI_MODEL || "gemini-2.5-flash";
|
|
31
|
+
this.translations = (0, locales_1.getTranslations)(config.locale);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get language from file path.
|
|
35
|
+
*/
|
|
36
|
+
getLanguageFromPath(path) {
|
|
37
|
+
const ext = path.substring(path.lastIndexOf("."));
|
|
38
|
+
return models_1.LANGUAGE_EXTENSIONS[ext.toLowerCase()];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Summarize a single file.
|
|
42
|
+
*/
|
|
43
|
+
async summarizeFile(content, path, framework) {
|
|
44
|
+
const language = this.getLanguageFromPath(path);
|
|
45
|
+
// Truncate very long files
|
|
46
|
+
const maxLength = 50000;
|
|
47
|
+
const truncatedContent = content.length > maxLength
|
|
48
|
+
? content.substring(0, maxLength) + "\n... (truncated)"
|
|
49
|
+
: content;
|
|
50
|
+
const prompt = `You are analyzing source code for a ${framework} project.
|
|
51
|
+
|
|
52
|
+
## File Information
|
|
53
|
+
- Path: ${path}
|
|
54
|
+
- Language: ${language || "Unknown"}
|
|
55
|
+
|
|
56
|
+
## File Content
|
|
57
|
+
\`\`\`
|
|
58
|
+
${truncatedContent}
|
|
59
|
+
\`\`\`
|
|
60
|
+
|
|
61
|
+
## Instructions
|
|
62
|
+
Analyze this file and provide:
|
|
63
|
+
1. A brief summary (1-2 sentences) of what this file does
|
|
64
|
+
2. Key features or functionality it provides (if any)
|
|
65
|
+
3. Main exports (classes, functions, etc.) if applicable
|
|
66
|
+
|
|
67
|
+
${this.translations.respondInLanguage}`;
|
|
68
|
+
try {
|
|
69
|
+
const response = await this.genai.models.generateContent({
|
|
70
|
+
model: this.modelName,
|
|
71
|
+
contents: prompt,
|
|
72
|
+
config: {
|
|
73
|
+
responseMimeType: "application/json",
|
|
74
|
+
responseSchema: {
|
|
75
|
+
type: genai_1.Type.OBJECT,
|
|
76
|
+
properties: {
|
|
77
|
+
summary: { type: genai_1.Type.STRING },
|
|
78
|
+
features: {
|
|
79
|
+
type: genai_1.Type.ARRAY,
|
|
80
|
+
items: { type: genai_1.Type.STRING },
|
|
81
|
+
},
|
|
82
|
+
exports: {
|
|
83
|
+
type: genai_1.Type.ARRAY,
|
|
84
|
+
items: { type: genai_1.Type.STRING },
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
required: ["summary"],
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
const text = response.text;
|
|
92
|
+
if (!text) {
|
|
93
|
+
throw new Error("No response from AI model");
|
|
94
|
+
}
|
|
95
|
+
const parsed = JSON.parse(text);
|
|
96
|
+
const inputTokens = response.usageMetadata?.promptTokenCount ?? 0;
|
|
97
|
+
const outputTokens = response.usageMetadata?.candidatesTokenCount ?? 0;
|
|
98
|
+
return {
|
|
99
|
+
data: {
|
|
100
|
+
path,
|
|
101
|
+
language,
|
|
102
|
+
summary: parsed.summary || "",
|
|
103
|
+
features: parsed.features || [],
|
|
104
|
+
exports: parsed.exports || [],
|
|
105
|
+
analyzedAt: new Date(),
|
|
106
|
+
},
|
|
107
|
+
inputTokens,
|
|
108
|
+
outputTokens,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
console.error(`Failed to summarize file ${path}:`, err.message);
|
|
113
|
+
return {
|
|
114
|
+
data: {
|
|
115
|
+
path,
|
|
116
|
+
language,
|
|
117
|
+
summary: `Error analyzing file: ${err.message}`,
|
|
118
|
+
analyzedAt: new Date(),
|
|
119
|
+
},
|
|
120
|
+
inputTokens: 0,
|
|
121
|
+
outputTokens: 0,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Analyze all files in a folder in a single AI call.
|
|
127
|
+
* Returns both individual file summaries and folder summary.
|
|
128
|
+
*/
|
|
129
|
+
async analyzeFolderBatch(files, folderPath, framework) {
|
|
130
|
+
if (files.length === 0) {
|
|
131
|
+
return {
|
|
132
|
+
data: {
|
|
133
|
+
files: [],
|
|
134
|
+
folder: {
|
|
135
|
+
path: folderPath,
|
|
136
|
+
summary: "Empty folder",
|
|
137
|
+
features: [],
|
|
138
|
+
fileCount: 0,
|
|
139
|
+
analyzedAt: new Date(),
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
inputTokens: 0,
|
|
143
|
+
outputTokens: 0,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// Build file contents section
|
|
147
|
+
const fileContentsSection = files.map(f => {
|
|
148
|
+
const language = this.getLanguageFromPath(f.path);
|
|
149
|
+
// Truncate very long files
|
|
150
|
+
const maxLength = 30000; // Reduced for batch processing
|
|
151
|
+
const truncatedContent = f.content.length > maxLength
|
|
152
|
+
? f.content.substring(0, maxLength) + "\n... (truncated)"
|
|
153
|
+
: f.content;
|
|
154
|
+
return `---
|
|
155
|
+
### File: ${f.path}
|
|
156
|
+
Language: ${language || "Unknown"}
|
|
157
|
+
\`\`\`${language?.toLowerCase() || ""}
|
|
158
|
+
${truncatedContent}
|
|
159
|
+
\`\`\``;
|
|
160
|
+
}).join("\n\n");
|
|
161
|
+
const prompt = `You are analyzing a folder in a ${framework} project.
|
|
162
|
+
|
|
163
|
+
## Folder: ${folderPath || "(root)"}
|
|
164
|
+
|
|
165
|
+
## Files in this folder (${files.length} files):
|
|
166
|
+
|
|
167
|
+
${fileContentsSection}
|
|
168
|
+
|
|
169
|
+
## Instructions
|
|
170
|
+
For each file above, provide:
|
|
171
|
+
1. A brief summary (1-2 sentences) of what the file does
|
|
172
|
+
2. Key features or functionality it provides
|
|
173
|
+
|
|
174
|
+
Then, provide an overall folder summary:
|
|
175
|
+
1. A brief summary (2-3 sentences) of what this folder/module does
|
|
176
|
+
2. Key features the folder provides as a whole
|
|
177
|
+
|
|
178
|
+
${this.translations.respondInLanguage}`;
|
|
179
|
+
try {
|
|
180
|
+
const response = await this.genai.models.generateContent({
|
|
181
|
+
model: this.modelName,
|
|
182
|
+
contents: prompt,
|
|
183
|
+
config: {
|
|
184
|
+
responseMimeType: "application/json",
|
|
185
|
+
responseSchema: {
|
|
186
|
+
type: genai_1.Type.OBJECT,
|
|
187
|
+
properties: {
|
|
188
|
+
files: {
|
|
189
|
+
type: genai_1.Type.ARRAY,
|
|
190
|
+
items: {
|
|
191
|
+
type: genai_1.Type.OBJECT,
|
|
192
|
+
properties: {
|
|
193
|
+
path: { type: genai_1.Type.STRING },
|
|
194
|
+
summary: { type: genai_1.Type.STRING },
|
|
195
|
+
features: {
|
|
196
|
+
type: genai_1.Type.ARRAY,
|
|
197
|
+
items: { type: genai_1.Type.STRING },
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
required: ["path", "summary"],
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
folder: {
|
|
204
|
+
type: genai_1.Type.OBJECT,
|
|
205
|
+
properties: {
|
|
206
|
+
summary: { type: genai_1.Type.STRING },
|
|
207
|
+
features: {
|
|
208
|
+
type: genai_1.Type.ARRAY,
|
|
209
|
+
items: { type: genai_1.Type.STRING },
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
required: ["summary", "features"],
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
required: ["files", "folder"],
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
const text = response.text;
|
|
220
|
+
if (!text) {
|
|
221
|
+
throw new Error("No response from AI model");
|
|
222
|
+
}
|
|
223
|
+
const parsed = JSON.parse(text);
|
|
224
|
+
const inputTokens = response.usageMetadata?.promptTokenCount ?? 0;
|
|
225
|
+
const outputTokens = response.usageMetadata?.candidatesTokenCount ?? 0;
|
|
226
|
+
// Map file results
|
|
227
|
+
const fileSummaries = files.map(f => {
|
|
228
|
+
const fileResult = (parsed.files || []).find((pf) => pf.path === f.path);
|
|
229
|
+
return {
|
|
230
|
+
path: f.path,
|
|
231
|
+
language: this.getLanguageFromPath(f.path),
|
|
232
|
+
summary: fileResult?.summary || "Analysis not available",
|
|
233
|
+
features: fileResult?.features || [],
|
|
234
|
+
analyzedAt: new Date(),
|
|
235
|
+
};
|
|
236
|
+
});
|
|
237
|
+
return {
|
|
238
|
+
data: {
|
|
239
|
+
files: fileSummaries,
|
|
240
|
+
folder: {
|
|
241
|
+
path: folderPath,
|
|
242
|
+
summary: parsed.folder?.summary || "",
|
|
243
|
+
features: parsed.folder?.features || [],
|
|
244
|
+
fileCount: files.length,
|
|
245
|
+
analyzedAt: new Date(),
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
inputTokens,
|
|
249
|
+
outputTokens,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
console.error(`Failed to analyze folder batch ${folderPath}:`, err.message);
|
|
254
|
+
// Return error results for all files
|
|
255
|
+
const fileSummaries = files.map(f => ({
|
|
256
|
+
path: f.path,
|
|
257
|
+
language: this.getLanguageFromPath(f.path),
|
|
258
|
+
summary: `Error analyzing file: ${err.message}`,
|
|
259
|
+
analyzedAt: new Date(),
|
|
260
|
+
}));
|
|
261
|
+
return {
|
|
262
|
+
data: {
|
|
263
|
+
files: fileSummaries,
|
|
264
|
+
folder: {
|
|
265
|
+
path: folderPath,
|
|
266
|
+
summary: `Error analyzing folder: ${err.message}`,
|
|
267
|
+
features: [],
|
|
268
|
+
fileCount: files.length,
|
|
269
|
+
analyzedAt: new Date(),
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
inputTokens: 0,
|
|
273
|
+
outputTokens: 0,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Summarize a folder from its file summaries.
|
|
279
|
+
*/
|
|
280
|
+
async summarizeFolder(fileSummaries, folderPath, framework) {
|
|
281
|
+
const summariesText = fileSummaries
|
|
282
|
+
.map(f => `- ${f.path}: ${f.summary}`)
|
|
283
|
+
.join("\n");
|
|
284
|
+
const featuresText = fileSummaries
|
|
285
|
+
.flatMap(f => f.features || [])
|
|
286
|
+
.filter((v, i, a) => a.indexOf(v) === i)
|
|
287
|
+
.join(", ");
|
|
288
|
+
const prompt = `You are analyzing a folder in a ${framework} project.
|
|
289
|
+
|
|
290
|
+
## Folder Information
|
|
291
|
+
- Path: ${folderPath || "(root)"}
|
|
292
|
+
- Files: ${fileSummaries.length}
|
|
293
|
+
|
|
294
|
+
## File Summaries
|
|
295
|
+
${summariesText}
|
|
296
|
+
|
|
297
|
+
## Features Found
|
|
298
|
+
${featuresText || "None identified"}
|
|
299
|
+
|
|
300
|
+
## Instructions
|
|
301
|
+
Based on the file summaries above, provide:
|
|
302
|
+
1. A brief summary (2-3 sentences) of what this folder/module does
|
|
303
|
+
2. Key features or functionality this folder provides
|
|
304
|
+
|
|
305
|
+
${this.translations.respondInLanguage}`;
|
|
306
|
+
try {
|
|
307
|
+
const response = await this.genai.models.generateContent({
|
|
308
|
+
model: this.modelName,
|
|
309
|
+
contents: prompt,
|
|
310
|
+
config: {
|
|
311
|
+
responseMimeType: "application/json",
|
|
312
|
+
responseSchema: {
|
|
313
|
+
type: genai_1.Type.OBJECT,
|
|
314
|
+
properties: {
|
|
315
|
+
summary: { type: genai_1.Type.STRING },
|
|
316
|
+
features: {
|
|
317
|
+
type: genai_1.Type.ARRAY,
|
|
318
|
+
items: { type: genai_1.Type.STRING },
|
|
319
|
+
},
|
|
320
|
+
},
|
|
321
|
+
required: ["summary", "features"],
|
|
322
|
+
},
|
|
323
|
+
},
|
|
324
|
+
});
|
|
325
|
+
const text = response.text;
|
|
326
|
+
if (!text) {
|
|
327
|
+
throw new Error("No response from AI model");
|
|
328
|
+
}
|
|
329
|
+
const parsed = JSON.parse(text);
|
|
330
|
+
const inputTokens = response.usageMetadata?.promptTokenCount ?? 0;
|
|
331
|
+
const outputTokens = response.usageMetadata?.candidatesTokenCount ?? 0;
|
|
332
|
+
return {
|
|
333
|
+
data: {
|
|
334
|
+
path: folderPath,
|
|
335
|
+
summary: parsed.summary || "",
|
|
336
|
+
features: parsed.features || [],
|
|
337
|
+
fileCount: fileSummaries.length,
|
|
338
|
+
analyzedAt: new Date(),
|
|
339
|
+
},
|
|
340
|
+
inputTokens,
|
|
341
|
+
outputTokens,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
catch (err) {
|
|
345
|
+
console.error(`Failed to summarize folder ${folderPath}:`, err.message);
|
|
346
|
+
return {
|
|
347
|
+
data: {
|
|
348
|
+
path: folderPath,
|
|
349
|
+
summary: `Error analyzing folder: ${err.message}`,
|
|
350
|
+
features: [],
|
|
351
|
+
fileCount: fileSummaries.length,
|
|
352
|
+
analyzedAt: new Date(),
|
|
353
|
+
},
|
|
354
|
+
inputTokens: 0,
|
|
355
|
+
outputTokens: 0,
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Generate final repository analysis.
|
|
361
|
+
*/
|
|
362
|
+
async generateFinalSummary(folderSummaries, frameworkInfo, repository, analyzedPath) {
|
|
363
|
+
const summariesText = folderSummaries
|
|
364
|
+
.map(f => `## ${f.path || "(root)"}\n${f.summary}\nFeatures: ${f.features.join(", ") || "None"}`)
|
|
365
|
+
.join("\n\n");
|
|
366
|
+
const prompt = `You are creating a comprehensive analysis of a software repository.
|
|
367
|
+
|
|
368
|
+
## Repository Information
|
|
369
|
+
- Repository: ${repository}
|
|
370
|
+
- Analyzed Path: ${analyzedPath || "(root)"}
|
|
371
|
+
- Framework: ${frameworkInfo.framework}
|
|
372
|
+
- Platforms: ${frameworkInfo.platforms.join(", ")}
|
|
373
|
+
|
|
374
|
+
## Configuration File
|
|
375
|
+
${frameworkInfo.configContent ? `\`\`\`\n${frameworkInfo.configContent.substring(0, 3000)}\n\`\`\`` : "Not available"}
|
|
376
|
+
|
|
377
|
+
## Folder Summaries
|
|
378
|
+
${summariesText}
|
|
379
|
+
|
|
380
|
+
## Instructions
|
|
381
|
+
Based on all the information above, provide a comprehensive analysis including:
|
|
382
|
+
|
|
383
|
+
1. **overview**: A detailed overview (3-5 paragraphs) of what this application/service does
|
|
384
|
+
2. **features**: List of main features with descriptions and related files
|
|
385
|
+
3. **architecture**: Overview of the application architecture
|
|
386
|
+
4. **dependencies**: List of main dependencies/libraries used
|
|
387
|
+
5. **apiEndpoints**: List of API endpoints if this is a backend service (optional)
|
|
388
|
+
|
|
389
|
+
${this.translations.respondInLanguage}`;
|
|
390
|
+
try {
|
|
391
|
+
const response = await this.genai.models.generateContent({
|
|
392
|
+
model: this.modelName,
|
|
393
|
+
contents: prompt,
|
|
394
|
+
config: {
|
|
395
|
+
responseMimeType: "application/json",
|
|
396
|
+
responseSchema: {
|
|
397
|
+
type: genai_1.Type.OBJECT,
|
|
398
|
+
properties: {
|
|
399
|
+
overview: { type: genai_1.Type.STRING },
|
|
400
|
+
features: {
|
|
401
|
+
type: genai_1.Type.ARRAY,
|
|
402
|
+
items: {
|
|
403
|
+
type: genai_1.Type.OBJECT,
|
|
404
|
+
properties: {
|
|
405
|
+
name: { type: genai_1.Type.STRING },
|
|
406
|
+
description: { type: genai_1.Type.STRING },
|
|
407
|
+
relatedFiles: {
|
|
408
|
+
type: genai_1.Type.ARRAY,
|
|
409
|
+
items: { type: genai_1.Type.STRING },
|
|
410
|
+
},
|
|
411
|
+
},
|
|
412
|
+
required: ["name", "description"],
|
|
413
|
+
},
|
|
414
|
+
},
|
|
415
|
+
architecture: { type: genai_1.Type.STRING },
|
|
416
|
+
dependencies: {
|
|
417
|
+
type: genai_1.Type.ARRAY,
|
|
418
|
+
items: { type: genai_1.Type.STRING },
|
|
419
|
+
},
|
|
420
|
+
apiEndpoints: {
|
|
421
|
+
type: genai_1.Type.ARRAY,
|
|
422
|
+
items: { type: genai_1.Type.STRING },
|
|
423
|
+
},
|
|
424
|
+
},
|
|
425
|
+
required: ["overview", "features", "architecture", "dependencies"],
|
|
426
|
+
},
|
|
427
|
+
},
|
|
428
|
+
});
|
|
429
|
+
const text = response.text;
|
|
430
|
+
if (!text) {
|
|
431
|
+
throw new Error("No response from AI model");
|
|
432
|
+
}
|
|
433
|
+
const parsed = JSON.parse(text);
|
|
434
|
+
const inputTokens = response.usageMetadata?.promptTokenCount ?? 0;
|
|
435
|
+
const outputTokens = response.usageMetadata?.candidatesTokenCount ?? 0;
|
|
436
|
+
// Map features to proper structure
|
|
437
|
+
const features = (parsed.features || []).map((f) => ({
|
|
438
|
+
name: f.name || "",
|
|
439
|
+
description: f.description || "",
|
|
440
|
+
relatedFiles: f.relatedFiles || [],
|
|
441
|
+
}));
|
|
442
|
+
return {
|
|
443
|
+
data: {
|
|
444
|
+
repository,
|
|
445
|
+
analyzedPath: analyzedPath || "/",
|
|
446
|
+
framework: frameworkInfo.framework,
|
|
447
|
+
platforms: frameworkInfo.platforms,
|
|
448
|
+
overview: parsed.overview || "",
|
|
449
|
+
features,
|
|
450
|
+
architecture: parsed.architecture || "",
|
|
451
|
+
dependencies: parsed.dependencies || [],
|
|
452
|
+
apiEndpoints: parsed.apiEndpoints,
|
|
453
|
+
analyzedAt: new Date().toISOString(),
|
|
454
|
+
},
|
|
455
|
+
inputTokens,
|
|
456
|
+
outputTokens,
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
catch (err) {
|
|
460
|
+
console.error("Failed to generate final summary:", err.message);
|
|
461
|
+
return {
|
|
462
|
+
data: {
|
|
463
|
+
repository,
|
|
464
|
+
analyzedPath: analyzedPath || "/",
|
|
465
|
+
framework: frameworkInfo.framework,
|
|
466
|
+
platforms: frameworkInfo.platforms,
|
|
467
|
+
overview: `Error generating analysis: ${err.message}`,
|
|
468
|
+
features: [],
|
|
469
|
+
architecture: "",
|
|
470
|
+
dependencies: [],
|
|
471
|
+
analyzedAt: new Date().toISOString(),
|
|
472
|
+
},
|
|
473
|
+
inputTokens: 0,
|
|
474
|
+
outputTokens: 0,
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Calculate cost from token usage.
|
|
480
|
+
*/
|
|
481
|
+
calculateCost(inputTokens, outputTokens) {
|
|
482
|
+
const inputPrice = Number(process.env.MODEL_INPUT_PRICE) || 0.0000003;
|
|
483
|
+
const outputPrice = Number(process.env.MODEL_OUTPUT_PRICE) || 0.0000025;
|
|
484
|
+
return inputTokens * inputPrice + outputTokens * outputPrice;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
exports.GitHubAnalysisService = GitHubAnalysisService;
|
|
488
|
+
//# sourceMappingURL=github_analysis_service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github_analysis_service.js","sourceRoot":"","sources":["../../src/services/github_analysis_service.ts"],"names":[],"mappings":"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"}
|