feat(FN-3158): migrate roadmap domain modules to fusion-plugin-roadmap pack

The merge extracts the roadmap domain into a standalone plugin package (`plugins/fusion-plugin-roadmap`), wiring it into the CLI bundle and dashboard scaffold, with new modules for roadmap types, store, ordering, and handoff logic. A secondary change normalizes shell host bootstrap, introducing `She

Fusion-Task-Id: FN-3158
This commit is contained in:
Fusion
2026-05-07 23:17:56 -07:00
committed by gsxdsm
parent a6d019d70a
commit ae2baa09ee
18 changed files with 1936 additions and 35 deletions

View File

@@ -1,5 +1,6 @@
import { readFileSync } from "node:fs";
import { resolve } from "node:path";
import { describe, expect, it } from "vitest";
import { RoadmapStore as CoreRoadmapStore } from "@fusion/core";
import plugin, {
RoadmapStore,
applyRoadmapFeatureReorder,
@@ -14,12 +15,33 @@ import plugin, {
} from "../index.js";
describe("fusion-plugin-roadmap package surface", () => {
it("keeps manifest and plugin entry metadata aligned", () => {
const manifest = JSON.parse(readFileSync(resolve(process.cwd(), "manifest.json"), "utf8")) as {
id: string;
version: string;
dashboardViews?: Array<{ viewId: string }>;
};
expect(plugin.manifest.id).toBe(manifest.id);
expect(plugin.manifest.version).toBe(manifest.version);
expect(plugin.dashboardViews?.[0]?.viewId).toBe(manifest.dashboardViews?.[0]?.viewId);
});
it("declares expected package exports", () => {
const pkg = JSON.parse(readFileSync(resolve(process.cwd(), "package.json"), "utf8")) as {
exports: Record<string, unknown>;
};
expect(pkg.exports).toHaveProperty(".");
expect(pkg.exports).toHaveProperty("./server");
expect(pkg.exports).toHaveProperty("./dashboard-view");
});
it("exports plugin manifest with roadmap id", () => {
expect(plugin.manifest.id).toBe("fusion-plugin-roadmap");
});
it("re-exports roadmap domain symbols", () => {
expect(RoadmapStore).toBe(CoreRoadmapStore);
expect(typeof normalizeRoadmapMilestoneOrder).toBe("function");
expect(typeof applyRoadmapMilestoneReorder).toBe("function");
expect(typeof normalizeRoadmapFeatureOrder).toBe("function");