ReviewOS

also looking at this

stacks/buddy

fix(rules): apply a rule's autoMigrate, closing the rule-effects family

#1423
Merged glennmichael123 wants to merge fix/rule-automigrate into main
2 files +90 -1
src/upgrades/wire.tsmodified+14-1
Changes to src/upgrades/wire.ts
@@ -3,6 +3,7 @@ import type { BuddyConfig, PackageUpdate } from '../types'
33import type { Logger } from '../utils/logger'
44import type { UpgradeResult } from './migrate'
55import { stripManifest } from '../pr/pr-manifest'
6import { groupsToRules, resolveRuleEffects } from '../rules/engine'
67import { getDefaultLogger } from '../utils/logger'
78import { attemptMajorUpgrade } from './migrate'
89import { collectSpanNotes, describeSpanGaps } from './span'
@@ -92,6 +93,10 @@ export async function analyzeGroupMajors(options: GroupUpgradeOptions): Promise<
9293 const results: GroupUpgradeOutcome['results'] = []
9394 const skipped: GroupUpgradeOutcome['skipped'] = []
9495
96 // `autoMigrate` on a package rule was resolved into the effects and read by
97 // nobody, so only the repository-wide setting ever reached the migration.
98 const rules = [...groupsToRules(options.config.packages?.groups), ...(options.config.packages?.rules ?? [])]
99
95100 for (const update of majors) {
96101 if (!matchesGlobs(update.name, settings.packages)) {
97102 skipped.push({ name: update.name, reason: 'not matched by ai.majorUpgrades.packages' })
@@ -103,6 +108,14 @@ export async function analyzeGroupMajors(options: GroupUpgradeOptions): Promise<
103108 const span = collectSpanNotes(releases, update.currentVersion, update.newVersion)
104109 const gaps = describeSpanGaps(span)
105110
111 // Resolved per package rather than per group: this loop already runs
112 // once per major, and the documented reading — "one package opting in is
113 // enough, since migrating what can be migrated leaves everything else
114 // exactly as it would have been" — is an argument for deciding each on
115 // its own rather than letting one opt-in carry the rest.
116 const ruled = rules.length > 0 ? resolveRuleEffects(update, rules).autoMigrate : undefined
117 const autoMigrate = ruled ?? settings.autoMigrate
118
106119 const result = await attemptMajorUpgrade({
107120 update,
108121 releaseNotes: span.notes,
@@ -110,7 +123,7 @@ export async function analyzeGroupMajors(options: GroupUpgradeOptions): Promise<
110123 workspace: options.workspace,
111124 baseBranch: options.baseBranch,
112125 ai: options.ai,
113 ...(settings.autoMigrate !== undefined ? { autoMigrate: settings.autoMigrate } : {}),
126 ...(autoMigrate !== undefined ? { autoMigrate } : {}),
114127 ...(settings.draftBelowConfidence ? { draftBelowConfidence: settings.draftBelowConfidence } : {}),
115128 logger,
116129 })