@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.
Files changed (146) hide show
  1. package/CHANGELOG.md +361 -0
  2. package/LICENSE +21 -0
  3. package/README.md +70 -0
  4. package/assets/fonts/NotoSans-Bold.ttf +1439 -0
  5. package/assets/fonts/NotoSans-Regular.ttf +1439 -0
  6. package/assets/fonts/NotoSans.ttf +0 -0
  7. package/assets/fonts/NotoSansJP-Bold.ttf +0 -0
  8. package/assets/fonts/NotoSansJP-Regular.ttf +0 -0
  9. package/assets/fonts/NotoSansKR-Bold.ttf +1439 -0
  10. package/assets/fonts/NotoSansKR-Regular.ttf +1439 -0
  11. package/assets/fonts/NotoSansKR.ttf +0 -0
  12. package/assets/fonts/NotoSansSC-Bold.ttf +1439 -0
  13. package/assets/fonts/NotoSansSC-Regular.ttf +1439 -0
  14. package/assets/fonts/NotoSansSC.ttf +0 -0
  15. package/dist/clients/app_store_client.d.ts +54 -0
  16. package/dist/clients/app_store_client.js +280 -0
  17. package/dist/clients/app_store_client.js.map +1 -0
  18. package/dist/clients/firebase_analytics_client.d.ts +67 -0
  19. package/dist/clients/firebase_analytics_client.js +411 -0
  20. package/dist/clients/firebase_analytics_client.js.map +1 -0
  21. package/dist/clients/github_content_client.d.ts +83 -0
  22. package/dist/clients/github_content_client.js +443 -0
  23. package/dist/clients/github_content_client.js.map +1 -0
  24. package/dist/clients/google_play_client.d.ts +49 -0
  25. package/dist/clients/google_play_client.js +275 -0
  26. package/dist/clients/google_play_client.js.map +1 -0
  27. package/dist/functions/analyze_github_init.d.ts +37 -0
  28. package/dist/functions/analyze_github_init.js +299 -0
  29. package/dist/functions/analyze_github_init.js.map +1 -0
  30. package/dist/functions/analyze_github_process.d.ts +25 -0
  31. package/dist/functions/analyze_github_process.js +268 -0
  32. package/dist/functions/analyze_github_process.js.map +1 -0
  33. package/dist/functions/analyze_github_summary.d.ts +32 -0
  34. package/dist/functions/analyze_github_summary.js +270 -0
  35. package/dist/functions/analyze_github_summary.js.map +1 -0
  36. package/dist/functions/analyze_market_research.d.ts +40 -0
  37. package/dist/functions/analyze_market_research.js +346 -0
  38. package/dist/functions/analyze_market_research.js.map +1 -0
  39. package/dist/functions/analyze_marketing_data.d.ts +96 -0
  40. package/dist/functions/analyze_marketing_data.js +990 -0
  41. package/dist/functions/analyze_marketing_data.js.map +1 -0
  42. package/dist/functions/collect_from_app_store.d.ts +25 -0
  43. package/dist/functions/collect_from_app_store.js +148 -0
  44. package/dist/functions/collect_from_app_store.js.map +1 -0
  45. package/dist/functions/collect_from_firebase_analytics.d.ts +25 -0
  46. package/dist/functions/collect_from_firebase_analytics.js +142 -0
  47. package/dist/functions/collect_from_firebase_analytics.js.map +1 -0
  48. package/dist/functions/collect_from_google_play_console.d.ts +25 -0
  49. package/dist/functions/collect_from_google_play_console.js +142 -0
  50. package/dist/functions/collect_from_google_play_console.js.map +1 -0
  51. package/dist/functions/generate_marketing_markdown.d.ts +89 -0
  52. package/dist/functions/generate_marketing_markdown.js +653 -0
  53. package/dist/functions/generate_marketing_markdown.js.map +1 -0
  54. package/dist/functions/generate_marketing_pdf.d.ts +25 -0
  55. package/dist/functions/generate_marketing_pdf.js +175 -0
  56. package/dist/functions/generate_marketing_pdf.js.map +1 -0
  57. package/dist/functions/research_market.d.ts +56 -0
  58. package/dist/functions/research_market.js +434 -0
  59. package/dist/functions/research_market.js.map +1 -0
  60. package/dist/functions.d.ts +571 -0
  61. package/dist/functions.js +648 -0
  62. package/dist/functions.js.map +1 -0
  63. package/dist/index.d.ts +13 -0
  64. package/dist/index.js +30 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/locales/de_DE.d.ts +5 -0
  67. package/dist/locales/de_DE.js +111 -0
  68. package/dist/locales/de_DE.js.map +1 -0
  69. package/dist/locales/en.d.ts +5 -0
  70. package/dist/locales/en.js +111 -0
  71. package/dist/locales/en.js.map +1 -0
  72. package/dist/locales/es_ES.d.ts +5 -0
  73. package/dist/locales/es_ES.js +111 -0
  74. package/dist/locales/es_ES.js.map +1 -0
  75. package/dist/locales/fr_FR.d.ts +5 -0
  76. package/dist/locales/fr_FR.js +111 -0
  77. package/dist/locales/fr_FR.js.map +1 -0
  78. package/dist/locales/id_ID.d.ts +5 -0
  79. package/dist/locales/id_ID.js +111 -0
  80. package/dist/locales/id_ID.js.map +1 -0
  81. package/dist/locales/index.d.ts +59 -0
  82. package/dist/locales/index.js +155 -0
  83. package/dist/locales/index.js.map +1 -0
  84. package/dist/locales/ja.d.ts +5 -0
  85. package/dist/locales/ja.js +111 -0
  86. package/dist/locales/ja.js.map +1 -0
  87. package/dist/locales/ko_KR.d.ts +5 -0
  88. package/dist/locales/ko_KR.js +111 -0
  89. package/dist/locales/ko_KR.js.map +1 -0
  90. package/dist/locales/pt_PT.d.ts +5 -0
  91. package/dist/locales/pt_PT.js +111 -0
  92. package/dist/locales/pt_PT.js.map +1 -0
  93. package/dist/locales/ru_RU.d.ts +5 -0
  94. package/dist/locales/ru_RU.js +111 -0
  95. package/dist/locales/ru_RU.js.map +1 -0
  96. package/dist/locales/types.d.ts +105 -0
  97. package/dist/locales/types.js +8 -0
  98. package/dist/locales/types.js.map +1 -0
  99. package/dist/locales/zh_CN.d.ts +5 -0
  100. package/dist/locales/zh_CN.js +111 -0
  101. package/dist/locales/zh_CN.js.map +1 -0
  102. package/dist/models/app_store_data.d.ts +87 -0
  103. package/dist/models/app_store_data.js +8 -0
  104. package/dist/models/app_store_data.js.map +1 -0
  105. package/dist/models/chart_data.d.ts +104 -0
  106. package/dist/models/chart_data.js +8 -0
  107. package/dist/models/chart_data.js.map +1 -0
  108. package/dist/models/common.d.ts +42 -0
  109. package/dist/models/common.js +8 -0
  110. package/dist/models/common.js.map +1 -0
  111. package/dist/models/firebase_analytics_data.d.ts +134 -0
  112. package/dist/models/firebase_analytics_data.js +8 -0
  113. package/dist/models/firebase_analytics_data.js.map +1 -0
  114. package/dist/models/github_analysis_data.d.ts +266 -0
  115. package/dist/models/github_analysis_data.js +101 -0
  116. package/dist/models/github_analysis_data.js.map +1 -0
  117. package/dist/models/google_play_data.d.ts +115 -0
  118. package/dist/models/google_play_data.js +8 -0
  119. package/dist/models/google_play_data.js.map +1 -0
  120. package/dist/models/index.d.ts +14 -0
  121. package/dist/models/index.js +36 -0
  122. package/dist/models/index.js.map +1 -0
  123. package/dist/models/market_research_data.d.ts +259 -0
  124. package/dist/models/market_research_data.js +8 -0
  125. package/dist/models/market_research_data.js.map +1 -0
  126. package/dist/models/marketing_analysis_data.d.ts +200 -0
  127. package/dist/models/marketing_analysis_data.js +8 -0
  128. package/dist/models/marketing_analysis_data.js.map +1 -0
  129. package/dist/models/pdf_data.d.ts +112 -0
  130. package/dist/models/pdf_data.js +8 -0
  131. package/dist/models/pdf_data.js.map +1 -0
  132. package/dist/services/chart_service.d.ts +54 -0
  133. package/dist/services/chart_service.js +436 -0
  134. package/dist/services/chart_service.js.map +1 -0
  135. package/dist/services/github_analysis_service.d.ts +73 -0
  136. package/dist/services/github_analysis_service.js +488 -0
  137. package/dist/services/github_analysis_service.js.map +1 -0
  138. package/dist/services/pdf_service.d.ts +112 -0
  139. package/dist/services/pdf_service.js +1397 -0
  140. package/dist/services/pdf_service.js.map +1 -0
  141. package/dist/utils/github_analysis_storage.d.ts +88 -0
  142. package/dist/utils/github_analysis_storage.js +154 -0
  143. package/dist/utils/github_analysis_storage.js.map +1 -0
  144. package/package.json +64 -0
  145. package/scripts/cleanup_test_data.ts +304 -0
  146. 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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"}