diff --git a/src/signals/focus-manifest.ts b/src/signals/focus-manifest.ts index 81c20e1ae3..0b57e9be5b 100644 --- a/src/signals/focus-manifest.ts +++ b/src/signals/focus-manifest.ts @@ -120,6 +120,7 @@ export type FocusManifestSettings = Partial< | "aiReviewAllAuthors" | "closeOwnerAuthors" | "autoLabelEnabled" + | "badgeEnabled" | "gittensorLabel" | "createMissingLabel" | "publicSurface" @@ -773,7 +774,7 @@ function parseSettingsOverride(value: JsonValue | undefined, warnings: string[]) if (blacklistLabel !== null) out.blacklistLabel = blacklistLabel; const publicSurface = normalizeOptionalEnum(r.publicSurface, "settings.publicSurface", ["off", "comment_and_label", "comment_only", "label_only"] as const, warnings); if (publicSurface !== null) out.publicSurface = publicSurface; - for (const key of ["aiReviewByok", "aiReviewAllAuthors", "closeOwnerAuthors", "autoLabelEnabled", "createMissingLabel", "includeMaintainerAuthors", "requireLinkedIssue", "backfillEnabled", "privateTrustEnabled", "agentPaused", "agentDryRun"] as const) { + for (const key of ["aiReviewByok", "aiReviewAllAuthors", "closeOwnerAuthors", "autoLabelEnabled", "badgeEnabled", "createMissingLabel", "includeMaintainerAuthors", "requireLinkedIssue", "backfillEnabled", "privateTrustEnabled", "agentPaused", "agentDryRun"] as const) { const flag = normalizeOptionalBoolean(r[key], `settings.${key}`, warnings); if (flag !== null) out[key] = flag; } diff --git a/test/unit/focus-manifest.test.ts b/test/unit/focus-manifest.test.ts index 61d81bbd50..508e7cbbae 100644 --- a/test/unit/focus-manifest.test.ts +++ b/test/unit/focus-manifest.test.ts @@ -1426,6 +1426,18 @@ describe("parseFocusManifest settings override + resolveEffectiveSettings", () = expect(eff.linkedIssueGateMode).toBe("block"); // gate: wins over settings: }); + it("wires settings.badgeEnabled into the manifest parser and lets it override the DB value (#2555)", () => { + const parsedTrue = parseFocusManifest({ settings: { badgeEnabled: true } }); + expect(parsedTrue.settings.badgeEnabled).toBe(true); + expect(parsedTrue.warnings).toEqual([]); + const parsedFalse = parseFocusManifest({ settings: { badgeEnabled: false } }); + expect(parsedFalse.settings.badgeEnabled).toBe(false); + + const db = { badgeEnabled: false } as unknown as RepositorySettings; + const eff = resolveEffectiveSettings(db, parseFocusManifest({ settings: { badgeEnabled: true } })); + expect(eff.badgeEnabled).toBe(true); // settings: override wins over the DB-stored value + }); + it("parses aiReview from settings: and lets gate.aiReview win in resolveEffectiveSettings", () => { const parsed = parseFocusManifest({ settings: { aiReviewMode: "advisory", aiReviewByok: true } }); expect(parsed.settings.aiReviewMode).toBe("advisory");