@runfusion/fusion 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/README.md +6 -0
  2. package/dist/bin.js +47492 -45420
  3. package/dist/client/assets/{AgentDetailView-ZbHEbYRT.js → AgentDetailView-Cv-vgOj3.js} +3 -3
  4. package/dist/client/assets/{AgentsView-B3jYk8Kt.js → AgentsView-D6Zi5zfP.js} +4 -4
  5. package/dist/client/assets/ChatView-CAHjY9uO.js +1 -0
  6. package/dist/client/assets/{DevServerView-DyGDEiBP.js → DevServerView--_WBvIDQ.js} +1 -1
  7. package/dist/client/assets/{DirectoryPicker-D5UIeIl6.js → DirectoryPicker-xedtR-Rd.js} +1 -1
  8. package/dist/client/assets/{DocumentsView-DNHu1T8K.js → DocumentsView-Bg2oaZks.js} +1 -1
  9. package/dist/client/assets/{EvalsView-CpRobtDi.js → EvalsView-B3uOCXfr.js} +1 -1
  10. package/dist/client/assets/{ExperimentalAgentOnboardingModal-DOY_oZi7.js → ExperimentalAgentOnboardingModal-Bx6yXVS5.js} +1 -1
  11. package/dist/client/assets/{InsightsView-vp0RE8Mg.js → InsightsView-Q1zvtF4F.js} +1 -1
  12. package/dist/client/assets/{MemoryView-PSc5lGJt.js → MemoryView-xcN_eouf.js} +1 -1
  13. package/dist/client/assets/{NodesView-DMj6HGeC.js → NodesView-RxXg58_Q.js} +1 -1
  14. package/dist/client/assets/{PiExtensionsManager-DL_QcN56.js → PiExtensionsManager-Cc8aAZXg.js} +2 -2
  15. package/dist/client/assets/{PluginManager-BtYKm8IT.js → PluginManager-BEkyBajl.js} +1 -1
  16. package/dist/client/assets/{ResearchView-BzCcDAS4.css → ResearchView-BEI4ZSGs.css} +1 -1
  17. package/dist/client/assets/ResearchView-CERNf7sJ.js +1 -0
  18. package/dist/client/assets/{SettingsModal-CUCyaAyE.js → SettingsModal-B1r0yASu.js} +1 -1
  19. package/dist/client/assets/SettingsModal-BLsac7CJ.js +31 -0
  20. package/dist/client/assets/SettingsModal-Cis-4Lot.css +1 -0
  21. package/dist/client/assets/{SetupWizardModal-BKscasuh.js → SetupWizardModal-D1q548_L.js} +1 -1
  22. package/dist/client/assets/{SkillsView-BdELqTy7.js → SkillsView-ClLM6u6p.js} +1 -1
  23. package/dist/client/assets/StashRecoveryView-B_8WIQEo.css +1 -0
  24. package/dist/client/assets/StashRecoveryView-ze0pEZ5U.js +1 -0
  25. package/dist/client/assets/{TodoView-DFNGBDNV.js → TodoView-CTmIfy2M.js} +1 -1
  26. package/dist/client/assets/createLucideIcon-BazL2hk5.js +21 -0
  27. package/dist/client/assets/dashboard-view-4xAN3yO5.js +21 -0
  28. package/dist/client/assets/dashboard-view-BkTMSZYn.css +1 -0
  29. package/dist/client/assets/dashboard-view-CyWN-d02.js +63 -0
  30. package/dist/client/assets/dashboard-view-DdGlfuu-.css +1 -0
  31. package/dist/client/assets/{folder-open-k1xmUMyr.js → folder-open-BZuKESeq.js} +1 -1
  32. package/dist/client/assets/index-Bdw6llW6.js +692 -0
  33. package/dist/client/assets/index-CZGlyJuS.css +1 -0
  34. package/dist/client/assets/{star-ne32r3Y4.js → star-D75YKEq-.js} +1 -1
  35. package/dist/client/assets/{upload-MS-2Gx53.js → upload-BYYTgWFj.js} +1 -1
  36. package/dist/client/assets/{users-C519GSjH.js → users-RS90Aii3.js} +1 -1
  37. package/dist/client/index.html +2 -2
  38. package/dist/client/version.json +1 -1
  39. package/dist/droid-cli/package.json +1 -1
  40. package/dist/extension.js +4340 -3059
  41. package/dist/pi-claude-cli/package.json +1 -1
  42. package/dist/plugins/fusion-plugin-cli-printing-press/manifest.json +6 -0
  43. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +26 -0
  44. package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/manifest.test.ts +20 -0
  45. package/dist/plugins/fusion-plugin-cli-printing-press/src/index.ts +14 -0
  46. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  47. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  48. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  49. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  50. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  51. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  52. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  53. package/dist/plugins/fusion-plugin-roadmap/{src/dashboard/RoadmapsView.css → bundled.css} +13 -219
  54. package/dist/plugins/fusion-plugin-roadmap/bundled.js +29535 -0
  55. package/dist/plugins/fusion-plugin-roadmap/package.json +4 -41
  56. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  57. package/package.json +2 -3
  58. package/dist/client/assets/ChatView-DhPkiEGs.js +0 -1
  59. package/dist/client/assets/ResearchView-BhWqfdV0.js +0 -1
  60. package/dist/client/assets/SettingsModal-BAgB4_AR.js +0 -31
  61. package/dist/client/assets/SettingsModal-DzsLquBu.css +0 -1
  62. package/dist/client/assets/index-Qq2JOOWx.css +0 -1
  63. package/dist/client/assets/index-TFYXEVpn.js +0 -692
  64. package/dist/plugins/fusion-plugin-roadmap/src/__tests__/api-client.test.ts +0 -101
  65. package/dist/plugins/fusion-plugin-roadmap/src/__tests__/index.test.ts +0 -92
  66. package/dist/plugins/fusion-plugin-roadmap/src/__tests__/roadmap-routes.test.ts +0 -48
  67. package/dist/plugins/fusion-plugin-roadmap/src/__tests__/roadmap-suggestions.test.ts +0 -31
  68. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/RoadmapsView.tsx +0 -2559
  69. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/__tests__/RoadmapsView.test.tsx +0 -1144
  70. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/__tests__/useRoadmaps.test.ts +0 -1756
  71. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/api.ts +0 -70
  72. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/test-setup.ts +0 -7
  73. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/types.ts +0 -1
  74. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/useConfirm.ts +0 -8
  75. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/useRoadmaps.ts +0 -1188
  76. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/useViewportMode.ts +0 -20
  77. package/dist/plugins/fusion-plugin-roadmap/src/dashboard-view.tsx +0 -6
  78. package/dist/plugins/fusion-plugin-roadmap/src/index.ts +0 -74
  79. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-routes.ts +0 -1
  80. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-schema.ts +0 -41
  81. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-suggestions.d.ts +0 -15
  82. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-suggestions.ts +0 -15
  83. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.d.ts +0 -283
  84. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.d.ts.map +0 -1
  85. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.js +0 -21
  86. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.js.map +0 -1
  87. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.ts +0 -310
  88. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.d.ts +0 -5
  89. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.d.ts.map +0 -1
  90. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.js +0 -361
  91. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.js.map +0 -1
  92. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.ts +0 -408
  93. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.d.ts +0 -68
  94. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.d.ts.map +0 -1
  95. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.js +0 -300
  96. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.js.map +0 -1
  97. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.ts +0 -381
  98. package/dist/plugins/fusion-plugin-roadmap/src/server/index.d.ts +0 -3
  99. package/dist/plugins/fusion-plugin-roadmap/src/server/index.ts +0 -1
  100. package/dist/plugins/fusion-plugin-roadmap/src/store/__tests__/roadmap-handoff.test.ts +0 -445
  101. package/dist/plugins/fusion-plugin-roadmap/src/store/__tests__/roadmap-ordering.test.ts +0 -334
  102. package/dist/plugins/fusion-plugin-roadmap/src/store/__tests__/roadmap-store.test.ts +0 -1318
  103. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-handoff.ts +0 -163
  104. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.d.ts +0 -37
  105. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.d.ts.map +0 -1
  106. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.js +0 -188
  107. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.js.map +0 -1
  108. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.ts +0 -311
  109. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.d.ts +0 -299
  110. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.d.ts.map +0 -1
  111. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.js +0 -765
  112. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.js.map +0 -1
  113. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.ts +0 -1001
