





















@@ -96,6 +96,78 @@ describe("SkillsService", () => {
9696expect(after.entries.map((entry) => entry.name)).toContain("service-zero-beta");
9797});
989899+it("does not cache explicit indexes when skill watching is disabled", async () => {
100+const workspaceDir = await makeTempWorkspace();
101+await writeWorkspaceSkills(workspaceDir, [
102+{ name: "service-watch-alpha", description: "Alpha workflow" },
103+]);
104+const service = new SkillsService();
105+const roots = isolatedSkillRoots(workspaceDir);
106+const config = { skills: { load: { watch: false } } } satisfies OpenClawConfig;
107+108+const before = service.getIndex({ workspaceDir, ...roots, config, snapshotVersion: 1 });
109+await writeWorkspaceSkills(workspaceDir, [
110+{ name: "service-watch-beta", description: "Beta workflow" },
111+]);
112+const after = service.getIndex({ workspaceDir, ...roots, config, snapshotVersion: 1 });
113+114+expect(after).not.toBe(before);
115+expect(before.entries.map((entry) => entry.name)).not.toContain("service-watch-beta");
116+expect(after.entries.map((entry) => entry.name)).toContain("service-watch-beta");
117+});
118+119+it("keeps snapshots uncached even when callers pass a positive version", async () => {
120+const workspaceDir = await makeTempWorkspace();
121+await writeWorkspaceSkills(workspaceDir, [
122+{ name: "service-snapshot-alpha", description: "Alpha workflow" },
123+]);
124+const service = new SkillsService();
125+const roots = isolatedSkillRoots(workspaceDir);
126+127+const before = service.buildSnapshot(workspaceDir, { ...roots, snapshotVersion: 1 });
128+await writeWorkspaceSkills(workspaceDir, [
129+{ name: "service-snapshot-beta", description: "Beta workflow" },
130+]);
131+const after = service.buildSnapshot(workspaceDir, { ...roots, snapshotVersion: 1 });
132+133+expect(before.skills.map((skill) => skill.name)).not.toContain("service-snapshot-beta");
134+expect(after.skills.map((skill) => skill.name)).toContain("service-snapshot-beta");
135+});
136+137+it("bounds cached indexes across workspace scopes", async () => {
138+const service = new SkillsService();
139+const workspaces = await Promise.all(
140+Array.from({ length: 17 }, async (_, index) => {
141+const workspaceDir = await makeTempWorkspace();
142+await writeWorkspaceSkills(workspaceDir, [
143+{ name: `service-lru-${index}`, description: "Cached workflow" },
144+]);
145+return workspaceDir;
146+}),
147+);
148+const firstWorkspace = workspaces[0]!;
149+const first = service.getIndex({
150+workspaceDir: firstWorkspace,
151+ ...isolatedSkillRoots(firstWorkspace),
152+snapshotVersion: 1,
153+});
154+155+for (const workspaceDir of workspaces.slice(1)) {
156+service.getIndex({
157+ workspaceDir,
158+ ...isolatedSkillRoots(workspaceDir),
159+snapshotVersion: 1,
160+});
161+}
162+const firstAgain = service.getIndex({
163+workspaceDir: firstWorkspace,
164+ ...isolatedSkillRoots(firstWorkspace),
165+snapshotVersion: 1,
166+});
167+168+expect(firstAgain).not.toBe(first);
169+});
170+99171it("includes plugin config in the versioned cache key", async () => {
100172const workspaceDir = await makeTempWorkspace();
101173const roots = isolatedSkillRoots(workspaceDir);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。