refactor(plugins): separate activation from enablement (#59844)

* refactor(plugins): separate activation from enablement

* fix(cli): sanitize verbose plugin activation reasons
This commit is contained in:
Vincent Koc
2026-04-03 03:22:37 +09:00
committed by GitHub
parent 4aeb0255f3
commit f911bbc353
15 changed files with 148 additions and 42 deletions

View File

@@ -69,6 +69,28 @@ describe("plugins cli list", () => {
expect(output).toContain("explicitly enabled: no");
});
it("sanitizes activation reasons in verbose output", async () => {
buildPluginSnapshotReport.mockReturnValue({
plugins: [
createPluginRecord({
id: "demo",
name: "Demo Plugin",
activated: true,
activationSource: "auto",
activationReason: "\u001B[31mconfigured\nnext\tstep",
}),
],
diagnostics: [],
});
await runPluginsCommand(["plugins", "list", "--verbose"]);
const output = runtimeLogs.join("\n");
expect(output).toContain("activation reason: configured\\nnext\\tstep");
expect(output).not.toContain("\u001B[31m");
expect(output.match(/activation reason:/g)).toHaveLength(1);
});
it("keeps doctor on a module-loading snapshot", async () => {
buildPluginDiagnosticsReport.mockReturnValue({
plugins: [],

View File

@@ -156,6 +156,13 @@ function formatPluginLine(plugin: PluginRecord, verbose = false): string {
if (plugin.providerIds.length > 0) {
parts.push(` providers: ${plugin.providerIds.join(", ")}`);
}
if (plugin.activated !== undefined || plugin.activationSource || plugin.activationReason) {
const activationSummary =
plugin.activated === false
? "inactive"
: (plugin.activationSource ?? (plugin.activated ? "active" : "inactive"));
parts.push(` activation: ${activationSummary}`);
}
if (plugin.error) {
parts.push(theme.error(` error: ${plugin.error}`));
}