@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,275 @@
1
+ "use strict";
2
+ /**
3
+ * Google Play Developer API Client
4
+ *
5
+ * Collects app statistics from Google Play Console:
6
+ * - Install/uninstall statistics
7
+ * - Ratings and reviews
8
+ * - Revenue data
9
+ *
10
+ * @see https://developers.google.com/android-publisher
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.GooglePlayClient = void 0;
47
+ const googleapis_1 = require("googleapis");
48
+ const fs = __importStar(require("fs"));
49
+ /**
50
+ * Google Play Developer API Client.
51
+ */
52
+ class GooglePlayClient {
53
+ androidPublisher;
54
+ packageName;
55
+ constructor(config) {
56
+ // Validate service account file exists
57
+ if (!fs.existsSync(config.serviceAccountPath)) {
58
+ throw new Error(`Service account file not found: ${config.serviceAccountPath}`);
59
+ }
60
+ // Load service account credentials
61
+ const serviceAccount = JSON.parse(fs.readFileSync(config.serviceAccountPath, "utf-8"));
62
+ // Create JWT auth client
63
+ const auth = new googleapis_1.google.auth.JWT({
64
+ email: serviceAccount.client_email,
65
+ key: serviceAccount.private_key,
66
+ scopes: ["https://www.googleapis.com/auth/androidpublisher"],
67
+ });
68
+ // Initialize Android Publisher API
69
+ this.androidPublisher = googleapis_1.google.androidpublisher({
70
+ version: "v3",
71
+ auth: auth,
72
+ });
73
+ this.packageName = config.packageName;
74
+ }
75
+ /**
76
+ * Get app information.
77
+ */
78
+ async getAppInfo() {
79
+ const response = await this.androidPublisher.edits.insert({
80
+ packageName: this.packageName,
81
+ });
82
+ const editId = response.data.id;
83
+ try {
84
+ const listingsResponse = await this.androidPublisher.edits.listings.list({
85
+ packageName: this.packageName,
86
+ editId: editId,
87
+ });
88
+ const listings = listingsResponse.data.listings || [];
89
+ const defaultListing = listings.find((l) => l.language === "en-US") || listings[0];
90
+ return {
91
+ packageName: this.packageName,
92
+ title: defaultListing?.title || this.packageName,
93
+ description: defaultListing?.fullDescription || undefined,
94
+ };
95
+ }
96
+ finally {
97
+ // Clean up the edit
98
+ await this.androidPublisher.edits.delete({
99
+ packageName: this.packageName,
100
+ editId: editId,
101
+ }).catch(() => {
102
+ // Ignore delete errors
103
+ });
104
+ }
105
+ }
106
+ /**
107
+ * Get install statistics for a date range.
108
+ *
109
+ * Note: Google Play Console API doesn't directly provide install stats via API.
110
+ * This requires using Google Play Console Reports (CSV) or Cloud Storage exports.
111
+ * For now, we return placeholder data structure.
112
+ */
113
+ async getInstallStats(dateRange) {
114
+ // Google Play doesn't have a direct API for install stats
115
+ // Stats need to be accessed via:
116
+ // 1. Google Play Console web interface
117
+ // 2. Cloud Storage exports (if configured)
118
+ // 3. BigQuery exports (if configured)
119
+ // Return structure with zeros - actual implementation would need
120
+ // Cloud Storage or BigQuery integration
121
+ console.warn("GooglePlayClient.getInstallStats: Direct API not available. " +
122
+ "Configure Cloud Storage or BigQuery exports for actual data.");
123
+ return {
124
+ totalInstalls: 0,
125
+ totalUninstalls: 0,
126
+ activeInstalls: 0,
127
+ dailyStats: [],
128
+ };
129
+ }
130
+ /**
131
+ * Get ratings summary.
132
+ */
133
+ async getRatings() {
134
+ // Fetch reviews to calculate ratings
135
+ // Note: This is an approximation based on available reviews
136
+ const reviews = await this.getReviews({ maxResults: 100 });
137
+ if (reviews.reviews.length === 0) {
138
+ return {
139
+ averageRating: 0,
140
+ totalRatings: 0,
141
+ ratingDistribution: { 1: 0, 2: 0, 3: 0, 4: 0, 5: 0 },
142
+ };
143
+ }
144
+ const distribution = { 1: 0, 2: 0, 3: 0, 4: 0, 5: 0 };
145
+ let totalRating = 0;
146
+ for (const review of reviews.reviews) {
147
+ const rating = Math.round(review.rating);
148
+ if (rating >= 1 && rating <= 5) {
149
+ distribution[rating]++;
150
+ totalRating += review.rating;
151
+ }
152
+ }
153
+ const totalRatings = reviews.reviews.length;
154
+ const averageRating = totalRatings > 0 ? totalRating / totalRatings : 0;
155
+ return {
156
+ averageRating: Math.round(averageRating * 10) / 10,
157
+ totalRatings,
158
+ ratingDistribution: distribution,
159
+ };
160
+ }
161
+ /**
162
+ * Get reviews.
163
+ */
164
+ async getReviews(options = {}) {
165
+ const response = await this.androidPublisher.reviews.list({
166
+ packageName: this.packageName,
167
+ maxResults: options.maxResults || 100,
168
+ token: options.pageToken,
169
+ translationLanguage: options.translationLanguage,
170
+ });
171
+ const reviews = (response.data.reviews || []).map((review) => {
172
+ const comment = review.comments?.[0]?.userComment;
173
+ return {
174
+ reviewId: review.reviewId || "",
175
+ authorName: review.authorName || "Anonymous",
176
+ rating: comment?.starRating || 0,
177
+ text: comment?.text || "",
178
+ timestamp: comment?.lastModified?.seconds
179
+ ? new Date(parseInt(comment.lastModified.seconds) * 1000)
180
+ : new Date(),
181
+ language: comment?.reviewerLanguage || "unknown",
182
+ deviceName: comment?.device || undefined,
183
+ appVersionCode: comment?.appVersionCode || undefined,
184
+ appVersionName: comment?.appVersionName || undefined,
185
+ };
186
+ });
187
+ return {
188
+ reviews,
189
+ nextPageToken: response.data.tokenPagination?.nextPageToken || undefined,
190
+ };
191
+ }
192
+ /**
193
+ * Get revenue statistics for a date range.
194
+ *
195
+ * Note: Revenue data requires Google Play Console Reports or BigQuery exports.
196
+ */
197
+ async getRevenueStats(dateRange) {
198
+ // Revenue data is not available via direct API
199
+ // Requires Cloud Storage or BigQuery exports configuration
200
+ console.warn("GooglePlayClient.getRevenueStats: Direct API not available. " +
201
+ "Configure Cloud Storage or BigQuery exports for actual data.");
202
+ return {
203
+ totalRevenue: 0,
204
+ currency: "USD",
205
+ dailyRevenue: [],
206
+ };
207
+ }
208
+ /**
209
+ * Collect all Google Play data for a date range.
210
+ */
211
+ async collectAllData(dateRange) {
212
+ const [installStats, ratings, reviewsResponse, revenueStats] = await Promise.all([
213
+ this.getInstallStats(dateRange).catch((err) => {
214
+ console.error("Failed to get install stats:", err.message);
215
+ return {
216
+ totalInstalls: 0,
217
+ totalUninstalls: 0,
218
+ activeInstalls: 0,
219
+ dailyStats: [],
220
+ };
221
+ }),
222
+ this.getRatings().catch((err) => {
223
+ console.error("Failed to get ratings:", err.message);
224
+ return {
225
+ averageRating: 0,
226
+ totalRatings: 0,
227
+ ratingDistribution: { 1: 0, 2: 0, 3: 0, 4: 0, 5: 0 },
228
+ };
229
+ }),
230
+ this.getReviews({ maxResults: 50 }).catch((err) => {
231
+ console.error("Failed to get reviews:", err.message);
232
+ return { reviews: [] };
233
+ }),
234
+ this.getRevenueStats(dateRange).catch((err) => {
235
+ console.error("Failed to get revenue stats:", err.message);
236
+ return { totalRevenue: 0, currency: "USD", dailyRevenue: [] };
237
+ }),
238
+ ]);
239
+ // Convert rating distribution format
240
+ const ratingDistribution = {
241
+ star1: ratings.ratingDistribution[1],
242
+ star2: ratings.ratingDistribution[2],
243
+ star3: ratings.ratingDistribution[3],
244
+ star4: ratings.ratingDistribution[4],
245
+ star5: ratings.ratingDistribution[5],
246
+ };
247
+ // Convert reviews format
248
+ const recentReviews = reviewsResponse.reviews.map((r) => ({
249
+ id: r.reviewId,
250
+ rating: r.rating,
251
+ text: r.text,
252
+ authorName: r.authorName,
253
+ date: r.timestamp.toISOString().split("T")[0],
254
+ language: r.language,
255
+ }));
256
+ return {
257
+ packageName: this.packageName,
258
+ dateRange: dateRange,
259
+ totalInstalls: installStats.totalInstalls,
260
+ activeInstalls: installStats.activeInstalls,
261
+ newInstalls: installStats.totalInstalls,
262
+ uninstalls: installStats.totalUninstalls,
263
+ updateInstalls: installStats.dailyStats.reduce((sum, d) => sum + d.updates, 0),
264
+ averageRating: ratings.averageRating,
265
+ totalRatings: ratings.totalRatings,
266
+ ratingDistribution: ratingDistribution,
267
+ recentReviews: recentReviews,
268
+ totalRevenue: revenueStats.totalRevenue,
269
+ revenueCurrency: revenueStats.currency,
270
+ collectedAt: new Date(),
271
+ };
272
+ }
273
+ }
274
+ exports.GooglePlayClient = GooglePlayClient;
275
+ //# sourceMappingURL=google_play_client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google_play_client.js","sourceRoot":"","sources":["../../src/clients/google_play_client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * GitHub Analysis Init Function
3
+ *
4
+ * Initializes GitHub repository analysis:
5
+ * 1. Scans repository structure
6
+ * 2. Detects framework
7
+ * 3. Creates file list for processing
8
+ * 4. Dynamically updates task.actions
9
+ * 5. Saves initial state to Firebase Storage (as JSON)
10
+ */
11
+ import { Action, WorkflowProcessFunctionBase, WorkflowContext } from "@mathrunet/masamune_firebase_workflow";
12
+ import "@mathrunet/masamune";
13
+ /**
14
+ * A function for initializing GitHub repository analysis.
15
+ *
16
+ * GitHubリポジトリ解析を初期化するためのFunction。
17
+ */
18
+ export declare class AnalyzeGitHubInit extends WorkflowProcessFunctionBase {
19
+ /**
20
+ * The ID of the function.
21
+ */
22
+ id: string;
23
+ /**
24
+ * Process the initialization.
25
+ */
26
+ process(context: WorkflowContext): Promise<Action>;
27
+ /**
28
+ * Update task.actions to include process and summary actions.
29
+ */
30
+ private updateTaskActions;
31
+ /**
32
+ * Group files by folder for batch processing.
33
+ * Each folder becomes one batch (one AI call).
34
+ * Multiple small folders may be grouped together.
35
+ */
36
+ private groupFilesByFolder;
37
+ }
@@ -0,0 +1,299 @@
1
+ "use strict";
2
+ /**
3
+ * GitHub Analysis Init Function
4
+ *
5
+ * Initializes GitHub repository analysis:
6
+ * 1. Scans repository structure
7
+ * 2. Detects framework
8
+ * 3. Creates file list for processing
9
+ * 4. Dynamically updates task.actions
10
+ * 5. Saves initial state to Firebase Storage (as JSON)
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.AnalyzeGitHubInit = void 0;
47
+ const masamune_firebase_workflow_1 = require("@mathrunet/masamune_firebase_workflow");
48
+ const admin = __importStar(require("firebase-admin"));
49
+ const github_content_client_1 = require("../clients/github_content_client");
50
+ const github_analysis_storage_1 = require("../utils/github_analysis_storage");
51
+ require("@mathrunet/masamune");
52
+ /**
53
+ * A function for initializing GitHub repository analysis.
54
+ *
55
+ * GitHubリポジトリ解析を初期化するためのFunction。
56
+ */
57
+ class AnalyzeGitHubInit extends masamune_firebase_workflow_1.WorkflowProcessFunctionBase {
58
+ /**
59
+ * The ID of the function.
60
+ */
61
+ id = "analyze_github_init";
62
+ /**
63
+ * Process the initialization.
64
+ */
65
+ async process(context) {
66
+ const action = context.action;
67
+ const task = context.task;
68
+ const command = action.command;
69
+ // 1. Validate input
70
+ const githubRepository = command.data?.githubRepository;
71
+ const githubRepositoryPath = command.data?.githubRepositoryPath || "";
72
+ if (!githubRepository) {
73
+ console.error("AnalyzeGitHubInit: No githubRepository specified");
74
+ return {
75
+ ...action,
76
+ results: {
77
+ githubAnalysis: {
78
+ error: "No githubRepository specified in action command",
79
+ },
80
+ },
81
+ };
82
+ }
83
+ // 2. Get GitHub token from project
84
+ const projectRef = action.project;
85
+ if (!projectRef) {
86
+ console.error("AnalyzeGitHubInit: No project reference");
87
+ return {
88
+ ...action,
89
+ results: {
90
+ githubAnalysis: {
91
+ error: "No project reference in action",
92
+ },
93
+ },
94
+ };
95
+ }
96
+ // Auto-initialize Firebase Admin if needed
97
+ if (admin.apps.length === 0) {
98
+ admin.initializeApp();
99
+ }
100
+ const projectDoc = await projectRef.load();
101
+ const projectData = projectDoc?.data();
102
+ const githubToken = projectData?.githubPersonalAccessToken;
103
+ if (!githubToken) {
104
+ console.error("AnalyzeGitHubInit: No GitHub token in project");
105
+ return {
106
+ ...action,
107
+ results: {
108
+ githubAnalysis: {
109
+ error: "No githubPersonalAccessToken configured in project",
110
+ },
111
+ },
112
+ };
113
+ }
114
+ try {
115
+ // 3. Initialize GitHub client
116
+ const githubClient = new github_content_client_1.GitHubContentClient({
117
+ token: githubToken,
118
+ repo: githubRepository,
119
+ });
120
+ // 4. Detect framework
121
+ console.log(`AnalyzeGitHubInit: Detecting framework for ${githubRepository}...`);
122
+ const frameworkInfo = await githubClient.detectFramework(githubRepositoryPath);
123
+ console.log(`AnalyzeGitHubInit: Framework detected: ${frameworkInfo.framework}`);
124
+ // 5. Get filtered file list
125
+ console.log(`AnalyzeGitHubInit: Getting file list...`);
126
+ const filePaths = await githubClient.getFilteredFileList(githubRepositoryPath);
127
+ console.log(`AnalyzeGitHubInit: Found ${filePaths.length} files to analyze`);
128
+ // 6. Get folder paths (sorted by depth, deepest first)
129
+ const folderPaths = githubClient.getFolderPaths(filePaths);
130
+ console.log(`AnalyzeGitHubInit: Found ${folderPaths.length} folders`);
131
+ // 7. Group files by folder for batch processing
132
+ const folderBatches = this.groupFilesByFolder(filePaths, folderPaths);
133
+ console.log(`AnalyzeGitHubInit: Created ${folderBatches.length} folder batches`);
134
+ // 8. Calculate batch count (one batch per folder group)
135
+ const batchCount = folderBatches.length;
136
+ console.log(`AnalyzeGitHubInit: Will create ${batchCount} process actions`);
137
+ // 9. Save state to Firebase Storage
138
+ const projectId = projectRef.id;
139
+ const state = {
140
+ phase: "processing",
141
+ repository: githubRepository,
142
+ repositoryPath: githubRepositoryPath,
143
+ framework: frameworkInfo,
144
+ totalFiles: filePaths.length,
145
+ processedFiles: 0,
146
+ filePaths: filePaths,
147
+ folderPaths: folderPaths,
148
+ folderBatches: folderBatches,
149
+ currentBatchIndex: 0,
150
+ batchSize: 0, // Not used in folder-based batching
151
+ updatedAt: new Date(),
152
+ };
153
+ const analysisData = (0, github_analysis_storage_1.createInitialData)(state);
154
+ await (0, github_analysis_storage_1.writeAnalysisData)(projectId, analysisData);
155
+ console.log(`AnalyzeGitHubInit: State saved to Storage`);
156
+ // 9. Update task.actions dynamically
157
+ const taskRef = action.task?.ref;
158
+ ;
159
+ console.log(`AnalyzeGitHubInit: action.task =`, taskRef ? taskRef.path : "undefined");
160
+ console.log(`AnalyzeGitHubInit: task.actions length =`, task.actions?.length);
161
+ if (taskRef) {
162
+ await this.updateTaskActions(taskRef, task.actions, command.index, batchCount, githubRepository, githubRepositoryPath);
163
+ console.log(`AnalyzeGitHubInit: Task actions updated`);
164
+ // Verify update
165
+ const updatedDoc = await taskRef.load();
166
+ const updatedActions = updatedDoc.data()?.actions || [];
167
+ console.log(`AnalyzeGitHubInit: Verified actions count =`, updatedActions.length);
168
+ }
169
+ // 11. Return success
170
+ return {
171
+ ...action,
172
+ results: {
173
+ githubAnalysisInit: {
174
+ repository: githubRepository,
175
+ repositoryPath: githubRepositoryPath,
176
+ framework: frameworkInfo.framework,
177
+ platforms: frameworkInfo.platforms,
178
+ totalFiles: filePaths.length,
179
+ totalFolders: folderPaths.length,
180
+ batchCount: batchCount,
181
+ },
182
+ },
183
+ };
184
+ }
185
+ catch (error) {
186
+ console.error("AnalyzeGitHubInit: Failed to initialize", error);
187
+ return {
188
+ ...action,
189
+ results: {
190
+ githubAnalysis: {
191
+ error: error.message,
192
+ },
193
+ },
194
+ };
195
+ }
196
+ }
197
+ /**
198
+ * Update task.actions to include process and summary actions.
199
+ */
200
+ async updateTaskActions(taskRef, currentActions, currentIndex, batchCount, githubRepository, githubRepositoryPath) {
201
+ // Create new actions array
202
+ const newActions = [];
203
+ // Keep actions up to and including current (init)
204
+ for (let i = 0; i <= currentIndex; i++) {
205
+ newActions.push(currentActions[i]);
206
+ }
207
+ // Add process actions for each batch
208
+ for (let i = 0; i < batchCount; i++) {
209
+ newActions.push({
210
+ command: "analyze_github_process",
211
+ index: currentIndex + 1 + i,
212
+ data: {
213
+ githubRepository: githubRepository,
214
+ githubRepositoryPath: githubRepositoryPath,
215
+ batchIndex: i,
216
+ },
217
+ });
218
+ }
219
+ // Add summary action
220
+ newActions.push({
221
+ command: "analyze_github_summary",
222
+ index: currentIndex + 1 + batchCount,
223
+ data: {
224
+ githubRepository: githubRepository,
225
+ githubRepositoryPath: githubRepositoryPath,
226
+ },
227
+ });
228
+ // Shift remaining actions
229
+ const shiftAmount = batchCount + 1; // process actions + summary action
230
+ for (let i = currentIndex + 1; i < currentActions.length; i++) {
231
+ const action = currentActions[i];
232
+ newActions.push({
233
+ ...action,
234
+ index: action.index + shiftAmount,
235
+ });
236
+ }
237
+ // Update task document
238
+ await taskRef.update({
239
+ actions: newActions,
240
+ });
241
+ }
242
+ /**
243
+ * Group files by folder for batch processing.
244
+ * Each folder becomes one batch (one AI call).
245
+ * Multiple small folders may be grouped together.
246
+ */
247
+ groupFilesByFolder(filePaths, folderPaths) {
248
+ // Create a map of folder -> files
249
+ const folderFileMap = new Map();
250
+ // Initialize with all folder paths
251
+ for (const folderPath of folderPaths) {
252
+ folderFileMap.set(folderPath, []);
253
+ }
254
+ // Also handle root-level files
255
+ folderFileMap.set("", []);
256
+ // Assign each file to its direct parent folder
257
+ for (const filePath of filePaths) {
258
+ const lastSlash = filePath.lastIndexOf("/");
259
+ const folderPath = lastSlash === -1 ? "" : filePath.substring(0, lastSlash);
260
+ if (folderFileMap.has(folderPath)) {
261
+ folderFileMap.get(folderPath)?.push(filePath);
262
+ }
263
+ else {
264
+ // Find the closest parent folder
265
+ let parent = folderPath;
266
+ while (parent && !folderFileMap.has(parent)) {
267
+ const parentSlash = parent.lastIndexOf("/");
268
+ parent = parentSlash === -1 ? "" : parent.substring(0, parentSlash);
269
+ }
270
+ folderFileMap.get(parent).push(filePath);
271
+ }
272
+ }
273
+ // Convert to FolderBatch array, filtering out empty folders
274
+ const batches = [];
275
+ // Sort folders by depth (shallowest first for better grouping)
276
+ const sortedFolders = Array.from(folderFileMap.entries())
277
+ .filter(([, files]) => files.length > 0)
278
+ .sort((a, b) => {
279
+ const depthA = a[0] === "" ? 0 : a[0].split("/").length;
280
+ const depthB = b[0] === "" ? 0 : b[0].split("/").length;
281
+ return depthA - depthB;
282
+ });
283
+ for (const [folderPath, files] of sortedFolders) {
284
+ // Each folder is its own batch for simplicity
285
+ // (can be optimized later to group small folders)
286
+ batches.push({
287
+ folderPath,
288
+ files,
289
+ });
290
+ }
291
+ console.log(`AnalyzeGitHubInit: Grouped into ${batches.length} folder batches`);
292
+ return batches;
293
+ }
294
+ }
295
+ exports.AnalyzeGitHubInit = AnalyzeGitHubInit;
296
+ module.exports = (regions, options, data) => new AnalyzeGitHubInit(options).build(regions);
297
+ // Export class for testing
298
+ module.exports.AnalyzeGitHubInit = AnalyzeGitHubInit;
299
+ //# sourceMappingURL=analyze_github_init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze_github_init.js","sourceRoot":"","sources":["../../src/functions/analyze_github_init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * GitHub Analysis Process Function
3
+ *
4
+ * Processes a folder batch:
5
+ * 1. Reads all files in the folder from GitHub
6
+ * 2. Generates AI summaries for all files + folder in one call
7
+ * 3. Caches summaries in Storage JSON
8
+ */
9
+ import { Action, WorkflowProcessFunctionBase, WorkflowContext } from "@mathrunet/masamune_firebase_workflow";
10
+ import "@mathrunet/masamune";
11
+ /**
12
+ * A function for processing a batch of GitHub files.
13
+ *
14
+ * GitHubファイルのバッチを処理するためのFunction。
15
+ */
16
+ export declare class AnalyzeGitHubProcess extends WorkflowProcessFunctionBase {
17
+ /**
18
+ * The ID of the function.
19
+ */
20
+ id: string;
21
+ /**
22
+ * Process the batch.
23
+ */
24
+ process(context: WorkflowContext): Promise<Action>;
25
+ }