@vibe-validate/cli 0.17.6 → 0.18.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 (88) hide show
  1. package/dist/bin/vibe-validate +4 -0
  2. package/dist/bin/vibe-validate.js +4 -0
  3. package/dist/bin/vibe-validate.js.map +1 -1
  4. package/dist/bin/vv +4 -0
  5. package/dist/bin.js +12 -4
  6. package/dist/bin.js.map +1 -1
  7. package/dist/commands/cleanup.d.ts +4 -1
  8. package/dist/commands/cleanup.d.ts.map +1 -1
  9. package/dist/commands/cleanup.js +168 -122
  10. package/dist/commands/cleanup.js.map +1 -1
  11. package/dist/commands/config.d.ts.map +1 -1
  12. package/dist/commands/config.js +35 -21
  13. package/dist/commands/config.js.map +1 -1
  14. package/dist/commands/create-extractor.d.ts.map +1 -1
  15. package/dist/commands/create-extractor.js +29 -14
  16. package/dist/commands/create-extractor.js.map +1 -1
  17. package/dist/commands/doctor.d.ts.map +1 -1
  18. package/dist/commands/doctor.js +12 -23
  19. package/dist/commands/doctor.js.map +1 -1
  20. package/dist/commands/generate-workflow.d.ts.map +1 -1
  21. package/dist/commands/generate-workflow.js +6 -2
  22. package/dist/commands/generate-workflow.js.map +1 -1
  23. package/dist/commands/history.d.ts.map +1 -1
  24. package/dist/commands/history.js +19 -9
  25. package/dist/commands/history.js.map +1 -1
  26. package/dist/commands/init.d.ts.map +1 -1
  27. package/dist/commands/init.js +3 -1
  28. package/dist/commands/init.js.map +1 -1
  29. package/dist/commands/pre-commit.d.ts.map +1 -1
  30. package/dist/commands/pre-commit.js +3 -1
  31. package/dist/commands/pre-commit.js.map +1 -1
  32. package/dist/commands/run.d.ts.map +1 -1
  33. package/dist/commands/run.js +21 -13
  34. package/dist/commands/run.js.map +1 -1
  35. package/dist/commands/state.d.ts.map +1 -1
  36. package/dist/commands/state.js +11 -6
  37. package/dist/commands/state.js.map +1 -1
  38. package/dist/commands/watch-pr.d.ts +16 -0
  39. package/dist/commands/watch-pr.d.ts.map +1 -1
  40. package/dist/commands/watch-pr.js +574 -320
  41. package/dist/commands/watch-pr.js.map +1 -1
  42. package/dist/schemas/watch-pr-result.schema.d.ts +2071 -0
  43. package/dist/schemas/watch-pr-result.schema.d.ts.map +1 -0
  44. package/dist/schemas/watch-pr-result.schema.js +346 -0
  45. package/dist/schemas/watch-pr-result.schema.js.map +1 -0
  46. package/dist/schemas/watch-pr-schema.d.ts +6 -6
  47. package/dist/services/cache-manager.d.ts +113 -0
  48. package/dist/services/cache-manager.d.ts.map +1 -0
  49. package/dist/services/cache-manager.js +211 -0
  50. package/dist/services/cache-manager.js.map +1 -0
  51. package/dist/services/ci-providers/github-actions.d.ts.map +1 -1
  52. package/dist/services/ci-providers/github-actions.js +10 -16
  53. package/dist/services/ci-providers/github-actions.js.map +1 -1
  54. package/dist/services/external-check-extractor.d.ts +66 -0
  55. package/dist/services/external-check-extractor.d.ts.map +1 -0
  56. package/dist/services/external-check-extractor.js +114 -0
  57. package/dist/services/external-check-extractor.js.map +1 -0
  58. package/dist/services/extraction-mode-detector.d.ts +85 -0
  59. package/dist/services/extraction-mode-detector.d.ts.map +1 -0
  60. package/dist/services/extraction-mode-detector.js +200 -0
  61. package/dist/services/extraction-mode-detector.js.map +1 -0
  62. package/dist/services/github-fetcher.d.ts +234 -0
  63. package/dist/services/github-fetcher.d.ts.map +1 -0
  64. package/dist/services/github-fetcher.js +441 -0
  65. package/dist/services/github-fetcher.js.map +1 -0
  66. package/dist/services/history-summary-builder.d.ts +74 -0
  67. package/dist/services/history-summary-builder.d.ts.map +1 -0
  68. package/dist/services/history-summary-builder.js +199 -0
  69. package/dist/services/history-summary-builder.js.map +1 -0
  70. package/dist/services/watch-pr-orchestrator.d.ts +132 -0
  71. package/dist/services/watch-pr-orchestrator.d.ts.map +1 -0
  72. package/dist/services/watch-pr-orchestrator.js +451 -0
  73. package/dist/services/watch-pr-orchestrator.js.map +1 -0
  74. package/dist/utils/command-name.d.ts +21 -0
  75. package/dist/utils/command-name.d.ts.map +1 -0
  76. package/dist/utils/command-name.js +45 -0
  77. package/dist/utils/command-name.js.map +1 -0
  78. package/dist/utils/pid-lock.d.ts.map +1 -1
  79. package/dist/utils/pid-lock.js +3 -3
  80. package/dist/utils/pid-lock.js.map +1 -1
  81. package/dist/utils/secret-scanning.d.ts.map +1 -1
  82. package/dist/utils/secret-scanning.js +45 -17
  83. package/dist/utils/secret-scanning.js.map +1 -1
  84. package/dist/utils/temp-files.d.ts +1 -2
  85. package/dist/utils/temp-files.d.ts.map +1 -1
  86. package/dist/utils/temp-files.js +4 -4
  87. package/dist/utils/temp-files.js.map +1 -1
  88. package/package.json +8 -8
