* Generate actionable guidance from percentage + trend. * This is what AI agents can directly consume. * * Examples: * - "USE: inject() – 97% adoption, stable" * - "CAUTION: constructor DI – 3%, declining" * - "AVOID: BehaviorSubject – legacy pattern, declining"
(
patternName: string,
percentage: number,
trend: PatternTrend | undefined,
isAlternative: boolean = false,
hasRisingAlternative: boolean = false
)
| 340 | * - "AVOID: BehaviorSubject – legacy pattern, declining" |
| 341 | */ |
| 342 | private generateGuidance( |
| 343 | patternName: string, |
| 344 | percentage: number, |
| 345 | trend: PatternTrend | undefined, |
| 346 | isAlternative: boolean = false, |
| 347 | hasRisingAlternative: boolean = false |
| 348 | ): string { |
| 349 | const trendLabel = trend ? `, ${trend.toLowerCase()}` : ''; |
| 350 | |
| 351 | // Alternative pattern that is rising (migration target) |
| 352 | if (isAlternative && trend === 'Rising') { |
| 353 | return `USE: ${patternName} – ${percentage}%, rising (migration target)`; |
| 354 | } |
| 355 | |
| 356 | // Primary pattern that is declining while an alternative is rising |
| 357 | if (!isAlternative && trend === 'Declining' && hasRisingAlternative) { |
| 358 | return `CAUTION: ${patternName} – ${percentage}%, declining (legacy)`; |
| 359 | } |
| 360 | |
| 361 | // Primary pattern with high adoption |
| 362 | if (!isAlternative && percentage >= 80) { |
| 363 | // If primary is declining, downgrade to PREFER |
| 364 | if (trend === 'Declining') |
| 365 | return `PREFER: ${patternName} – ${percentage}% adoption, declining`; |
| 366 | return `USE: ${patternName} – ${percentage}% adoption${trendLabel}`; |
| 367 | } |
| 368 | |
| 369 | // Primary pattern with moderate adoption |
| 370 | if (!isAlternative && percentage >= 50) { |
| 371 | return `PREFER: ${patternName} – ${percentage}% adoption${trendLabel}`; |
| 372 | } |
| 373 | |
| 374 | // Alternative pattern that is declining |
| 375 | if (isAlternative && trend === 'Declining') { |
| 376 | return `AVOID: ${patternName} – ${percentage}%, declining (legacy)`; |
| 377 | } |
| 378 | |
| 379 | // Alternative with low adoption |
| 380 | if (isAlternative && percentage < 20) { |
| 381 | // If it's rising, we already handled it above. If stable/declining, it's a caution. |
| 382 | return `CAUTION: ${patternName} – ${percentage}% minority pattern${trendLabel}`; |
| 383 | } |
| 384 | |
| 385 | // Default: just describe it |
| 386 | return `${patternName} – ${percentage}%${trendLabel}`; |
| 387 | } |
| 388 | |
| 389 | /** |
| 390 | * Get robust date for a pattern (P90 percentile) to avoid "single file edit" skew |