diff --git a/.changeset/quiet-indexing-startup.md b/.changeset/quiet-indexing-startup.md new file mode 100644 index 00000000000..5a0260139b7 --- /dev/null +++ b/.changeset/quiet-indexing-startup.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Keep the extension usable on fresh startup when semantic indexing is enabled globally. diff --git a/packages/opencode/src/kilocode/config/default-plugins.ts b/packages/opencode/src/kilocode/config/default-plugins.ts index 393226f93e0..ad709dd24e7 100644 --- a/packages/opencode/src/kilocode/config/default-plugins.ts +++ b/packages/opencode/src/kilocode/config/default-plugins.ts @@ -1,5 +1,6 @@ import { createRequire } from "module" import type { ConfigPlugin } from "@/config/plugin" +import { isIndexingPlugin } from "@kilocode/kilo-indexing/detect" import { ensureIndexingPlugin, resolveIndexingPlugin } from "@/kilocode/indexing-feature" type Log = { @@ -13,17 +14,10 @@ export namespace KilocodeDefaultPlugins { cfg: T, opts: { disabled: boolean; log?: Log }, ): T { - const before = cfg.plugin ?? [] const plugin = opts.disabled ? undefined : resolveIndexingPlugin(req, opts.log) - const after = ensureIndexingPlugin(before, plugin) - if (after.length > before.length) { - const added = after[after.length - 1] - cfg.plugin_origins = [ - ...(cfg.plugin_origins ?? []), - { spec: added, source: "builtin", scope: "global" as ConfigPlugin.Scope }, - ] - } - cfg.plugin = after + cfg.plugin = ensureIndexingPlugin(cfg.plugin ?? [], plugin) + // Built-in indexing is not loaded through external plugins and must not wait for their setup. + cfg.plugin_origins = cfg.plugin_origins?.filter((item) => !isIndexingPlugin(item.spec)) return cfg } } diff --git a/packages/opencode/test/kilocode/config/indexing-default-plugin.test.ts b/packages/opencode/test/kilocode/config/indexing-default-plugin.test.ts index 122e494f109..7975c9cc842 100644 --- a/packages/opencode/test/kilocode/config/indexing-default-plugin.test.ts +++ b/packages/opencode/test/kilocode/config/indexing-default-plugin.test.ts @@ -6,6 +6,9 @@ import { hasIndexingPlugin } from "@kilocode/kilo-indexing/detect" import { Account } from "../../../src/account/account" import { Auth } from "../../../src/auth" import { Config } from "../../../src/config/config" +import type { ConfigPlugin } from "../../../src/config/plugin" +import { KilocodeDefaultPlugins } from "../../../src/kilocode/config/default-plugins" +import { INDEXING_PLUGIN } from "../../../src/kilocode/indexing-feature" import * as CrossSpawnSpawner from "@opencode-ai/core/cross-spawn-spawner" import { Env } from "../../../src/env" import { AppFileSystem } from "@opencode-ai/core/filesystem" @@ -50,6 +53,28 @@ describe("kilocode default indexing plugin", () => { await disposeAllInstances() }) + test("injects indexing without registering an external plugin origin", () => { + const config: { plugin?: ConfigPlugin.Spec[]; plugin_origins?: ConfigPlugin.Origin[] } = {} + + KilocodeDefaultPlugins.apply(config, { disabled: false }) + + expect(hasIndexingPlugin(config.plugin ?? [])).toBe(true) + expect(config.plugin_origins).toBeUndefined() + }) + + test("removes a persisted indexing marker from external plugin origins", () => { + const external: ConfigPlugin.Origin = { spec: "global-plugin", source: "global", scope: "global" } + const config = { + plugin: [INDEXING_PLUGIN, external.spec], + plugin_origins: [{ spec: INDEXING_PLUGIN, source: "global", scope: "global" as const }, external], + } + + KilocodeDefaultPlugins.apply(config, { disabled: true }) + + expect(config.plugin).toEqual([INDEXING_PLUGIN, external.spec]) + expect(config.plugin_origins).toEqual([external]) + }) + test("does not hard-enable indexing plugin when default plugins are disabled", async () => { const prev = process.env["KILO_DISABLE_DEFAULT_PLUGINS"] process.env["KILO_DISABLE_DEFAULT_PLUGINS"] = "true"