feat(FN-3637): establish canonical roadmap plugin ID and compatibility rout
Merged commits stabilize the Fusion roadmap plugin's identity and routing surface, establishing a canonical plugin ID and compatibility routes so the roadmap plugin integrates cleanly with the dashboard's plugin system. Added new roadmap-routes and roadmap-suggestions modules in the dashboard packag Fusion-Task-Id: FN-3637
This commit is contained in:
@@ -573,8 +573,8 @@ Route handlers may return either plain JSON values or a `PluginRouteResponse` en
|
||||
Routes are mounted at `/api/plugins/{pluginId}/{path}`.
|
||||
Route handlers receive the same loader-built `PluginContext` used by hooks/tools, including real `taskStore`, plugin `settings`, `logger`, `emitEvent`, and engine-injected `createAiSession` (when available):
|
||||
|
||||
- Example roadmap plugin route: `path: "/roadmaps"` in plugin `roadmap-planner` resolves to `/api/plugins/roadmap-planner/roadmaps`
|
||||
- Roadmap suggestion endpoints follow the same namespace (for example `/api/plugins/roadmap-planner/roadmaps/:roadmapId/suggestions/milestones`)
|
||||
- Example roadmap plugin route: `path: "/roadmaps"` in plugin `fusion-plugin-roadmap` resolves to `/api/plugins/fusion-plugin-roadmap/roadmaps`
|
||||
- Roadmap suggestion endpoints follow the same namespace (for example `/api/plugins/fusion-plugin-roadmap/roadmaps/:roadmapId/suggestions/milestones`)
|
||||
- Do not document or depend on legacy host-owned `/api/roadmaps` routes unless your current source still ships them
|
||||
|
||||
- Plugin ID: `fusion-plugin-notification`
|
||||
@@ -1264,7 +1264,7 @@ Polls CI status for branches and provides custom API endpoints.
|
||||
Standalone roadmap planning plugin extracted from dashboard host code.
|
||||
|
||||
- Demonstrates: `hooks.onSchemaInit` for plugin-owned schema DDL (`ensureRoadmapSchema`)
|
||||
- Demonstrates: plugin-scoped route namespace under `/api/plugins/roadmap-planner/*`
|
||||
- Demonstrates: plugin-scoped route namespace under `/api/plugins/fusion-plugin-roadmap/*`
|
||||
- Demonstrates: top-level navigation registration through `dashboardViews` (`viewId: "roadmaps"`) and host static view registration
|
||||
- Demonstrates: AI suggestion flows that consume `ctx.createAiSession` through plugin route handlers
|
||||
|
||||
|
||||
@@ -177,7 +177,7 @@ Concrete references:
|
||||
- Core schema tables include: `tasks`, `config`, `workflow_steps`, `activityLog`, `archivedTasks`, `automations`, `agents`, `agentHeartbeats`, approval tables (`approval_requests`, `approval_request_audit_events`), `task_documents`, `task_document_revisions`, mission hierarchy tables (`missions`, `milestones`, `slices`, `mission_features`, `mission_events`), plugin/routine tables (`plugins`, `routines`), roadmap tables (`roadmaps`, `roadmap_milestones`, `roadmap_features`), insight tables (`project_insights`, `project_insight_runs`), research tables (`research_runs`, `research_exports`, `research_run_events`), eval tables (`eval_runs`, `eval_task_results`, `eval_run_events`), todo tables (`todo_lists`, `todo_items`), `__meta`
|
||||
- Migration-created tables include: `ai_sessions`, `messages`, `agentRatings`, `chat_sessions`, `chat_messages`, `runAuditEvents`, `mission_contract_assertions`, `mission_feature_assertions`, `mission_validator_runs`, `mission_validator_failures`, `mission_fix_feature_lineage`
|
||||
- `ai_sessions.status` lifecycle includes `draft` (pre-start planning session), then `generating`, `awaiting_input`, terminal `complete` / `error`
|
||||
- **Roadmap feature ownership**: roadmap contracts, ordering/handoff helpers, persistence, routes, and dashboard UI live in `plugins/fusion-plugin-roadmap` (package `@fusion-plugin-examples/roadmap`) rather than dashboard/core ownership.
|
||||
- **Roadmap feature ownership**: roadmap contracts, ordering/handoff helpers, persistence, routes, and dashboard UI live in `plugins/fusion-plugin-roadmap` (package `@fusion-plugin-examples/roadmap`, plugin id `fusion-plugin-roadmap`) rather than dashboard/core ownership.
|
||||
- **CentralCore**: `packages/core/src/central-core.ts`
|
||||
- Global project registry, health, central activity feed, global concurrency
|
||||
- Backed by `packages/core/src/central-db.ts` (`~/.fusion/fusion-central.db`)
|
||||
@@ -425,12 +425,12 @@ Key roadmap invariants:
|
||||
- cross-milestone feature moves must renumber both the source and destination milestone deterministically
|
||||
|
||||
**Roadmap frontend API contract (plugin namespace):**
|
||||
- Canonical frontend namespace: `/api/plugins/roadmap-planner/roadmaps`
|
||||
- Canonical frontend namespace: `/api/plugins/fusion-plugin-roadmap/roadmaps`
|
||||
- Roadmaps: `GET /`, `POST /`, `GET /:roadmapId`, `PATCH /:roadmapId`, `DELETE /:roadmapId`
|
||||
- Milestones: `GET /:roadmapId/milestones`, `POST /:roadmapId/milestones`, `PATCH /milestones/:milestoneId`, `DELETE /milestones/:milestoneId`, `POST /:roadmapId/milestones/reorder`
|
||||
- Features: `GET /milestones/:milestoneId/features`, `POST /milestones/:milestoneId/features`, `PATCH /features/:featureId`, `DELETE /features/:featureId`, `POST /milestones/:milestoneId/features/reorder`, `POST /features/:featureId/move`
|
||||
- Export/Handoff: `GET /:roadmapId/export`, `GET /:roadmapId/handoff`, `GET /:roadmapId/handoff/mission`, `GET /:roadmapId/milestones/:milestoneId/features/:featureId/handoff/task`
|
||||
- Dashboard host no longer mounts legacy `/api/roadmaps`; roadmap REST traffic goes through the plugin namespace only.
|
||||
- Canonical roadmap REST namespace is plugin-scoped (`/api/plugins/fusion-plugin-roadmap/...`), while dashboard maintains a temporary `/api/roadmaps` compatibility mount that delegates to plugin-owned handlers during migration.
|
||||
|
||||
**Database schema:**
|
||||
- `roadmaps` — roadmap metadata (id, title, description, timestamps)
|
||||
@@ -738,7 +738,7 @@ Key server capabilities:
|
||||
- Insights routes (`insights-routes.ts`)
|
||||
- Evals routes (`evals-routes.ts`) — `/api/evals` read surface for eval result listing/filtering, drill-down detail, and eval run metadata
|
||||
- Research routes (`research-routes.ts`) — `/api/research` surface for runs, details, cancel/retry, exports, create-task, and attach-task actions; supports graceful degradation envelopes via availability payloads when capabilities are unavailable
|
||||
- Plugin-defined roadmap routes under `plugin-routes.ts` dispatch (`/api/plugins/roadmap-planner/...`)
|
||||
- Plugin-defined roadmap routes under `plugin-routes.ts` dispatch (`/api/plugins/fusion-plugin-roadmap/...`)
|
||||
- Project-scoped store reuse via `project-store-resolver.ts`
|
||||
- Rate limiting (`rate-limit.ts`)
|
||||
- Static SPA hosting (Vite build output)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
- Backend roadmap ownership lives in `plugins/fusion-plugin-roadmap/**`.
|
||||
- Frontend roadmap ownership lives in `plugins/fusion-plugin-roadmap/**` (`dashboard/` and `dashboard-view` export).
|
||||
- Canonical API namespace is plugin-scoped: `/api/plugins/roadmap-planner/...`.
|
||||
- Canonical API namespace is plugin-scoped: `/api/plugins/fusion-plugin-roadmap/...`.
|
||||
- Dashboard Roadmaps view is registered via plugin dashboard view host (`registerBundledPluginViews` + `PluginDashboardViewHost`), not hardcoded app-level `RoadmapsView` import.
|
||||
- Roadmap schema initialization is plugin-owned via `hooks.onSchemaInit` (`ensureRoadmapSchema`).
|
||||
- AI suggestions use plugin-context session factory (`ctx.createAiSession` passed into suggestion generation), not direct `@fusion/engine` imports.
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
### Route contract expectations
|
||||
|
||||
- Plugin routes are expected under `/api/plugins/roadmap-planner/...` via host plugin route mounting.
|
||||
- Plugin routes are expected under `/api/plugins/fusion-plugin-roadmap/...` via host plugin route mounting.
|
||||
- Legacy `/api/roadmaps...` compatibility behavior (if present) must delegate to plugin implementation and be documented.
|
||||
|
||||
## 3) Host/plugin integration checks
|
||||
@@ -34,14 +34,14 @@
|
||||
### Integration points verified (Step 1)
|
||||
|
||||
- `plugins/fusion-plugin-roadmap/src/index.ts` declares:
|
||||
- `manifest.id = "roadmap-planner"`
|
||||
- `manifest.id = "fusion-plugin-roadmap"`
|
||||
- `hooks.onSchemaInit = ensureRoadmapSchema`
|
||||
- `routes = createRoadmapPluginRoutes()`
|
||||
- `dashboardViews` entry `{ viewId: "roadmaps", placement: "primary" }`
|
||||
- `packages/dashboard/app/plugins/registerBundledPluginViews.ts` statically registers:
|
||||
- plugin id `roadmap-planner`
|
||||
- plugin id `fusion-plugin-roadmap`
|
||||
- view id `roadmaps`
|
||||
- lazy import `@fusion-plugin-examples/roadmap/dashboard-view`
|
||||
- lazy import `@fusion-plugin-examples/fusion-plugin-roadmap/dashboard-view`
|
||||
- `packages/dashboard/app/App.tsx` renders plugin views through `PluginDashboardViewHost`.
|
||||
|
||||
## 4) Manual UI scenarios
|
||||
@@ -71,7 +71,7 @@ Notes:
|
||||
|
||||
### Step 2 backend/API verification checks
|
||||
|
||||
- `pnpm --filter @fusion-plugin-examples/roadmap test`
|
||||
- `pnpm --filter @fusion-plugin-examples/fusion-plugin-roadmap test`
|
||||
- ✅ Pass (9 files, 227 tests)
|
||||
- Coverage includes roadmap CRUD store operations, milestone/feature reorder, cross-milestone move, handoff/export mapping, deterministic ordering/lineage, route handlers, dashboard API client namespace, and AI suggestion behavior (success/error/timeout/service unavailable).
|
||||
- `pnpm --filter @fusion/dashboard exec vitest run src/__tests__/roadmap-routes.routes.test.ts src/__tests__/plugin-routes-wiring.test.ts --silent=passed-only --reporter=dot`
|
||||
|
||||
Reference in New Issue
Block a user