feat(FN-3746): document plugin API coverage and add focus-visible states

Completes Step 6 of FN-3746 by adding `focus-visible` states to ProjectCard and ProjectOverview CSS components, and documenting the Even Realities plugin API coverage in the project docs.

Fusion-Task-Id: FN-3746
This commit is contained in:
Fusion
2026-05-08 21:06:44 -07:00
committed by gsxdsm
parent 6c779159c0
commit 04382d06db
4 changed files with 54 additions and 2 deletions

View File

@@ -0,0 +1,17 @@
# Even Realities Plugin API
## Test Coverage
| Endpoint | Contract Row | Test Suite | Assertion Type |
| --- | --- | --- | --- |
| `GET /api/plugins/fusion-plugin-even-realities-glasses/board` | Auth required when daemon token enabled | `auth.test.ts` | `it.each` matrix for valid bearer / missing / wrong / `?fn_token=` fallback |
| `GET /api/plugins/fusion-plugin-even-realities-glasses/board` | Board response includes expected columns/task summaries | `integration.test.ts` | Integration response contract assertion |
| `GET /api/plugins/fusion-plugin-even-realities-glasses/tasks/:id` | Optional `summary` capped at 200 chars | `integration.test.ts` | Integration field-boundary assertion |
| `GET /api/plugins/fusion-plugin-even-realities-glasses/changes` | Polling contract: strict `updatedAt > since`, ASC ordering, default/capped limits, `hasMore`, monotonic `serverTime` | `polling.test.ts` | Cursor + pagination contract assertions |
| `GET /api/plugins/fusion-plugin-even-realities-glasses/changes` | Empty diff response shape `{ changes, hasMore, serverTime }` | `polling.test.ts` | Empty-state response assertion |
| `POST /api/plugins/fusion-plugin-even-realities-glasses/quick-capture` | Input validation (required title, title cap) and default column behavior | `quick-capture.test.ts` | Validation + creation side-effect assertions |
| `POST /api/plugins/fusion-plugin-even-realities-glasses/quick-capture` | Task-summary-only response (no description/prompt/log leakage), payload bounded | `response-shape.test.ts`, `quick-capture.test.ts` | Whitelist + payload-size assertions |
| `POST /api/plugins/fusion-plugin-even-realities-glasses/actions/start-work` | Action enabled/disabled by `enableAgentActions` | `agent-actions.test.ts` | Feature-gate integration assertions |
| `POST /api/plugins/fusion-plugin-even-realities-glasses/actions/request-review` | Action enabled/disabled by `enableAgentActions` | `agent-actions.test.ts` | Feature-gate integration assertions |
| `POST /api/plugins/fusion-plugin-even-realities-glasses/actions/*` | Unknown task id rejected | `agent-actions.test.ts` | 404 contract assertion |
| `/api/plugins/fusion-plugin-even-realities-glasses/<plugin-route>` and `/api/plugins/fusion-plugin-even-realities-glasses/enable` | Plugin route mount + management-route collision safety | `packages/dashboard/src/__tests__/plugin-routes-wiring.test.ts` | Routing/wiring integration assertions |

View File

@@ -1473,16 +1473,33 @@ describe("fn pi extension (runnable structured-output regression slice)", () =>
const tool = api.tools.get("fn_research_run")!;
const researchStore = store.getResearchStore();
setTimeout(() => {
const promoteRun = () => {
const queuedRun = researchStore.listRuns({ limit: 1 })[0];
if (!queuedRun) {
return;
return false;
}
researchStore.updateRun(queuedRun.id, { status: "running" });
researchStore.updateRun(queuedRun.id, {
status: "completed",
results: { summary: "done", findings: [{ heading: "h1", content: "f1", sources: [] }], citations: [] },
});
return true;
};
setTimeout(() => {
if (promoteRun()) {
return;
}
const retryTimer = setInterval(() => {
if (!promoteRun()) {
return;
}
clearInterval(retryTimer);
}, 25);
setTimeout(() => clearInterval(retryTimer), 500);
}, 25);
const result = await tool.execute(

View File

@@ -25,6 +25,12 @@
transform: translateY(0);
}
.project-card:focus-visible {
outline: none;
border-color: var(--todo);
box-shadow: var(--focus-ring-strong);
}
.project-card-loading {
opacity: 0.7;
pointer-events: none;
@@ -179,6 +185,12 @@
color: var(--text);
}
.project-card-action:focus-visible {
outline: none;
border-color: var(--todo);
box-shadow: var(--focus-ring-strong);
}
.project-card-action:disabled {
opacity: 0.5;
cursor: not-allowed;

View File

@@ -175,6 +175,12 @@
box-shadow: var(--shadow-sm);
}
.project-filter-tab:focus-visible {
outline: none;
border-color: var(--todo);
box-shadow: var(--focus-ring-strong);
}
.project-filter-tab.has-errors {
color: var(--color-error);
}