git:20260714.5ae874e to git:20260825.36a5f1a

7 added, 0 removed. Audit A to A.

# DOX — packages/dashboard-plugin-skill
Files in this directory. One row per source file.
| File | Purpose |
|------|---------|
+ | `.pi/skills/dashboard-plugin-scaffold/SKILL.md` | Hybrid scaffold skill. `new`: ask_user batch → renderer `src/bin/scaffold.ts` writes `packages/<id>-plugin/`. `augment`: `grep-tui-surface.sh` callsites → mapping → per-callsite confirm → `pi-dashboard-plugin` manifest + `src/dashboard/` stubs. Never publish/build/restart; bridge OFF default. |
+ | `.pi/skills/dashboard-plugin-scaffold/references/build-integration.md` | Plugin build/discovery. `discoverPlugins()` globs `packages/*/package.json`; `viteDashboardPluginsPlugin` → generated `plugin-registry.tsx` (tree-shake, per-plugin code-split). `fixture:true` filtered prod. Server entries jiti dynamic-import; bridge auto-registers `~/.pi/agent/extensions/dashboard-<plugin-id>/`; disable `plugins.<id>.enabled=false`. |
+ | `.pi/skills/dashboard-plugin-scaffold/references/manifest-schema.md` | Canonical `pi-dashboard-plugin` manifest — top-level `package.json` field, mirrors `dashboard-plugin-loader/spec.md` Req 1. `PluginManifest`: id, displayName, priority (default 1000, first-party 100), requiredApi, client/server/bridge/configSchema, fixture, claims. `PluginClaim` per-slot: component, command, trigger, toolName, path, sessionParam, depth, parentPath, presentation (`dialog`/`page`), config, predicate. Unknown presentation → FATAL `ManifestValidationError`. |
+ | `.pi/skills/dashboard-plugin-scaffold/references/plugin-context-api.md` | Client SDK = `@blackbelt-technology/dashboard-plugin-runtime` + `pi-dashboard-shared` exports. Hooks: `usePluginConfig<T>()` (validated vs configSchema), `usePluginSend()` (`plugin_config_write`), `useSessionState(sessionId)`, `useAllSessions()`. Router: `pluginRouter.open(viewId, params)`/`close()`. Banned: `pi-dashboard-web` internal imports, cross-plugin imports, direct config.json writes. |
+ | `.pi/skills/dashboard-plugin-scaffold/references/server-context-api.md` | `ServerPluginContext` for `server`-entry plugins; default export `registerPlugin(ctx)` dynamic-imported post-bootstrap. Surface: fastify (REST `/api/<plugin-id>`), sessionManager, eventStore, `broadcastToSubscribers(msg)`, `registerPiHandler`/`registerBrowserHandler(type, handler)`, `pluginConfig`/`getPluginConfig<T>()`/`updatePluginConfig<T>(partial)` (broadcasts `plugin_config_update`), logger. Failure isolation: throw → `/api/health.plugins[]`, loader continues. |
+ | `.pi/skills/dashboard-plugin-scaffold/references/slot-taxonomy.md` | The 10 React slots, frozen v0.x: `sidebar-folder-section`, `session-card-badge`, `session-card-action-bar`, `content-view`, `content-header-sticky`, `content-inline-footer`, `anchored-popover`, `command-route`, `settings-section`, `tool-renderer`. Props `SlotProps<SlotId>` from `pi-dashboard-shared`. Order: priority asc, then plugin id; collisions = load-time error. New slot → OpenSpec change vs `dashboard-shell-slots`. |
+ | `.pi/skills/dashboard-plugin-scaffold/references/tui-to-dashboard-mapping.md` | Canonical TUI→dashboard mapping (augment mode). Already-aware (PromptBus→DashboardDefaultAdapter): `ctx.ui.select/input/confirm/editor/multiselect` — no port. Required port: `ctx.ui.custom<T>` (no-op pi 0.70 RPC), settings.json reads, custom TUI loops → content-view/anchored-popover/settings-section. Optional: `pi.registerTool` → tool-renderer. Banned: `ctx.fork`/`pi.newSession`/`ctx.switchSession` — warn, don't port. |
| `README.md` | Package overview. pi skill scaffolds dashboard plugins: new plugin package in monorepo, or retrofit existing pi-extension project on disk. Install global `npm i -g @blackbelt-technology/pi-dashboard-plugin-skill` or per-workspace `packages[]` in `~/.pi/agent/settings.json`. |
| `vitest.config.ts` | Vitest config for skill package. node env, forks pool with `singleFork: true`, `src/**/__tests__` include. |