@@ -1,101 +0,0 @@
1
- /* @vitest-environment jsdom */
2
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
- import {
4
- createRoadmap,
5
- createRoadmapFeature,
6
- createRoadmapMilestone,
7
- deleteRoadmap,
8
- deleteRoadmapFeature,
9
- deleteRoadmapMilestone,
10
- fetchRoadmap,
11
- fetchRoadmapHandoff,
12
- fetchRoadmaps,
13
- generateFeatureSuggestions,
14
- generateMilestoneSuggestions,
15
- moveRoadmapFeature,
16
- reorderRoadmapFeatures,
17
- reorderRoadmapMilestones,
18
- updateRoadmap,
19
- updateRoadmapFeature,
20
- updateRoadmapMilestone,
21
- } from "../dashboard/api";
22
-
23
- describe("roadmap dashboard api client", () => {
24
- const fetchMock = vi.fn();
25
-
26
- beforeEach(() => {
27
- vi.stubGlobal("fetch", fetchMock);
28
- fetchMock.mockResolvedValue({
29
- ok: true,
30
- status: 200,
31
- json: async () => ({ ok: true }),
32
- });
33
- });
34
-
35
- afterEach(() => {
36
- vi.unstubAllGlobals();
37
- vi.restoreAllMocks();
38
- });
39
-
40
- it("uses plugin namespace for roadmap CRUD wrappers", async () => {
41
- await fetchRoadmaps("proj-1");
42
- await fetchRoadmap("RM-1", "proj-1");
43
- await createRoadmap({ title: "A" }, "proj-1");
44
- await updateRoadmap("RM-1", { title: "B" }, "proj-1");
45
- await deleteRoadmap("RM-1", "proj-1");
46
-
47
- expect(fetchMock.mock.calls[0][0]).toBe("/api/plugins/roadmap-planner/roadmaps?projectId=proj-1");
48
- expect(fetchMock.mock.calls[1][0]).toBe("/api/plugins/roadmap-planner/roadmaps/RM-1?projectId=proj-1");
49
- expect(fetchMock.mock.calls[2][0]).toBe("/api/plugins/roadmap-planner/roadmaps?projectId=proj-1");
50
- expect(fetchMock.mock.calls[3][0]).toBe("/api/plugins/roadmap-planner/roadmaps/RM-1?projectId=proj-1");
51
- expect(fetchMock.mock.calls[4][0]).toBe("/api/plugins/roadmap-planner/roadmaps/RM-1?projectId=proj-1");
52
- });
53
-
54
- it("uses plugin namespace for milestone and feature reorder/move + suggestions + handoff", async () => {
55
- await createRoadmapMilestone("RM-1", { title: "M" }, "proj-1");
56
- await updateRoadmapMilestone("RMS-1", { title: "M2" }, "proj-1");
57
- await deleteRoadmapMilestone("RMS-1", "proj-1");
58
- await reorderRoadmapMilestones("RM-1", ["RMS-1", "RMS-2"], "proj-1");
59
-
60
- await createRoadmapFeature("RMS-1", { title: "F" }, "proj-1");
61
- await updateRoadmapFeature("RF-1", { title: "F2" }, "proj-1");
62
- await deleteRoadmapFeature("RF-1", "proj-1");
63
- await reorderRoadmapFeatures("RMS-1", ["RF-1", "RF-2"], "proj-1");
64
- await moveRoadmapFeature("RF-1", "RMS-2", 0, "proj-1");
65
-
66
- await generateMilestoneSuggestions("RM-1", "goal", 3, "proj-1");
67
- await generateFeatureSuggestions("RMS-1", { prompt: "p", count: 2 }, "proj-1");
68
- await fetchRoadmapHandoff("RM-1", "proj-1");
69
-
70
- const calledUrls = fetchMock.mock.calls.map((call) => String(call[0]));
71
- expect(calledUrls).toContain("/api/plugins/roadmap-planner/roadmaps/RM-1/milestones?projectId=proj-1");
72
- expect(calledUrls).toContain("/api/plugins/roadmap-planner/roadmaps/milestones/RMS-1?projectId=proj-1");
73
- expect(calledUrls).toContain("/api/plugins/roadmap-planner/roadmaps/RM-1/milestones/reorder?projectId=proj-1");
74
- expect(calledUrls).toContain("/api/plugins/roadmap-planner/roadmaps/milestones/RMS-1/features/reorder?projectId=proj-1");
75
- expect(calledUrls).toContain("/api/plugins/roadmap-planner/roadmaps/features/RF-1/move?projectId=proj-1");
76
- expect(calledUrls).toContain("/api/plugins/roadmap-planner/roadmaps/RM-1/suggestions/milestones?projectId=proj-1");
77
- expect(calledUrls).toContain("/api/plugins/roadmap-planner/roadmaps/milestones/RMS-1/suggestions/features?projectId=proj-1");
78
- expect(calledUrls).toContain("/api/plugins/roadmap-planner/roadmaps/RM-1/handoff?projectId=proj-1");
79
- });
80
-
81
- it("surfaces server error body when available", async () => {
82
- fetchMock.mockResolvedValueOnce({
83
- ok: false,
84
- status: 400,
85
- statusText: "Bad Request",
86
- json: async () => ({ error: "invalid payload" }),
87
- });
88
-
89
- await expect(fetchRoadmaps()).rejects.toThrow("invalid payload");
90
- });
91
-
92
- it("returns undefined for 204 responses", async () => {
93
- fetchMock.mockResolvedValueOnce({
94
- ok: true,
95
- status: 204,
96
- json: async () => ({}),
97
- });
98
-
99
- await expect(deleteRoadmap("RM-1")).resolves.toBeUndefined();
100
- });
101
- });
@@ -1,92 +0,0 @@
1
- import { mkdtempSync, readFileSync } from "node:fs";
2
- import { tmpdir } from "node:os";
3
- import { join, resolve } from "node:path";
4
- import { rm } from "node:fs/promises";
5
- import { Database } from "@fusion/core";
6
- import { afterEach, describe, expect, it } from "vitest";
7
- import plugin, {
8
- RoadmapStore,
9
- applyRoadmapFeatureReorder,
10
- applyRoadmapMilestoneReorder,
11
- mapAllFeaturesToTaskHandoffs,
12
- mapFeatureToTaskHandoff,
13
- mapRoadmapToMissionHandoff,
14
- mapRoadmapWithHierarchyToMissionHandoff,
15
- moveRoadmapFeature,
16
- normalizeRoadmapFeatureOrder,
17
- normalizeRoadmapMilestoneOrder,
18
- } from "../index.js";
19
-
20
- describe("roadmap-planner package surface", () => {
21
- const tmpDirs: string[] = [];
22
-
23
- afterEach(async () => {
24
- await Promise.all(tmpDirs.map((dir) => rm(dir, { recursive: true, force: true })));
25
- tmpDirs.length = 0;
26
- });
27
-
28
- it("keeps manifest and plugin entry metadata aligned", () => {
29
- const manifest = JSON.parse(readFileSync(resolve(process.cwd(), "manifest.json"), "utf8")) as {
30
- id: string;
31
- version: string;
32
- dashboardViews?: Array<{ viewId: string }>;
33
- };
34
-
35
- expect(plugin.manifest.id).toBe(manifest.id);
36
- expect(plugin.manifest.version).toBe(manifest.version);
37
- expect(plugin.dashboardViews?.[0]?.viewId).toBe(manifest.dashboardViews?.[0]?.viewId);
38
- });
39
-
40
- it("declares expected package exports", () => {
41
- const pkg = JSON.parse(readFileSync(resolve(process.cwd(), "package.json"), "utf8")) as {
42
- exports: Record<string, unknown>;
43
- };
44
-
45
- expect(pkg.exports).toHaveProperty(".");
46
- expect(pkg.exports).toHaveProperty("./server");
47
- expect(pkg.exports).toHaveProperty("./dashboard-view");
48
- });
49
-
50
- it("exports plugin manifest with roadmap id", () => {
51
- expect(plugin.manifest.id).toBe("roadmap-planner");
52
- });
53
-
54
- it("registers onSchemaInit hook that creates roadmap tables and indexes", () => {
55
- const tmpDir = mkdtempSync(join(tmpdir(), "roadmap-plugin-schema-test-"));
56
- tmpDirs.push(tmpDir);
57
-
58
- const db = new Database(join(tmpDir, ".fusion"), { inMemory: true });
59
- db.init();
60
-
61
- expect(plugin.hooks?.onSchemaInit).toBeTypeOf("function");
62
- plugin.hooks?.onSchemaInit?.(db);
63
-
64
- const tables = db.prepare("SELECT name FROM sqlite_master WHERE type = 'table'").all() as Array<{ name: string }>;
65
- const indexes = db.prepare("SELECT name FROM sqlite_master WHERE type = 'index'").all() as Array<{ name: string }>;
66
-
67
- expect(tables.map((row) => row.name)).toEqual(expect.arrayContaining([
68
- "roadmaps",
69
- "roadmap_milestones",
70
- "roadmap_features",
71
- ]));
72
- expect(indexes.map((row) => row.name)).toEqual(expect.arrayContaining([
73
- "idxRoadmapMilestonesRoadmapOrder",
74
- "idxRoadmapFeaturesMilestoneOrder",
75
- ]));
76
-
77
- db.close();
78
- });
79
-
80
- it("re-exports roadmap domain symbols", () => {
81
- expect(typeof normalizeRoadmapMilestoneOrder).toBe("function");
82
- expect(typeof applyRoadmapMilestoneReorder).toBe("function");
83
- expect(typeof normalizeRoadmapFeatureOrder).toBe("function");
84
- expect(typeof applyRoadmapFeatureReorder).toBe("function");
85
- expect(typeof moveRoadmapFeature).toBe("function");
86
- expect(typeof mapFeatureToTaskHandoff).toBe("function");
87
- expect(typeof mapRoadmapToMissionHandoff).toBe("function");
88
- expect(typeof mapRoadmapWithHierarchyToMissionHandoff).toBe("function");
89
- expect(typeof mapAllFeaturesToTaskHandoffs).toBe("function");
90
- expect(typeof RoadmapStore).toBe("function");
91
- });
92
- });
@@ -1,48 +0,0 @@
1
- import { describe, it, expect, vi } from "vitest";
2
- import { createRoadmapPluginRoutes } from "../roadmap-routes.js";
3
-
4
- function createCtx() {
5
- return {
6
- pluginId: "roadmap-planner",
7
- taskStore: {
8
- getDatabase: () => ({}),
9
- getRootDir: () => "/tmp/project",
10
- getRoadmapStore: () => ({
11
- getRoadmap: vi.fn(() => ({ id: "RM-1", title: "R" })),
12
- getMilestone: vi.fn(() => ({ id: "MS-1", roadmapId: "RM-1", title: "M" })),
13
- listFeatures: vi.fn(() => []),
14
- }),
15
- },
16
- settings: {},
17
- logger: { info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() },
18
- emitEvent: vi.fn(),
19
- } as any;
20
- }
21
-
22
- describe("createRoadmapPluginRoutes", () => {
23
- it("includes PATCH roadmap routes", () => {
24
- const routes = createRoadmapPluginRoutes();
25
- expect(routes.some((r) => r.method === "PATCH" && r.path === "/roadmaps/:roadmapId")).toBe(true);
26
- });
27
-
28
- it("returns 400 for invalid milestone suggestions body", async () => {
29
- const route = createRoadmapPluginRoutes().find((r) => r.path === "/roadmaps/:roadmapId/suggestions/milestones");
30
- const result = await route!.handler({ params: { roadmapId: "RM-1" }, body: {} }, createCtx());
31
- expect(result).toMatchObject({ status: 400 });
32
- });
33
-
34
- it("returns 404 for milestone suggestions when roadmap is missing", async () => {
35
- const route = createRoadmapPluginRoutes().find((r) => r.path === "/roadmaps/:roadmapId/suggestions/milestones");
36
- const ctx = createCtx();
37
- const store = ctx.taskStore.getRoadmapStore();
38
- ctx.taskStore.getRoadmapStore = () => ({ ...store, getRoadmap: vi.fn(() => null) });
39
- const result = await route!.handler({ params: { roadmapId: "RM-404" }, body: { goalPrompt: "goal" } }, ctx);
40
- expect(result).toMatchObject({ status: 404 });
41
- });
42
-
43
- it("returns 503 for suggestions when createAiSession is unavailable", async () => {
44
- const route = createRoadmapPluginRoutes().find((r) => r.path === "/roadmaps/:roadmapId/suggestions/milestones");
45
- const result = await route!.handler({ params: { roadmapId: "RM-1" }, body: { goalPrompt: "goal" } }, createCtx());
46
- expect(result).toMatchObject({ status: 503 });
47
- });
48
- });
@@ -1,31 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
2
- import {
3
- __resetSuggestionState,
4
- __setCreateAiSessionFactory,
5
- generateMilestoneSuggestions,
6
- ServiceUnavailableError,
7
- } from "../roadmap-suggestions.js";
8
-
9
- describe("roadmap suggestion service", () => {
10
- beforeEach(() => {
11
- __resetSuggestionState();
12
- });
13
-
14
- it("throws when AI factory is unavailable", async () => {
15
- await expect(generateMilestoneSuggestions("goal", 1, "/tmp/project")).rejects.toBeInstanceOf(ServiceUnavailableError);
16
- });
17
-
18
- it("uses PluginContext createAiSession-compatible factory", async () => {
19
- const prompt = vi.fn().mockResolvedValue(undefined);
20
- __setCreateAiSessionFactory(async () => ({
21
- session: {
22
- prompt,
23
- state: { messages: [{ role: "assistant", content: '[{"title":"A"}]' }] },
24
- },
25
- }));
26
-
27
- const result = await generateMilestoneSuggestions("goal", 1, "/tmp/project");
28
- expect(prompt).toHaveBeenCalled();
29
- expect(result[0]?.title).toBe("A");
30
- });
31
- });