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:
17
docs/even-realities-plugin-api.md
Normal file
17
docs/even-realities-plugin-api.md
Normal 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 |
|
||||
@@ -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(
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user