Files
fusion/plugins/fusion-plugin-quality/src/dashboard-interop.d.ts
gsxdsm 9b8edf06c4 fix(FN-2127): Quality experimental gate, done-task worktrees, hub layout (#2164)
## Summary

Follow-up on **#2127** (Quality plugin already on `main`). This PR only
lands the remaining Quality deltas that were not merged:

- **Experimental gate fix** — `TaskStore.getSettings()` is async; the
gate now awaits merged settings so enabling
`experimentalFeatures.qualityPlugin` actually works, and status-bearing
errors return structured `{ status, body }` instead of collapsing to
hard failures
- **Done-task QA worktrees** — when a task has no live worktree (typical
after land), preview/task runs create a disposable checkout under
`.fusion/quality-qa/` at the task branch or merge commit so processes
run the **done task’s code**, not project root
- **Hub layout** — shared `ViewHeader` + dashboard spacing/typography so
Quality matches Insights / Compound Engineering / Goals

Scoped to `plugins/fusion-plugin-quality/**` only (rebased onto current
`main`; duplicate plugin-landing commits dropped).

## Test plan

- [ ] Enable **Settings → Experimental → Quality Plugin**, restart if
routes were cold
- [ ] Quality hub: header matches other views; refresh + presets work
- [ ] Done task → QA tab → Start preview uses QA worktree at
branch/merge commit (not project root)
- [ ] Active task with live worktree still uses that worktree
- [ ] Flag off: clear experimental-disabled error (not generic empty
failure)
- [ ] `pnpm --filter @fusion-plugin-examples/quality test` (32 tests)
2026-07-16 00:16:12 -07:00

24 lines
739 B
TypeScript

// Ambient host interop (no runtime dependency on @fusion/dashboard).
// Vite aliases resolve these to the real dashboard sources at build time.
// Mirrors fusion-plugin-compound-engineering/src/dashboard-interop.d.ts.
declare module "@fusion/dashboard/app/plugins/types" {
export interface PluginDashboardViewContext {
projectId?: string;
}
}
declare module "@fusion/dashboard/app/components/ViewHeader" {
import type { ComponentType, ReactNode } from "react";
import type { LucideProps } from "lucide-react";
export interface ViewHeaderProps {
icon: ComponentType<LucideProps>;
title: string;
actions?: ReactNode;
titleId?: string;
}
export function ViewHeader(props: ViewHeaderProps): ReactNode;
}