






















@@ -37,6 +37,12 @@ const state = vi.hoisted(() => ({
3737isThinkingLevelSupportedMock: vi.fn((_args: unknown) => true),
3838resolveThinkingDefaultMock: vi.fn((_args: unknown) => "low"),
3939loadManifestModelCatalogMock: vi.fn(() => []),
40+buildWorkspaceSkillSnapshotMock: vi.fn((..._args: unknown[]): unknown => ({
41+prompt: "",
42+skills: [],
43+resolvedSkills: [],
44+version: 0,
45+})),
4046authProfileStoreMock: { profiles: {} } as { profiles: Record<string, unknown> },
4147sessionEntryMock: undefined as unknown,
4248sessionStoreMock: undefined as unknown,
@@ -415,7 +421,8 @@ vi.mock("./provider-auth-aliases.js", () => ({
415421}));
416422417423vi.mock("./skills.js", () => ({
418-buildWorkspaceSkillSnapshot: () => ({}),
424+buildWorkspaceSkillSnapshot: (workspaceDir: string, opts: unknown) =>
425+state.buildWorkspaceSkillSnapshotMock(workspaceDir, opts),
419426}));
420427421428vi.mock("./skills/filter.js", () => ({
@@ -565,6 +572,12 @@ describe("agentCommand – LiveSessionModelSwitchError retry", () => {
565572state.authProfileStoreMock = { profiles: {} };
566573state.sessionEntryMock = undefined;
567574state.sessionStoreMock = undefined;
575+state.buildWorkspaceSkillSnapshotMock.mockReturnValue({
576+prompt: "",
577+skills: [],
578+resolvedSkills: [],
579+version: 0,
580+});
568581state.deliverAgentCommandResultMock.mockResolvedValue(undefined);
569582state.updateSessionStoreAfterAgentRunMock.mockResolvedValue(undefined);
570583state.trajectoryFlushMock.mockResolvedValue(undefined);
@@ -844,6 +857,59 @@ describe("agentCommand – LiveSessionModelSwitchError retry", () => {
844857expect(state.clearSessionAuthProfileOverrideMock).not.toHaveBeenCalled();
845858});
846859860+it("hydrates stripped persisted skill snapshots before running the CLI path", async () => {
861+const persistedSnapshot = {
862+prompt: "persisted prompt",
863+skills: [{ name: "cli-skill" }],
864+skillFilter: ["cli-skill"],
865+version: 0,
866+};
867+const rebuiltSkills = [
868+{
869+name: "cli-skill",
870+description: "CLI skill",
871+filePath: "/tmp/workspace/skills/cli-skill/SKILL.md",
872+baseDir: "/tmp/workspace/skills/cli-skill",
873+source: "# CLI skill",
874+},
875+];
876+state.sessionEntryMock = {
877+sessionId: "session-1",
878+updatedAt: Date.now(),
879+skillsSnapshot: persistedSnapshot,
880+};
881+state.buildWorkspaceSkillSnapshotMock.mockReturnValue({
882+prompt: "rebuilt prompt",
883+skills: [{ name: "different-skill" }],
884+resolvedSkills: rebuiltSkills,
885+version: 99,
886+});
887+state.runWithModelFallbackMock.mockImplementation(async (params: FallbackRunnerParams) => {
888+const result = await params.run(params.provider, params.model);
889+return {
890+ result,
891+provider: params.provider,
892+model: params.model,
893+attempts: [],
894+};
895+});
896+state.runAgentAttemptMock.mockResolvedValue(makeSuccessResult("anthropic", "claude"));
897+898+await runBasicAgentCommand();
899+900+const attemptParams = state.runAgentAttemptMock.mock.calls[0]?.[0] as
901+| { skillsSnapshot?: Record<string, unknown> }
902+| undefined;
903+expect(attemptParams?.skillsSnapshot).toMatchObject({
904+prompt: "persisted prompt",
905+skills: [{ name: "cli-skill" }],
906+skillFilter: ["cli-skill"],
907+version: 0,
908+resolvedSkills: rebuiltSkills,
909+});
910+expect(state.buildWorkspaceSkillSnapshotMock).toHaveBeenCalledTimes(1);
911+});
912+847913it("classifies empty embedded run results before model fallback accepts them", async () => {
848914let observedClassification: unknown;
849915state.runWithModelFallbackMock.mockImplementation(async (params: FallbackRunnerParams) => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。