diff --git a/.changeset/workflow-graph-editor-and-bundled-plugins.md b/.changeset/workflow-graph-editor-and-bundled-plugins.md index 46e4effd53..ebef3b8410 100644 --- a/.changeset/workflow-graph-editor-and-bundled-plugins.md +++ b/.changeset/workflow-graph-editor-and-bundled-plugins.md @@ -6,3 +6,4 @@ Fix the workflow graph editor opening invisibly and bundle the Compound Engineer - The "Graph editor" button now actually shows the editor: its overlay was rendered without the `open` class, leaving it `display: none`, so opening it looked like the workflow steps view was just dismissed. - `fusion-plugin-compound-engineering` and `fusion-plugin-roadmap` are now listed in the dashboard's built-in plugins, so they appear under Settings → Built-in Plugins (they were implemented and registered but missing from the list). +- Installing Compound Engineering (and CLI Printing Press) from Settings → Built-in Plugins no longer fails with "Plugin manifest not found": both ids are now in the dashboard's bundled-plugin fallback set, and the Compound Engineering plugin is staged into `dist/plugins/` so packaged installs can resolve it. diff --git a/packages/cli/tsup.config.ts b/packages/cli/tsup.config.ts index 581c768372..f02188255e 100644 --- a/packages/cli/tsup.config.ts +++ b/packages/cli/tsup.config.ts @@ -41,6 +41,8 @@ const reportsPluginSrc = join(__dirname, "..", "..", "plugins", "fusion-plugin-r const reportsPluginDest = join(__dirname, "dist", "plugins", "fusion-plugin-reports"); const cliPrintingPressPluginSrc = join(__dirname, "..", "..", "plugins", "fusion-plugin-cli-printing-press"); const cliPrintingPressPluginDest = join(__dirname, "dist", "plugins", "fusion-plugin-cli-printing-press"); +const compoundEngineeringPluginSrc = join(__dirname, "..", "..", "plugins", "fusion-plugin-compound-engineering"); +const compoundEngineeringPluginDest = join(__dirname, "dist", "plugins", "fusion-plugin-compound-engineering"); const dashboardClientStub = `
@@ -241,6 +243,12 @@ const cliBuildConfig = { destDir: roadmapPluginDest, }); + await bundlePluginEntry({ + pluginId: "fusion-plugin-compound-engineering", + srcDir: compoundEngineeringPluginSrc, + destDir: compoundEngineeringPluginDest, + }); + if (existsSync(reportsPluginDest)) { rmSync(reportsPluginDest, { recursive: true, force: true }); } diff --git a/packages/dashboard/src/__tests__/plugin-routes.test.ts b/packages/dashboard/src/__tests__/plugin-routes.test.ts index 5ca7a8adcb..62dce6a2f6 100644 --- a/packages/dashboard/src/__tests__/plugin-routes.test.ts +++ b/packages/dashboard/src/__tests__/plugin-routes.test.ts @@ -549,6 +549,74 @@ describe("POST /api/plugins mode:install — bundled plugin path fallback", () = ); }); + it("installs bundled compound engineering plugin when relative path misses cwd", async () => { + const bundledManifest = { + ...VALID_MANIFEST, + id: "fusion-plugin-compound-engineering", + name: "Compound Engineering", + }; + // Only the staged bundled copy under dist/plugins exists — the + // cwd-relative path must miss so the bundled fallback is exercised. + mockExistsSync.mockImplementation((p: string) => p.includes("dist/plugins/fusion-plugin-compound-engineering/manifest.json")); + mockAccess.mockImplementation((p: string) => { + if (p.includes("dist/plugins/fusion-plugin-compound-engineering")) return Promise.resolve(); + return Promise.reject(new Error("not found")); + }); + mockReadFile.mockResolvedValue(JSON.stringify(bundledManifest)); + (pluginStore.registerPlugin as ReturnType