






















@@ -213,6 +213,117 @@ describe("skill-workshop", () => {
213213});
214214});
215215216+it("uses live runtime config for prompt-build guidance enablement", async () => {
217+let configFile: Record<string, unknown> = {
218+plugins: {
219+entries: {
220+"skill-workshop": {
221+config: {
222+approvalPolicy: "auto",
223+},
224+},
225+},
226+},
227+};
228+const on = vi.fn();
229+const api = createTestPluginApi({
230+pluginConfig: { approvalPolicy: "auto" },
231+runtime: {
232+config: {
233+loadConfig: () => configFile,
234+},
235+} as never,
236+ on,
237+});
238+239+plugin.register(api);
240+241+const hook = on.mock.calls.find((call) => call[0] === "before_prompt_build")?.[1];
242+expect(hook).toBeTypeOf("function");
243+244+configFile = {
245+plugins: {
246+entries: {
247+"skill-workshop": {
248+config: {
249+enabled: false,
250+},
251+},
252+},
253+},
254+};
255+256+await expect(hook?.({}, {})).resolves.toBeUndefined();
257+});
258+259+it("uses live runtime config for tool approval policy", async () => {
260+const workspaceDir = await makeTempDir();
261+const stateDir = await makeTempDir();
262+let configFile: Record<string, unknown> = {
263+plugins: {
264+entries: {
265+"skill-workshop": {
266+config: {
267+approvalPolicy: "pending",
268+},
269+},
270+},
271+},
272+};
273+let tool: AnyAgentTool | undefined;
274+let toolFactory:
275+| ((ctx: { workspaceDir?: string }) => AnyAgentTool | AnyAgentTool[] | null | undefined)
276+| undefined;
277+const api = createTestPluginApi({
278+pluginConfig: { approvalPolicy: "pending" },
279+runtime: {
280+agent: {
281+resolveAgentWorkspaceDir: () => workspaceDir,
282+},
283+state: {
284+resolveStateDir: () => stateDir,
285+},
286+config: {
287+loadConfig: () => configFile,
288+},
289+} as never,
290+registerTool(registered) {
291+toolFactory = typeof registered === "function" ? registered : undefined;
292+const resolved =
293+typeof registered === "function" ? registered({ workspaceDir }) : registered;
294+tool = Array.isArray(resolved) ? resolved[0] : (resolved ?? undefined);
295+},
296+});
297+298+plugin.register(api);
299+300+configFile = {
301+plugins: {
302+entries: {
303+"skill-workshop": {
304+config: {
305+approvalPolicy: "auto",
306+},
307+},
308+},
309+},
310+};
311+const refreshedTool = toolFactory?.({ workspaceDir });
312+tool = Array.isArray(refreshedTool) ? refreshedTool[0] : (refreshedTool ?? undefined);
313+314+const result = await tool?.execute?.("call-1", {
315+action: "suggest",
316+skillName: "screenshot-asset-workflow",
317+description: "Screenshot asset workflow",
318+body: "Verify dimensions, optimize the PNG, and run the relevant gate.",
319+});
320+321+expect(result?.details).toMatchObject({ status: "applied" });
322+await expect(
323+fs.access(path.join(workspaceDir, "skills", "screenshot-asset-workflow", "SKILL.md")),
324+).resolves.toBeUndefined();
325+});
326+216327it("skips agent_end hook wiring when auto-capture is disabled", () => {
217328const on = vi.fn();
218329const api = createTestPluginApi({
@@ -226,6 +337,77 @@ describe("skill-workshop", () => {
226337expect(on).not.toHaveBeenCalledWith("agent_end", expect.any(Function));
227338});
228339340+it("uses live runtime config to skip capture when review mode turns off", async () => {
341+const workspaceDir = await makeTempDir();
342+const stateDir = await makeTempDir();
343+let configFile: Record<string, unknown> = {
344+plugins: {
345+entries: {
346+"skill-workshop": {
347+config: {
348+approvalPolicy: "auto",
349+reviewMode: "hybrid",
350+},
351+},
352+},
353+},
354+};
355+const logger = { info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() };
356+const on = vi.fn();
357+const api = createTestPluginApi({
358+pluginConfig: { approvalPolicy: "auto", reviewMode: "hybrid" },
359+ logger,
360+runtime: {
361+agent: {
362+resolveAgentWorkspaceDir: () => workspaceDir,
363+},
364+state: {
365+resolveStateDir: () => stateDir,
366+},
367+config: {
368+loadConfig: () => configFile,
369+},
370+} as never,
371+ on,
372+});
373+374+plugin.register(api);
375+376+configFile = {
377+plugins: {
378+entries: {
379+"skill-workshop": {
380+config: {
381+approvalPolicy: "auto",
382+reviewMode: "off",
383+},
384+},
385+},
386+},
387+};
388+389+const handler = on.mock.calls.find((call) => call[0] === "agent_end")?.[1];
390+expect(handler).toBeTypeOf("function");
391+await handler?.(
392+{
393+success: true,
394+messages: [
395+{
396+role: "user",
397+content:
398+"From now on when asked for animated GIFs, verify the file is actually animated.",
399+},
400+],
401+},
402+{ workspaceDir },
403+);
404+405+await expect(
406+fs.access(path.join(workspaceDir, "skills", "animated-gif-workflow", "SKILL.md")),
407+).rejects.toMatchObject({ code: "ENOENT" });
408+expect(logger.info).not.toHaveBeenCalledWith("skill-workshop: applied animated-gif-workflow");
409+});
410+229411it("skips agent_end hook wiring when review mode is off", () => {
230412const on = vi.fn();
231413const api = createTestPluginApi({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。