@@ -0,0 +1,441 @@
1
+ /**
2
+ * GitHubFetcher - Fetch PR metadata and check results from GitHub API
3
+ *
4
+ * Uses `gh` CLI to fetch:
5
+ * - Complete PR metadata (title, author, labels, linked issues, etc.)
6
+ * - Check results (GitHub Actions + external status checks)
7
+ * - Run logs from GitHub Actions
8
+ * - File changes from git diff
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ import { fetchPRDetails as ghFetchPRDetails, fetchPRChecks, fetchRunLogs as ghFetchRunLogs, fetchRunDetails as ghFetchRunDetails, fetchRunJobs as ghFetchRunJobs, getDiffStats, getCommitCount, listWorkflowRuns, } from '@vibe-validate/git';
13
+ /**
14
+ * GitHubFetcher - Fetch PR data from GitHub API via gh CLI
15
+ */
16
+ export class GitHubFetcher {
17
+ owner;
18
+ repo;
19
+ /**
20
+ * Create GitHubFetcher
21
+ *
22
+ * @param owner - Repository owner (optional, defaults to current repo)
23
+ * @param repo - Repository name (optional, defaults to current repo)
24
+ */
25
+ constructor(owner, repo) {
26
+ this.owner = owner;
27
+ this.repo = repo;
28
+ }
29
+ /**
30
+ * Fetch complete PR metadata
31
+ *
32
+ * @param prNumber - PR number
33
+ * @returns PR metadata
34
+ */
35
+ async fetchPRDetails(prNumber) {
36
+ const fields = [
37
+ 'number',
38
+ 'title',
39
+ 'url',
40
+ 'headRefName',
41
+ 'baseRefName',
42
+ 'author',
43
+ 'isDraft',
44
+ 'mergeable',
45
+ 'mergeStateStatus',
46
+ 'labels',
47
+ 'closingIssuesReferences',
48
+ ];
49
+ const data = ghFetchPRDetails(prNumber, this.owner, this.repo, fields);
50
+ // Map GitHub API response to PRMetadata schema
51
+ return {
52
+ number: data.number,
53
+ title: data.title,
54
+ url: data.url,
55
+ branch: data.headRefName,
56
+ base_branch: data.baseRefName,
57
+ author: data.author.login,
58
+ draft: data.isDraft ?? false,
59
+ mergeable: data.mergeable === 'MERGEABLE',
60
+ merge_state_status: this.normalizeMergeStateStatus(data.mergeStateStatus ?? 'UNKNOWN'),
61
+ labels: data.labels?.map((label) => label.name) ?? [],
62
+ linked_issues: this.extractLinkedIssues(data.closingIssuesReferences),
63
+ };
64
+ }
65
+ /**
66
+ * Fetch check results (GitHub Actions + external)
67
+ *
68
+ * @param prNumber - PR number
69
+ * @returns Check results
70
+ */
71
+ async fetchChecks(prNumber) {
72
+ const data = fetchPRChecks(prNumber, this.owner, this.repo);
73
+ const checks = [];
74
+ for (const check of data.statusCheckRollup ?? []) {
75
+ const type = this.classifyCheck(check);
76
+ if (type === 'CheckRun') {
77
+ checks.push(this.mapCheckRun(check));
78
+ }
79
+ else {
80
+ checks.push(this.mapStatusContext(check));
81
+ }
82
+ }
83
+ return checks;
84
+ }
85
+ /**
86
+ * Fetch run logs for a GitHub Actions run
87
+ *
88
+ * @param runId - GitHub run ID
89
+ * @param jobId - GitHub job ID (optional, for matrix strategy jobs)
90
+ * @returns Raw log output
91
+ *
92
+ * When jobId is provided, fetches logs for a specific job within the run.
93
+ * This is critical for matrix strategy builds where extraction needs job-specific logs.
94
+ */
95
+ async fetchRunLogs(runId, jobId) {
96
+ return ghFetchRunLogs(runId, this.owner, this.repo, jobId);
97
+ }
98
+ /**
99
+ * Fetch details for a specific GitHub Actions run
100
+ *
101
+ * Useful for watching specific failed runs to test extraction.
102
+ *
103
+ * @param runId - GitHub run ID
104
+ * @returns Run details
105
+ */
106
+ async fetchRunDetails(runId) {
107
+ const fields = ['name', 'status', 'conclusion', 'workflowName', 'createdAt', 'updatedAt', 'url'];
108
+ const data = ghFetchRunDetails(runId, this.owner, this.repo, fields);
109
+ // Map GitHub API response to RunDetails
110
+ return {
111
+ run_id: runId,
112
+ name: data.name,
113
+ workflow: data.workflowName,
114
+ status: this.normalizeStatus(data.status),
115
+ conclusion: data.conclusion ? this.normalizeConclusion(data.conclusion) : undefined,
116
+ started_at: data.createdAt,
117
+ duration: this.calculateDuration(data.createdAt, data.updatedAt),
118
+ url: data.url,
119
+ };
120
+ }
121
+ /**
122
+ * Fetch jobs for a workflow run
123
+ *
124
+ * @param runId - Run ID
125
+ * @returns List of jobs for the run
126
+ */
127
+ async fetchRunJobs(runId) {
128
+ return ghFetchRunJobs(runId, this.owner, this.repo);
129
+ }
130
+ /**
131
+ * Fetch all workflow runs for a PR
132
+ *
133
+ * @param prNumber - PR number
134
+ * @returns List of workflow runs
135
+ */
136
+ async fetchRunsForPR(prNumber) {
137
+ // First get the PR branch name
138
+ const prData = ghFetchPRDetails(prNumber, this.owner, this.repo, ['headRefName']);
139
+ const branchName = prData.headRefName;
140
+ // Fetch workflow runs for the branch
141
+ const runs = listWorkflowRuns(branchName, this.owner, this.repo, 20, ['databaseId', 'workflowName', 'status', 'conclusion', 'createdAt', 'updatedAt']);
142
+ // Transform to expected format
143
+ return runs.map((run) => ({
144
+ run_id: run.databaseId,
145
+ workflow_name: run.workflowName,
146
+ status: run.status,
147
+ conclusion: run.conclusion,
148
+ started_at: run.createdAt,
149
+ duration: this.calculateDuration(run.createdAt, run.updatedAt),
150
+ }));
151
+ }
152
+ /**
153
+ * Fetch file changes for a PR
154
+ *
155
+ * Uses git diff --numstat to get file change statistics.
156
+ *
157
+ * @param _prNumber - PR number (unused - we use git diff from current branch)
158
+ * @returns File change context
159
+ */
160
+ async fetchFileChanges(_prNumber) {
161
+ // Get diff stats using getDiffStats from @vibe-validate/git (architectural compliance)
162
+ const diffOutput = getDiffStats('origin/main', 'HEAD');
163
+ // Get commit count using getCommitCount from @vibe-validate/git (architectural compliance)
164
+ const commitCount = getCommitCount('origin/main', 'HEAD');
165
+ // Parse diff output
166
+ const lines = diffOutput.trim().split('\n').filter((line) => line.length > 0);
167
+ let totalInsertions = 0;
168
+ let totalDeletions = 0;
169
+ const files = [];
170
+ for (let i = 0; i < lines.length; i++) {
171
+ const line = lines[i];
172
+ const parts = line.split('\t');
173
+ if (parts.length !== 3)
174
+ continue;
175
+ // Skip binary file markers (0\t0\t-)
176
+ if (parts[0] === '0' && parts[1] === '0' && parts[2] === '-') {
177
+ continue;
178
+ }
179
+ const insertions = parts[0] === '-' ? 0 : Number.parseInt(parts[0], 10);
180
+ const deletions = parts[1] === '-' ? 0 : Number.parseInt(parts[1], 10);
181
+ const file = parts[2];
182
+ // Detect new files - next line is 0\t0\t- marker
183
+ const nextLine = i + 1 < lines.length ? lines[i + 1] : '';
184
+ const nextParts = nextLine.split('\t');
185
+ const isNewFile = nextParts.length === 3 && nextParts[0] === '0' && nextParts[1] === '0' && nextParts[2] === '-';
186
+ totalInsertions += insertions;
187
+ totalDeletions += deletions;
188
+ files.push({
189
+ file,
190
+ insertions,
191
+ deletions,
192
+ new_file: isNewFile,
193
+ });
194
+ }
195
+ // Sort by total changes (insertions + deletions) and limit to top 10
196
+ // Using toSorted to avoid mutation (sonarjs requirement)
197
+ const topFiles = [...files]
198
+ .sort((a, b) => b.insertions + b.deletions - (a.insertions + a.deletions))
199
+ .slice(0, 10);
200
+ return {
201
+ files_changed: files.length,
202
+ insertions: totalInsertions,
203
+ deletions: totalDeletions,
204
+ commits: Number.parseInt(commitCount.trim(), 10),
205
+ top_files: topFiles,
206
+ };
207
+ }
208
+ /**
209
+ * Classify check type
210
+ *
211
+ * @param check - Check object from GitHub API
212
+ * @returns 'CheckRun' or 'StatusContext'
213
+ */
214
+ classifyCheck(check) {
215
+ return check.__typename === 'CheckRun' ? 'CheckRun' : 'StatusContext';
216
+ }
217
+ /**
218
+ * Map CheckRun to internal CheckResult
219
+ *
220
+ * @param check - CheckRun from GitHub API
221
+ * @returns CheckResult
222
+ */
223
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
224
+ mapCheckRun(check) {
225
+ const runId = this.extractRunId(check.detailsUrl);
226
+ const jobId = this.extractJobId(check.detailsUrl);
227
+ const workflow = this.extractWorkflowName(check.name);
228
+ return {
229
+ type: 'github_action',
230
+ name: check.name,
231
+ status: this.normalizeStatus(check.status),
232
+ conclusion: check.conclusion ? this.normalizeConclusion(check.conclusion) : undefined,
233
+ run_id: runId ?? undefined,
234
+ job_id: jobId ?? undefined,
235
+ workflow,
236
+ started_at: check.startedAt,
237
+ duration: this.calculateDuration(check.startedAt, check.completedAt),
238
+ };
239
+ }
240
+ /**
241
+ * Map StatusContext to internal CheckResult
242
+ *
243
+ * @param check - StatusContext from GitHub API
244
+ * @returns CheckResult
245
+ */
246
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
247
+ mapStatusContext(check) {
248
+ return {
249
+ type: 'external',
250
+ name: check.context,
251
+ status: 'completed',
252
+ conclusion: this.normalizeStatusContextState(check.state),
253
+ url: check.targetUrl,
254
+ provider: this.detectProvider(check.context),
255
+ };
256
+ }
257
+ /**
258
+ * Extract run ID from GitHub Actions URL
259
+ *
260
+ * @param url - GitHub Actions URL
261
+ * @returns Run ID or null
262
+ */
263
+ extractRunId(url) {
264
+ const regex = /\/runs\/(\d+)/;
265
+ const match = regex.exec(url);
266
+ return match ? Number.parseInt(match[1], 10) : null;
267
+ }
268
+ /**
269
+ * Extract job ID from GitHub Actions URL
270
+ *
271
+ * Matrix strategy jobs have URLs like:
272
+ * https://github.com/owner/repo/actions/runs/12345/job/67890
273
+ *
274
+ * @param url - GitHub Actions URL
275
+ * @returns Job ID or null
276
+ */
277
+ extractJobId(url) {
278
+ const regex = /\/job\/(\d+)/;
279
+ const match = regex.exec(url);
280
+ return match ? Number.parseInt(match[1], 10) : null;
281
+ }
282
+ /**
283
+ * Extract workflow name from check name
284
+ *
285
+ * @param checkName - Check name (e.g., "CI / Build")
286
+ * @returns Workflow name
287
+ */
288
+ extractWorkflowName(checkName) {
289
+ // Extract workflow name before first /
290
+ const parts = checkName.split('/');
291
+ return parts[0].trim();
292
+ }
293
+ /**
294
+ * Calculate duration between two timestamps
295
+ *
296
+ * @param start - Start time (ISO 8601)
297
+ * @param end - End time (ISO 8601, optional - defaults to now)
298
+ * @returns Human-readable duration (e.g., "2m30s")
299
+ */
300
+ calculateDuration(start, end) {
301
+ if (!start)
302
+ return '0s';
303
+ const startTime = new Date(start).getTime();
304
+ // Handle invalid start time
305
+ if (Number.isNaN(startTime))
306
+ return '0s';
307
+ const endTime = end ? new Date(end).getTime() : Date.now();
308
+ // Handle invalid end time (fall back to now)
309
+ const effectiveEndTime = Number.isNaN(endTime) ? Date.now() : endTime;
310
+ const durationMs = effectiveEndTime - startTime;
311
+ // Handle negative duration (clock skew or invalid data)
312
+ if (durationMs < 0 || Number.isNaN(durationMs))
313
+ return '0s';
314
+ const seconds = Math.floor(durationMs / 1000);
315
+ const minutes = Math.floor(seconds / 60);
316
+ const hours = Math.floor(minutes / 60);
317
+ if (hours > 0) {
318
+ return `${hours}h${minutes % 60}m${seconds % 60}s`;
319
+ }
320
+ else if (minutes > 0) {
321
+ return `${minutes}m${seconds % 60}s`;
322
+ }
323
+ else {
324
+ return `${seconds}s`;
325
+ }
326
+ }
327
+ /**
328
+ * Normalize GitHub status to CheckStatus
329
+ *
330
+ * @param status - GitHub status
331
+ * @returns CheckStatus
332
+ */
333
+ normalizeStatus(status) {
334
+ const normalized = status.toLowerCase();
335
+ if (normalized === 'completed')
336
+ return 'completed';
337
+ if (normalized === 'in_progress')
338
+ return 'in_progress';
339
+ return 'queued';
340
+ }
341
+ /**
342
+ * Normalize GitHub conclusion to CheckConclusion
343
+ *
344
+ * @param conclusion - GitHub conclusion
345
+ * @returns CheckConclusion
346
+ */
347
+ normalizeConclusion(conclusion) {
348
+ const normalized = conclusion.toLowerCase();
349
+ if (normalized === 'success')
350
+ return 'success';
351
+ if (normalized === 'failure')
352
+ return 'failure';
353
+ if (normalized === 'neutral')
354
+ return 'neutral';
355
+ if (normalized === 'cancelled')
356
+ return 'cancelled';
357
+ if (normalized === 'skipped')
358
+ return 'skipped';
359
+ if (normalized === 'timed_out')
360
+ return 'timed_out';
361
+ return 'action_required';
362
+ }
363
+ /**
364
+ * Normalize StatusContext state to CheckConclusion
365
+ *
366
+ * @param state - StatusContext state
367
+ * @returns CheckConclusion
368
+ */
369
+ normalizeStatusContextState(state) {
370
+ const normalized = state.toLowerCase();
371
+ if (normalized === 'success')
372
+ return 'success';
373
+ if (normalized === 'failure' || normalized === 'error')
374
+ return 'failure';
375
+ if (normalized === 'pending')
376
+ return 'action_required';
377
+ return 'neutral';
378
+ }
379
+ /**
380
+ * Normalize merge state status
381
+ *
382
+ * @param status - GitHub merge state status
383
+ * @returns MergeStateStatus
384
+ */
385
+ normalizeMergeStateStatus(status) {
386
+ const normalized = status.toUpperCase();
387
+ if (normalized === 'BEHIND')
388
+ return 'BEHIND';
389
+ if (normalized === 'BLOCKED')
390
+ return 'BLOCKED';
391
+ if (normalized === 'CLEAN')
392
+ return 'CLEAN';
393
+ if (normalized === 'DIRTY')
394
+ return 'DIRTY';
395
+ if (normalized === 'DRAFT')
396
+ return 'DRAFT';
397
+ if (normalized === 'HAS_HOOKS')
398
+ return 'HAS_HOOKS';
399
+ if (normalized === 'UNSTABLE')
400
+ return 'UNSTABLE';
401
+ return 'UNKNOWN';
402
+ }
403
+ /**
404
+ * Extract linked issues from closing issues references
405
+ *
406
+ * @param closingIssuesReferences - Closing issues references from GitHub API
407
+ * @returns Linked issues
408
+ */
409
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
410
+ extractLinkedIssues(closingIssuesReferences) {
411
+ if (!closingIssuesReferences?.nodes)
412
+ return [];
413
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
414
+ return closingIssuesReferences.nodes.map((issue) => ({
415
+ number: issue.number,
416
+ title: issue.title,
417
+ url: issue.url,
418
+ }));
419
+ }
420
+ /**
421
+ * Detect provider from check name
422
+ *
423
+ * @param checkName - Check name
424
+ * @returns Provider name
425
+ */
426
+ detectProvider(checkName) {
427
+ const lower = checkName.toLowerCase();
428
+ if (lower.includes('codecov'))
429
+ return 'codecov';
430
+ if (lower.includes('sonar'))
431
+ return 'sonarcloud';
432
+ if (lower.includes('circleci'))
433
+ return 'circleci';
434
+ if (lower.includes('travis'))
435
+ return 'travis';
436
+ if (lower.includes('jenkins'))
437
+ return 'jenkins';
438
+ return 'unknown';
439
+ }
440
+ }
441
+ //# sourceMappingURL=github-fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-fetcher.js","sourceRoot":"","sources":["../../src/services/github-fetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * History Summary Builder
3
+ *
4
+ * Fetches workflow runs for a PR branch and calculates:
5
+ * - Total number of runs
6
+ * - Recent pattern (passed/failed/flaky)
7
+ * - Success rate
8
+ *
9
+ * Provides context for pattern recognition without full history details.
10
+ *
11
+ * @packageDocumentation
12
+ */
13
+ import type { CheckHistorySummary } from '../schemas/watch-pr-result.schema.js';
14
+ /**
15
+ * HistorySummaryBuilder
16
+ *
17
+ * Builds a condensed history summary for pattern recognition.
18
+ */
19
+ export declare class HistorySummaryBuilder {
20
+ private readonly _owner;
21
+ private readonly _repo;
22
+ constructor(_owner: string, _repo: string);
23
+ /**
24
+ * Build history summary for a PR branch
25
+ *
26
+ * @param branch - Branch name
27
+ * @returns History summary with total runs, pattern, and success rate
28
+ */
29
+ buildSummary(branch: string): Promise<CheckHistorySummary>;
30
+ /**
31
+ * Fetch workflow runs for a branch via gh CLI
32
+ *
33
+ * @param branch - Branch name
34
+ * @returns Array of workflow runs (sorted by created_at DESC)
35
+ */
36
+ private fetchWorkflowRuns;
37
+ /**
38
+ * Detect pattern from recent runs
39
+ *
40
+ * Patterns:
41
+ * - "Passed last N runs" - All recent runs passed
42
+ * - "Failed last N runs" - All recent runs failed
43
+ * - "Flaky (alternating)" - Alternating pass/fail
44
+ * - "Recently fixed (was failing)" - Recent passes after failures
45
+ * - Generic pattern otherwise
46
+ *
47
+ * @param runs - All runs (sorted DESC)
48
+ * @returns Pattern description
49
+ */
50
+ private detectPattern;
51
+ /**
52
+ * Count consecutive runs with the same conclusion (starting from most recent)
53
+ *
54
+ * @param runs - Workflow runs
55
+ * @param conclusion - Conclusion to check
56
+ * @returns Count of consecutive runs
57
+ */
58
+ private countConsecutive;
59
+ /**
60
+ * Check if runs are alternating between success and failure
61
+ *
62
+ * @param runs - Workflow runs (at least 4 required)
63
+ * @returns True if alternating pattern detected
64
+ */
65
+ private isAlternating;
66
+ /**
67
+ * Calculate success rate from recent runs
68
+ *
69
+ * @param runs - Recent workflow runs (up to 10)
70
+ * @returns Success rate as percentage string (e.g., "75%")
71
+ */
72
+ private calculateSuccessRate;
73
+ }
74
+ //# sourceMappingURL=history-summary-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-summary-builder.d.ts","sourceRoot":"","sources":["../../src/services/history-summary-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAUhF;;;;GAIG;AACH,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM;IAGhC;;;;;OAKG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA+BhE;;;;;OAKG;YACW,iBAAiB;IA+B/B;;;;;;;;;;;;OAYG;IAEH,OAAO,CAAC,aAAa;IAsDrB;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAmBrB;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;CAU7B"}