@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,268 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GitHub Analysis Process Function
|
|
4
|
+
*
|
|
5
|
+
* Processes a folder batch:
|
|
6
|
+
* 1. Reads all files in the folder from GitHub
|
|
7
|
+
* 2. Generates AI summaries for all files + folder in one call
|
|
8
|
+
* 3. Caches summaries in Storage JSON
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
exports.AnalyzeGitHubProcess = void 0;
|
|
45
|
+
const masamune_firebase_workflow_1 = require("@mathrunet/masamune_firebase_workflow");
|
|
46
|
+
const admin = __importStar(require("firebase-admin"));
|
|
47
|
+
const github_content_client_1 = require("../clients/github_content_client");
|
|
48
|
+
const github_analysis_service_1 = require("../services/github_analysis_service");
|
|
49
|
+
const github_analysis_storage_1 = require("../utils/github_analysis_storage");
|
|
50
|
+
require("@mathrunet/masamune");
|
|
51
|
+
/**
|
|
52
|
+
* A function for processing a batch of GitHub files.
|
|
53
|
+
*
|
|
54
|
+
* GitHubファイルのバッチを処理するためのFunction。
|
|
55
|
+
*/
|
|
56
|
+
class AnalyzeGitHubProcess extends masamune_firebase_workflow_1.WorkflowProcessFunctionBase {
|
|
57
|
+
/**
|
|
58
|
+
* The ID of the function.
|
|
59
|
+
*/
|
|
60
|
+
id = "analyze_github_process";
|
|
61
|
+
/**
|
|
62
|
+
* Process the batch.
|
|
63
|
+
*/
|
|
64
|
+
async process(context) {
|
|
65
|
+
const action = context.action;
|
|
66
|
+
const command = action.command;
|
|
67
|
+
const githubRepository = command.data?.githubRepository;
|
|
68
|
+
const batchIndex = command.data?.batchIndex;
|
|
69
|
+
if (!githubRepository) {
|
|
70
|
+
console.error("AnalyzeGitHubProcess: No githubRepository specified");
|
|
71
|
+
return {
|
|
72
|
+
...action,
|
|
73
|
+
results: {
|
|
74
|
+
githubAnalysisProcess: {
|
|
75
|
+
error: "No githubRepository specified",
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
if (batchIndex === undefined) {
|
|
81
|
+
console.error("AnalyzeGitHubProcess: No batchIndex specified");
|
|
82
|
+
return {
|
|
83
|
+
...action,
|
|
84
|
+
results: {
|
|
85
|
+
githubAnalysisProcess: {
|
|
86
|
+
error: "No batchIndex specified",
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
// Get project reference for GitHub token
|
|
92
|
+
const projectRef = action.project;
|
|
93
|
+
if (!projectRef) {
|
|
94
|
+
console.error("AnalyzeGitHubProcess: No project reference");
|
|
95
|
+
return {
|
|
96
|
+
...action,
|
|
97
|
+
results: {
|
|
98
|
+
githubAnalysisProcess: {
|
|
99
|
+
error: "No project reference",
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
// Auto-initialize Firebase Admin if needed
|
|
105
|
+
if (admin.apps.length === 0) {
|
|
106
|
+
admin.initializeApp();
|
|
107
|
+
}
|
|
108
|
+
const projectId = projectRef.id;
|
|
109
|
+
try {
|
|
110
|
+
// 1. Load analysis data from Storage
|
|
111
|
+
const analysisData = await (0, github_analysis_storage_1.readAnalysisData)(projectId);
|
|
112
|
+
if (!analysisData) {
|
|
113
|
+
throw new Error("Analysis data not found. Run init first.");
|
|
114
|
+
}
|
|
115
|
+
const state = analysisData.state;
|
|
116
|
+
// 2. Get folder batch for this index
|
|
117
|
+
const folderBatches = state.folderBatches || [];
|
|
118
|
+
if (batchIndex >= folderBatches.length) {
|
|
119
|
+
console.warn(`AnalyzeGitHubProcess: Batch ${batchIndex} out of range (${folderBatches.length} batches)`);
|
|
120
|
+
return {
|
|
121
|
+
...action,
|
|
122
|
+
results: {
|
|
123
|
+
githubAnalysisProcess: {
|
|
124
|
+
batchIndex: batchIndex,
|
|
125
|
+
filesProcessed: 0,
|
|
126
|
+
skipped: true,
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
const folderBatch = folderBatches[batchIndex];
|
|
132
|
+
const folderPath = folderBatch.folderPath;
|
|
133
|
+
const filesToProcess = folderBatch.files;
|
|
134
|
+
console.log(`AnalyzeGitHubProcess: Processing folder "${folderPath || "(root)"}" with ${filesToProcess.length} files`);
|
|
135
|
+
// 3. Check if already processed
|
|
136
|
+
const folderKey = folderPath || "_root";
|
|
137
|
+
if (analysisData.folders[folderKey]) {
|
|
138
|
+
console.log(`AnalyzeGitHubProcess: Folder ${folderPath} already processed, skipping`);
|
|
139
|
+
return {
|
|
140
|
+
...action,
|
|
141
|
+
results: {
|
|
142
|
+
githubAnalysisProcess: {
|
|
143
|
+
batchIndex: batchIndex,
|
|
144
|
+
folderPath: folderPath,
|
|
145
|
+
filesProcessed: 0,
|
|
146
|
+
skipped: true,
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
// 4. Get GitHub token and locale from project
|
|
152
|
+
const projectDoc = await projectRef.load();
|
|
153
|
+
const projectData = projectDoc?.data();
|
|
154
|
+
const githubToken = projectData?.githubPersonalAccessToken;
|
|
155
|
+
const projectLocale = projectData?.locale;
|
|
156
|
+
// Extract locale string
|
|
157
|
+
const locale = typeof projectLocale === "object" && projectLocale
|
|
158
|
+
? projectLocale["@language"]
|
|
159
|
+
: projectLocale;
|
|
160
|
+
if (!githubToken) {
|
|
161
|
+
throw new Error("No GitHub token in project");
|
|
162
|
+
}
|
|
163
|
+
// 5. Initialize clients
|
|
164
|
+
const githubClient = new github_content_client_1.GitHubContentClient({
|
|
165
|
+
token: githubToken,
|
|
166
|
+
repo: githubRepository,
|
|
167
|
+
});
|
|
168
|
+
const gcpProjectId = process.env.GCLOUD_PROJECT || process.env.GOOGLE_CLOUD_PROJECT;
|
|
169
|
+
if (!gcpProjectId) {
|
|
170
|
+
throw new Error("No GCP project ID found");
|
|
171
|
+
}
|
|
172
|
+
const analysisService = new github_analysis_service_1.GitHubAnalysisService({
|
|
173
|
+
projectId: gcpProjectId,
|
|
174
|
+
locale: locale,
|
|
175
|
+
});
|
|
176
|
+
// 6. Load all file contents in parallel
|
|
177
|
+
console.log(`AnalyzeGitHubProcess: Loading ${filesToProcess.length} files...`);
|
|
178
|
+
const fileContents = [];
|
|
179
|
+
await Promise.all(filesToProcess.map(async (filePath) => {
|
|
180
|
+
try {
|
|
181
|
+
const content = await githubClient.getFileContent(filePath);
|
|
182
|
+
fileContents.push({ path: filePath, content });
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
console.warn(`AnalyzeGitHubProcess: Failed to read ${filePath}: ${err.message}`);
|
|
186
|
+
// Save error entry
|
|
187
|
+
analysisData.files[filePath] = {
|
|
188
|
+
path: filePath,
|
|
189
|
+
summary: `Error reading file: ${err.message}`,
|
|
190
|
+
analyzedAt: new Date().toISOString(),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
}));
|
|
194
|
+
console.log(`AnalyzeGitHubProcess: Loaded ${fileContents.length}/${filesToProcess.length} files`);
|
|
195
|
+
// 7. Analyze folder batch with single AI call
|
|
196
|
+
let totalInputTokens = 0;
|
|
197
|
+
let totalOutputTokens = 0;
|
|
198
|
+
if (fileContents.length > 0) {
|
|
199
|
+
console.log(`AnalyzeGitHubProcess: Analyzing folder "${folderPath || "(root)"}" with AI...`);
|
|
200
|
+
const result = await analysisService.analyzeFolderBatch(fileContents, folderPath, state.framework?.framework || "unknown");
|
|
201
|
+
totalInputTokens = result.inputTokens;
|
|
202
|
+
totalOutputTokens = result.outputTokens;
|
|
203
|
+
// 8. Save file summaries to memory
|
|
204
|
+
for (const fileSummary of result.data.files) {
|
|
205
|
+
const cacheEntry = {
|
|
206
|
+
path: fileSummary.path,
|
|
207
|
+
language: fileSummary.language,
|
|
208
|
+
summary: fileSummary.summary,
|
|
209
|
+
features: fileSummary.features,
|
|
210
|
+
analyzedAt: fileSummary.analyzedAt.toISOString(),
|
|
211
|
+
};
|
|
212
|
+
analysisData.files[fileSummary.path] = cacheEntry;
|
|
213
|
+
}
|
|
214
|
+
// 9. Save folder summary to memory
|
|
215
|
+
analysisData.folders[folderKey] = {
|
|
216
|
+
path: folderPath,
|
|
217
|
+
summary: result.data.folder.summary,
|
|
218
|
+
features: result.data.folder.features,
|
|
219
|
+
fileCount: result.data.folder.fileCount,
|
|
220
|
+
analyzedAt: result.data.folder.analyzedAt.toISOString(),
|
|
221
|
+
};
|
|
222
|
+
console.log(`AnalyzeGitHubProcess: Folder "${folderPath || "(root)"}" analyzed successfully`);
|
|
223
|
+
}
|
|
224
|
+
// 10. Update state
|
|
225
|
+
const newProcessedCount = state.processedFiles + filesToProcess.length;
|
|
226
|
+
analysisData.state.processedFiles = newProcessedCount;
|
|
227
|
+
analysisData.state.currentBatchIndex = batchIndex + 1;
|
|
228
|
+
// 11. Save updated data to Storage
|
|
229
|
+
await (0, github_analysis_storage_1.writeAnalysisData)(projectId, analysisData);
|
|
230
|
+
// 12. Calculate cost
|
|
231
|
+
const cost = analysisService.calculateCost(totalInputTokens, totalOutputTokens);
|
|
232
|
+
// 13. Return results
|
|
233
|
+
return {
|
|
234
|
+
...action,
|
|
235
|
+
usage: (action.usage ?? 0) + cost,
|
|
236
|
+
results: {
|
|
237
|
+
githubAnalysisProcess: {
|
|
238
|
+
batchIndex: batchIndex,
|
|
239
|
+
folderPath: folderPath,
|
|
240
|
+
filesProcessed: filesToProcess.length,
|
|
241
|
+
filesAnalyzed: fileContents.length,
|
|
242
|
+
totalProcessed: newProcessedCount,
|
|
243
|
+
totalFiles: state.totalFiles,
|
|
244
|
+
inputTokens: totalInputTokens,
|
|
245
|
+
outputTokens: totalOutputTokens,
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
console.error("AnalyzeGitHubProcess: Failed to process batch", error);
|
|
252
|
+
return {
|
|
253
|
+
...action,
|
|
254
|
+
results: {
|
|
255
|
+
githubAnalysisProcess: {
|
|
256
|
+
error: error.message,
|
|
257
|
+
batchIndex: batchIndex,
|
|
258
|
+
},
|
|
259
|
+
},
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
exports.AnalyzeGitHubProcess = AnalyzeGitHubProcess;
|
|
265
|
+
module.exports = (regions, options, data) => new AnalyzeGitHubProcess(options).build(regions);
|
|
266
|
+
// Export class for testing
|
|
267
|
+
module.exports.AnalyzeGitHubProcess = AnalyzeGitHubProcess;
|
|
268
|
+
//# sourceMappingURL=analyze_github_process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze_github_process.js","sourceRoot":"","sources":["../../src/functions/analyze_github_process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Analysis Summary Function
|
|
3
|
+
*
|
|
4
|
+
* Generates final repository analysis:
|
|
5
|
+
* 1. Loads all folder summaries from Storage JSON
|
|
6
|
+
* 2. Generates comprehensive analysis using AI
|
|
7
|
+
* 3. Returns final JSON to action.results.githubRepository
|
|
8
|
+
*/
|
|
9
|
+
import { Action, WorkflowProcessFunctionBase, WorkflowContext } from "@mathrunet/masamune_firebase_workflow";
|
|
10
|
+
/**
|
|
11
|
+
* A function for generating final GitHub repository analysis.
|
|
12
|
+
*
|
|
13
|
+
* GitHub リポジトリの最終解析を生成するためのFunction。
|
|
14
|
+
*/
|
|
15
|
+
export declare class AnalyzeGitHubSummary extends WorkflowProcessFunctionBase {
|
|
16
|
+
/**
|
|
17
|
+
* The ID of the function.
|
|
18
|
+
*/
|
|
19
|
+
id: string;
|
|
20
|
+
/**
|
|
21
|
+
* Process the summary generation.
|
|
22
|
+
*/
|
|
23
|
+
process(context: WorkflowContext): Promise<Action>;
|
|
24
|
+
/**
|
|
25
|
+
* Get or create root-level summary for files not in any folder.
|
|
26
|
+
*/
|
|
27
|
+
private getOrCreateRootSummary;
|
|
28
|
+
/**
|
|
29
|
+
* Generate search text for vector embedding.
|
|
30
|
+
*/
|
|
31
|
+
private generateSearchText;
|
|
32
|
+
}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GitHub Analysis Summary Function
|
|
4
|
+
*
|
|
5
|
+
* Generates final repository analysis:
|
|
6
|
+
* 1. Loads all folder summaries from Storage JSON
|
|
7
|
+
* 2. Generates comprehensive analysis using AI
|
|
8
|
+
* 3. Returns final JSON to action.results.githubRepository
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
exports.AnalyzeGitHubSummary = void 0;
|
|
45
|
+
const masamune_firebase_workflow_1 = require("@mathrunet/masamune_firebase_workflow");
|
|
46
|
+
const admin = __importStar(require("firebase-admin"));
|
|
47
|
+
const github_analysis_service_1 = require("../services/github_analysis_service");
|
|
48
|
+
const github_analysis_storage_1 = require("../utils/github_analysis_storage");
|
|
49
|
+
/**
|
|
50
|
+
* A function for generating final GitHub repository analysis.
|
|
51
|
+
*
|
|
52
|
+
* GitHub リポジトリの最終解析を生成するためのFunction。
|
|
53
|
+
*/
|
|
54
|
+
class AnalyzeGitHubSummary extends masamune_firebase_workflow_1.WorkflowProcessFunctionBase {
|
|
55
|
+
/**
|
|
56
|
+
* The ID of the function.
|
|
57
|
+
*/
|
|
58
|
+
id = "analyze_github_summary";
|
|
59
|
+
/**
|
|
60
|
+
* Process the summary generation.
|
|
61
|
+
*/
|
|
62
|
+
async process(context) {
|
|
63
|
+
const action = context.action;
|
|
64
|
+
const command = action.command;
|
|
65
|
+
const githubRepository = command.data?.githubRepository;
|
|
66
|
+
const githubRepositoryPath = command.data?.githubRepositoryPath || "";
|
|
67
|
+
if (!githubRepository) {
|
|
68
|
+
console.error("AnalyzeGitHubSummary: No githubRepository specified");
|
|
69
|
+
return {
|
|
70
|
+
...action,
|
|
71
|
+
results: {
|
|
72
|
+
githubRepository: {
|
|
73
|
+
error: "No githubRepository specified",
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// Get project reference
|
|
79
|
+
const projectRef = action.project;
|
|
80
|
+
if (!projectRef) {
|
|
81
|
+
console.error("AnalyzeGitHubSummary: No project reference");
|
|
82
|
+
return {
|
|
83
|
+
...action,
|
|
84
|
+
results: {
|
|
85
|
+
githubRepository: {
|
|
86
|
+
error: "No project reference",
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
// Auto-initialize Firebase Admin if needed
|
|
92
|
+
if (admin.apps.length === 0) {
|
|
93
|
+
admin.initializeApp();
|
|
94
|
+
}
|
|
95
|
+
const projectId = projectRef.id;
|
|
96
|
+
try {
|
|
97
|
+
// 1. Load analysis data from Storage
|
|
98
|
+
const analysisData = await (0, github_analysis_storage_1.readAnalysisData)(projectId);
|
|
99
|
+
if (!analysisData) {
|
|
100
|
+
throw new Error("Analysis data not found");
|
|
101
|
+
}
|
|
102
|
+
const state = analysisData.state;
|
|
103
|
+
// 2. Get locale from project
|
|
104
|
+
const projectDoc = await projectRef.load();
|
|
105
|
+
const projectData = projectDoc?.data();
|
|
106
|
+
const projectLocale = projectData?.locale;
|
|
107
|
+
// Extract locale string
|
|
108
|
+
const locale = typeof projectLocale === "object" && projectLocale
|
|
109
|
+
? projectLocale["@language"]
|
|
110
|
+
: projectLocale;
|
|
111
|
+
// 3. Initialize analysis service
|
|
112
|
+
const gcpProjectId = process.env.GCLOUD_PROJECT || process.env.GOOGLE_CLOUD_PROJECT;
|
|
113
|
+
if (!gcpProjectId) {
|
|
114
|
+
throw new Error("No GCP project ID found");
|
|
115
|
+
}
|
|
116
|
+
const analysisService = new github_analysis_service_1.GitHubAnalysisService({
|
|
117
|
+
projectId: gcpProjectId,
|
|
118
|
+
locale: locale,
|
|
119
|
+
});
|
|
120
|
+
// 4. Load all folder summaries from memory
|
|
121
|
+
console.log("AnalyzeGitHubSummary: Loading folder summaries...");
|
|
122
|
+
const folderSummaries = [];
|
|
123
|
+
// First, ensure root-level summary exists
|
|
124
|
+
const rootFiles = state.filePaths.filter((fp) => !fp.includes("/"));
|
|
125
|
+
if (rootFiles.length > 0) {
|
|
126
|
+
const rootSummary = await this.getOrCreateRootSummary(analysisData, analysisService);
|
|
127
|
+
if (rootSummary) {
|
|
128
|
+
folderSummaries.push(rootSummary);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Load folder summaries from memory
|
|
132
|
+
for (const folderPath of state.folderPaths) {
|
|
133
|
+
const folderKey = folderPath || "_root";
|
|
134
|
+
const cached = analysisData.folders[folderKey];
|
|
135
|
+
if (cached) {
|
|
136
|
+
folderSummaries.push({
|
|
137
|
+
path: cached.path,
|
|
138
|
+
summary: cached.summary,
|
|
139
|
+
features: cached.features,
|
|
140
|
+
fileCount: cached.fileCount,
|
|
141
|
+
analyzedAt: new Date(cached.analyzedAt),
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
console.log(`AnalyzeGitHubSummary: Loaded ${folderSummaries.length} folder summaries`);
|
|
146
|
+
// 5. Generate final analysis
|
|
147
|
+
console.log("AnalyzeGitHubSummary: Generating final analysis...");
|
|
148
|
+
const frameworkInfo = state.framework || {
|
|
149
|
+
framework: "unknown",
|
|
150
|
+
platforms: [],
|
|
151
|
+
};
|
|
152
|
+
const result = await analysisService.generateFinalSummary(folderSummaries, frameworkInfo, githubRepository, githubRepositoryPath);
|
|
153
|
+
// 6. Update state to completed and save
|
|
154
|
+
analysisData.state.phase = "completed";
|
|
155
|
+
await (0, github_analysis_storage_1.writeAnalysisData)(projectId, analysisData);
|
|
156
|
+
// 7. Calculate cost
|
|
157
|
+
const cost = analysisService.calculateCost(result.inputTokens, result.outputTokens);
|
|
158
|
+
// 8. Return final analysis
|
|
159
|
+
console.log("AnalyzeGitHubSummary: Analysis complete");
|
|
160
|
+
return {
|
|
161
|
+
...action,
|
|
162
|
+
usage: (action.usage ?? 0) + cost,
|
|
163
|
+
results: {
|
|
164
|
+
githubRepository: result.data,
|
|
165
|
+
},
|
|
166
|
+
// Generate search text for vector embedding
|
|
167
|
+
search: this.generateSearchText(result.data),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
console.error("AnalyzeGitHubSummary: Failed to generate summary", error);
|
|
172
|
+
// Update state to failed
|
|
173
|
+
try {
|
|
174
|
+
const analysisData = await (0, github_analysis_storage_1.readAnalysisData)(projectId);
|
|
175
|
+
if (analysisData) {
|
|
176
|
+
analysisData.state.phase = "failed";
|
|
177
|
+
analysisData.state.error = error.message;
|
|
178
|
+
await (0, github_analysis_storage_1.writeAnalysisData)(projectId, analysisData);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
// Ignore
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
...action,
|
|
186
|
+
results: {
|
|
187
|
+
githubRepository: {
|
|
188
|
+
error: error.message,
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get or create root-level summary for files not in any folder.
|
|
196
|
+
*/
|
|
197
|
+
async getOrCreateRootSummary(analysisData, analysisService) {
|
|
198
|
+
const state = analysisData.state;
|
|
199
|
+
// Check if root summary already exists
|
|
200
|
+
if (analysisData.folders["_root"]) {
|
|
201
|
+
const cached = analysisData.folders["_root"];
|
|
202
|
+
return {
|
|
203
|
+
path: "",
|
|
204
|
+
summary: cached.summary,
|
|
205
|
+
features: cached.features,
|
|
206
|
+
fileCount: cached.fileCount,
|
|
207
|
+
analyzedAt: new Date(cached.analyzedAt),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
// Get root-level file summaries
|
|
211
|
+
const rootFiles = state.filePaths.filter((fp) => !fp.includes("/"));
|
|
212
|
+
if (rootFiles.length === 0) {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
const fileSummaries = [];
|
|
216
|
+
for (const filePath of rootFiles) {
|
|
217
|
+
const cached = analysisData.files[filePath];
|
|
218
|
+
if (cached) {
|
|
219
|
+
fileSummaries.push({
|
|
220
|
+
path: cached.path,
|
|
221
|
+
summary: cached.summary,
|
|
222
|
+
features: cached.features,
|
|
223
|
+
analyzedAt: new Date(cached.analyzedAt),
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Generate root summary
|
|
228
|
+
const result = await analysisService.summarizeFolder(fileSummaries, "", state.framework?.framework || "unknown");
|
|
229
|
+
// Save to memory
|
|
230
|
+
analysisData.folders["_root"] = {
|
|
231
|
+
path: "",
|
|
232
|
+
summary: result.data.summary,
|
|
233
|
+
features: result.data.features,
|
|
234
|
+
fileCount: result.data.fileCount,
|
|
235
|
+
analyzedAt: result.data.analyzedAt.toISOString(),
|
|
236
|
+
};
|
|
237
|
+
return result.data;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Generate search text for vector embedding.
|
|
241
|
+
*/
|
|
242
|
+
generateSearchText(analysis) {
|
|
243
|
+
const parts = [];
|
|
244
|
+
if (analysis.repository) {
|
|
245
|
+
parts.push(`Repository: ${analysis.repository}`);
|
|
246
|
+
}
|
|
247
|
+
if (analysis.framework) {
|
|
248
|
+
parts.push(`Framework: ${analysis.framework}`);
|
|
249
|
+
}
|
|
250
|
+
if (analysis.platforms?.length) {
|
|
251
|
+
parts.push(`Platforms: ${analysis.platforms.join(", ")}`);
|
|
252
|
+
}
|
|
253
|
+
if (analysis.overview) {
|
|
254
|
+
parts.push(`Overview: ${analysis.overview}`);
|
|
255
|
+
}
|
|
256
|
+
if (analysis.architecture) {
|
|
257
|
+
parts.push(`Architecture: ${analysis.architecture}`);
|
|
258
|
+
}
|
|
259
|
+
if (analysis.features?.length) {
|
|
260
|
+
const featureNames = analysis.features.map((f) => f.name).join(", ");
|
|
261
|
+
parts.push(`Features: ${featureNames}`);
|
|
262
|
+
}
|
|
263
|
+
return parts.join("\n");
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
exports.AnalyzeGitHubSummary = AnalyzeGitHubSummary;
|
|
267
|
+
module.exports = (regions, options, _data) => new AnalyzeGitHubSummary(options).build(regions);
|
|
268
|
+
// Export class for testing
|
|
269
|
+
module.exports.AnalyzeGitHubSummary = AnalyzeGitHubSummary;
|
|
270
|
+
//# sourceMappingURL=analyze_github_summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze_github_summary.js","sourceRoot":"","sources":["../../src/functions/analyze_github_summary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Action, WorkflowProcessFunctionBase, WorkflowContext } from "@mathrunet/masamune_firebase_workflow";
|
|
2
|
+
/**
|
|
3
|
+
* A function for analyzing market research data.
|
|
4
|
+
*
|
|
5
|
+
* 市場調査データを分析するためのFunction。
|
|
6
|
+
*/
|
|
7
|
+
export declare class AnalyzeMarketResearch extends WorkflowProcessFunctionBase {
|
|
8
|
+
/**
|
|
9
|
+
* The ID of the function.
|
|
10
|
+
*
|
|
11
|
+
* 関数のID。
|
|
12
|
+
*/
|
|
13
|
+
id: string;
|
|
14
|
+
/**
|
|
15
|
+
* The process of the function.
|
|
16
|
+
*
|
|
17
|
+
* @param context
|
|
18
|
+
* The context of the function.
|
|
19
|
+
*
|
|
20
|
+
* @returns
|
|
21
|
+
* The action of the function.
|
|
22
|
+
*/
|
|
23
|
+
process(context: WorkflowContext): Promise<Action>;
|
|
24
|
+
/**
|
|
25
|
+
* Load project data from task.project reference.
|
|
26
|
+
*/
|
|
27
|
+
private loadProjectData;
|
|
28
|
+
/**
|
|
29
|
+
* Build the analysis prompt for Gemini.
|
|
30
|
+
*/
|
|
31
|
+
private buildAnalysisPrompt;
|
|
32
|
+
/**
|
|
33
|
+
* Get the response schema for structured output.
|
|
34
|
+
*/
|
|
35
|
+
private getResponseSchema;
|
|
36
|
+
/**
|
|
37
|
+
* Get the schema for a demand forecast period.
|
|
38
|
+
*/
|
|
39
|
+
private getDemandPeriodSchema;
|
|
40
|
+
}
|