From 9a86b8519b60a65155a4a7e76065c00feac620ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=20Alexander=20=F0=9F=91=91?= Date: Fri, 28 Aug 2026 23:15:31 -0500 Subject: [PATCH 01/92] feat(ui): add connection status component --- .../ui/src/components/connection-status.tsx | 176 ++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 packages/ui/src/components/connection-status.tsx diff --git a/packages/ui/src/components/connection-status.tsx b/packages/ui/src/components/connection-status.tsx new file mode 100644 index 0000000..b11fb04 --- /dev/null +++ b/packages/ui/src/components/connection-status.tsx @@ -0,0 +1,176 @@ +import { + CheckCircle2, + CircleDashed, + CircleOff, + ShieldCheck, + ShieldQuestion, + TriangleAlert, +} from "lucide-react"; +import type { ReactNode } from "react"; + +import { cn } from "@opencoven/ui/lib/utils"; + +type ConnectionState = + | "connected" + | "pending" + | "degraded" + | "disconnected" + | "unavailable"; + +type AuthorityLevel = + | "read-only" + | "proposal" + | "mutating" + | "local-authority"; + +type ConnectionStatusProps = { + name: string; + kind: "SDK" | "CLI" | "Daemon" | "Runtime" | "Project"; + state: ConnectionState; + authority: AuthorityLevel; + detail?: string; + version?: string; + meta?: string; + action?: ReactNode; + className?: string; +}; + +const stateDetails: Record< + ConnectionState, + { label: string; icon: typeof CheckCircle2; className: string } +> = { + connected: { + label: "Connected", + icon: CheckCircle2, + className: "text-success", + }, + pending: { + label: "Connecting", + icon: CircleDashed, + className: "text-information", + }, + degraded: { + label: "Degraded", + icon: TriangleAlert, + className: "text-warning", + }, + disconnected: { + label: "Disconnected", + icon: CircleOff, + className: "text-muted-foreground", + }, + unavailable: { + label: "Unavailable", + icon: TriangleAlert, + className: "text-destructive", + }, +}; + +const authorityDetails: Record< + AuthorityLevel, + { label: string; icon: typeof ShieldCheck; className: string } +> = { + "read-only": { + label: "Read only", + icon: ShieldCheck, + className: "text-information", + }, + proposal: { + label: "Proposal only", + icon: ShieldQuestion, + className: "text-warning", + }, + mutating: { + label: "Mutation capable", + icon: ShieldQuestion, + className: "text-destructive", + }, + "local-authority": { + label: "Local authority", + icon: ShieldCheck, + className: "text-success", + }, +}; + +function ConnectionStatus({ + name, + kind, + state, + authority, + detail, + version, + meta, + action, + className, +}: ConnectionStatusProps) { + const stateDetail = stateDetails[state]; + const authorityDetail = authorityDetails[authority]; + const StateIcon = stateDetail.icon; + const AuthorityIcon = authorityDetail.icon; + + return ( +
+
+ + + {kind} + + + {name} + + + {version ? ( + + {version} + + ) : null} +
+ + {detail ? ( +

{detail}

+ ) : null} + +
+ + + + + {meta ? ( + + {meta} + + ) : null} + {action ? {action} : null} +
+
+ ); +} + +export { + ConnectionStatus, + type AuthorityLevel, + type ConnectionState, + type ConnectionStatusProps, +}; From cb17221f5cbfcae79f4c787a40afb6b696b31124 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=20Alexander=20=F0=9F=91=91?= Date: Fri, 28 Aug 2026 23:15:42 -0500 Subject: [PATCH 02/92] feat(ui): add command receipt component --- .../ui/src/components/command-receipt.tsx | 126 ++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 packages/ui/src/components/command-receipt.tsx diff --git a/packages/ui/src/components/command-receipt.tsx b/packages/ui/src/components/command-receipt.tsx new file mode 100644 index 0000000..298bc3c --- /dev/null +++ b/packages/ui/src/components/command-receipt.tsx @@ -0,0 +1,126 @@ +import { + Ban, + CheckCircle2, + CircleDashed, + Clock3, + TerminalSquare, + TriangleAlert, +} from "lucide-react"; + +import { cn } from "@opencoven/ui/lib/utils"; + +type InvocationChannel = "cli" | "sdk" | "daemon" | "runtime"; +type InvocationStatus = "running" | "success" | "failed" | "blocked"; + +type CommandReceiptProps = { + channel: InvocationChannel; + command: string; + status: InvocationStatus; + summary?: string; + duration?: string; + exitCode?: number; + timestamp?: string; + className?: string; +}; + +const statusDetails: Record< + InvocationStatus, + { label: string; icon: typeof CheckCircle2; className: string } +> = { + running: { + label: "Running", + icon: CircleDashed, + className: "text-information", + }, + success: { + label: "Complete", + icon: CheckCircle2, + className: "text-success", + }, + failed: { + label: "Failed", + icon: TriangleAlert, + className: "text-destructive", + }, + blocked: { + label: "Blocked", + icon: Ban, + className: "text-warning", + }, +}; + +function CommandReceipt({ + channel, + command, + status, + summary, + duration, + exitCode, + timestamp, + className, +}: CommandReceiptProps) { + const statusDetail = statusDetails[status]; + const StatusIcon = statusDetail.icon; + + return ( +
+
+ + + + + + {channel} + + + + + + {command} + + {summary ? ( +

+ {summary} +

+ ) : null} +
+
+ + {duration || exitCode !== undefined || timestamp ? ( +
+ {duration ? ( + + + ) : null} + {exitCode !== undefined ? exit {exitCode} : null} + {timestamp ? {timestamp} : null} +
+ ) : null} +
+ ); +} + +export { + CommandReceipt, + type CommandReceiptProps, + type InvocationChannel, + type InvocationStatus, +}; From e8b8bb04b43a33c437f6bb173eb7f3c24c9efb2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=20Alexander=20=F0=9F=91=91?= Date: Fri, 28 Aug 2026 23:16:01 -0500 Subject: [PATCH 03/92] feat(ui): add developer surface block --- packages/ui/src/blocks/developer-surface.tsx | 169 +++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 packages/ui/src/blocks/developer-surface.tsx diff --git a/packages/ui/src/blocks/developer-surface.tsx b/packages/ui/src/blocks/developer-surface.tsx new file mode 100644 index 0000000..a9b1517 --- /dev/null +++ b/packages/ui/src/blocks/developer-surface.tsx @@ -0,0 +1,169 @@ +import { Code2, GitBranch, Layers3 } from "lucide-react"; +import type { ReactNode } from "react"; + +import { + CommandReceipt, + type CommandReceiptProps, +} from "@opencoven/ui/components/command-receipt"; +import { + ConnectionStatus, + type ConnectionStatusProps, +} from "@opencoven/ui/components/connection-status"; +import { cn } from "@opencoven/ui/lib/utils"; + +type DeveloperSurfaceProps = { + project: string; + branch?: string; + title?: string; + description?: string; + connections: ConnectionStatusProps[]; + activity?: CommandReceiptProps[]; + actions?: ReactNode; + aside?: ReactNode; + className?: string; +}; + +function DeveloperSurface({ + project, + branch, + title = "Development surface", + description = "Project context, integration health, and execution evidence in one reusable surface.", + connections, + activity = [], + actions, + aside, + className, +}: DeveloperSurfaceProps) { + return ( +
+
+
+ + +

+ {title} +

+

+ {description} +

+
+ {actions ?
{actions}
: null} +
+ +
+
+
+ + + {branch ? ( + + + ) : null} +
+ +
+
+
+

+ Integrations +

+

+ Connected development context +

+
+ + {connections.length} source{connections.length === 1 ? "" : "s"} + +
+
+ {connections.map((connection) => ( + + ))} +
+
+ +
+
+
+

+ Evidence +

+

+ Recent invocations +

+
+ + {activity.length} receipt{activity.length === 1 ? "" : "s"} + +
+ {activity.length > 0 ? ( +
+ {activity.map((receipt, index) => ( + + ))} +
+ ) : ( +

+ No invocation receipts yet. Keep empty states explicit rather than + fabricating execution history. +

+ )} +
+
+ + +
+
+ ); +} + +export { DeveloperSurface, type DeveloperSurfaceProps }; From ba7d239ffbe28cfdb11d223b94221a15fa332bc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=20Alexander=20=F0=9F=91=91?= Date: Fri, 28 Aug 2026 23:16:14 -0500 Subject: [PATCH 04/92] feat(ui): export developer surface components --- packages/ui/src/index.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts index fc3053d..e11b8d1 100644 --- a/packages/ui/src/index.ts +++ b/packages/ui/src/index.ts @@ -1,4 +1,5 @@ export * from "./blocks/composer"; +export * from "./blocks/developer-surface"; export * from "./blocks/run-rail"; export * from "./blocks/session-header"; export * from "./blocks/transcript-turn"; @@ -6,7 +7,9 @@ export * from "./blocks/transcript-turn"; export * from "./components/activity-item"; export * from "./components/attachment-chip"; export * from "./components/budget-pill"; +export * from "./components/command-receipt"; export * from "./components/completion-palette"; +export * from "./components/connection-status"; export * from "./components/context-meter"; export * from "./components/empty-state"; export * from "./components/error-state"; From c6e9be8b55e634a601493a25f02f8c7cb2e64d38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=20Alexander=20=F0=9F=91=91?= Date: Fri, 28 Aug 2026 23:16:30 -0500 Subject: [PATCH 05/92] test(ui): cover developer surface semantics --- packages/ui/tests/developer-surface.test.tsx | 83 ++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 packages/ui/tests/developer-surface.test.tsx diff --git a/packages/ui/tests/developer-surface.test.tsx b/packages/ui/tests/developer-surface.test.tsx new file mode 100644 index 0000000..7bd326d --- /dev/null +++ b/packages/ui/tests/developer-surface.test.tsx @@ -0,0 +1,83 @@ +import { render, screen } from "@testing-library/react"; +import { describe, expect, it } from "vitest"; +import { axe } from "vitest-axe"; + +import { + CommandReceipt, + ConnectionStatus, + DeveloperSurface, +} from "@opencoven/ui"; + +describe("developer surface components", () => { + it("renders connection state and authority as text, not color alone", () => { + render( + , + ); + + expect(screen.getByText("Connected")).toBeInTheDocument(); + expect(screen.getByText("Read only")).toBeInTheDocument(); + expect(screen.getByText("Cave client")).toBeInTheDocument(); + }); + + it("keeps invocation evidence explicit", () => { + render( + , + ); + + expect(screen.getByText("Complete")).toBeInTheDocument(); + expect(screen.getByText("coven doctor")).toBeInTheDocument(); + expect(screen.getByText("exit 0")).toBeInTheDocument(); + }); + + it("assembles integrations and receipts without performing authority work", async () => { + const { container } = render( + , + ); + + expect(screen.getByText("OpenCoven/ui")).toBeInTheDocument(); + expect(screen.getByText("2 sources")).toBeInTheDocument(); + expect(screen.getByText("1 receipt")).toBeInTheDocument(); + expect(screen.getByText("Authority rule")).toBeInTheDocument(); + expect(await axe(container)).toHaveNoViolations(); + }); +}); From d038f9ae1478e989d92b5b8a6827f067c4d21fa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=20Alexander=20=F0=9F=91=91?= Date: Fri, 28 Aug 2026 23:16:57 -0500 Subject: [PATCH 06/92] feat(registry): add developer surface items --- registry/developer/registry.fragment.json | 62 +++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 registry/developer/registry.fragment.json diff --git a/registry/developer/registry.fragment.json b/registry/developer/registry.fragment.json new file mode 100644 index 0000000..4d5ed1f --- /dev/null +++ b/registry/developer/registry.fragment.json @@ -0,0 +1,62 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry.json", + "items": [ + { + "name": "connection-status", + "type": "registry:component", + "title": "Connection status", + "description": "Integration health and authority state for SDK, CLI, daemon, runtime, and project sources.", + "dependencies": ["lucide-react"], + "registryDependencies": ["cn", "coven-theme"], + "files": [ + { + "path": "../../packages/ui/src/components/connection-status.tsx", + "type": "registry:component", + "target": "@components/connection-status.tsx" + } + ], + "meta": { + "states": ["connected", "pending", "degraded", "disconnected", "unavailable"], + "authority": ["read-only", "proposal", "mutating", "local-authority"] + } + }, + { + "name": "command-receipt", + "type": "registry:component", + "title": "Command receipt", + "description": "Explicit CLI, SDK, daemon, or runtime invocation evidence with status and timing.", + "dependencies": ["lucide-react"], + "registryDependencies": ["cn", "coven-theme"], + "files": [ + { + "path": "../../packages/ui/src/components/command-receipt.tsx", + "type": "registry:component", + "target": "@components/command-receipt.tsx" + } + ], + "meta": { + "channels": ["cli", "sdk", "daemon", "runtime"], + "states": ["running", "success", "failed", "blocked"] + } + }, + { + "name": "developer-surface", + "type": "registry:block", + "title": "Developer surface", + "description": "Project context, integration health, authority cues, and invocation receipts in one reusable development cockpit.", + "dependencies": ["lucide-react"], + "registryDependencies": ["connection-status", "command-receipt", "cn"], + "files": [ + { + "path": "../../packages/ui/src/blocks/developer-surface.tsx", + "type": "registry:block", + "target": "@components/blocks/developer-surface.tsx" + } + ], + "meta": { + "integrationSources": ["sdk", "cli", "daemon", "runtime", "project"], + "authority": "presentation-only" + } + } + ] +} From 1a970ec05415dfa52a8356a81e8e01e4f97ff900 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=20Alexander=20=F0=9F=91=91?= Date: Fri, 28 Aug 2026 23:17:04 -0500 Subject: [PATCH 07/92] feat(registry): compose developer surface fragment --- scripts/compose-registry.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/compose-registry.mjs b/scripts/compose-registry.mjs index 0e658d7..d5a5ee1 100644 --- a/scripts/compose-registry.mjs +++ b/scripts/compose-registry.mjs @@ -7,6 +7,7 @@ const fragments = [ "registry/styles/registry.fragment.json", "registry/components/registry.fragment.json", "registry/blocks/registry.fragment.json", + "registry/developer/registry.fragment.json", ]; const rawItems = []; From 756ae8fdad10ae47357ccf5d10fe46b27b6f3082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=20Alexander=20=F0=9F=91=91?= Date: Fri, 28 Aug 2026 23:17:29 -0500 Subject: [PATCH 08/92] feat(specimens): add developer surface showcase --- apps/specimens/src/developer-showcase.tsx | 194 ++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 apps/specimens/src/developer-showcase.tsx diff --git a/apps/specimens/src/developer-showcase.tsx b/apps/specimens/src/developer-showcase.tsx new file mode 100644 index 0000000..211e76c --- /dev/null +++ b/apps/specimens/src/developer-showcase.tsx @@ -0,0 +1,194 @@ +import { Button, DeveloperSurface } from "@opencoven/ui"; +import { ArrowLeft, BookOpen, Boxes, TerminalSquare } from "lucide-react"; + +function DeveloperShowcase() { + return ( +
+
+
+ + +
+
+ +
+
+
+

+ Shared development UI +

+

+ One visual language for the work around the work. +

+

+ Reusable components for project context, SDK state, CLI execution, + daemon authority, runtime health, and verifiable receipts. The UI + presents canonical state; it never invents authority. +

+
+
+ {[ + ["CLI", "coven"], + ["SDK", "read-only"], + ["Authority", "daemon"], + ].map(([label, value]) => ( +
+
+ {label} +
+
{value}
+
+ ))} +
+
+ +
+ + + + + } + connections={[ + { + name: "Coven daemon", + kind: "Daemon", + state: "connected", + authority: "local-authority", + version: "v0.1", + detail: + "Session and runtime authority from the same-user local daemon contract.", + meta: "coven.daemon.v1", + }, + { + name: "OpenCoven SDK", + kind: "SDK", + state: "degraded", + authority: "read-only", + version: "0.1 exp", + detail: + "Experimental read-only coordination surface; mutation remains deliberately unavailable.", + meta: "Cave + Coven reads", + }, + { + name: "Coven CLI", + kind: "CLI", + state: "connected", + authority: "proposal", + version: "@opencoven/cli", + detail: + "Canonical user CLI. Execution is still revalidated by the daemon authority boundary.", + meta: "coven doctor · run · sessions", + }, + { + name: "coven-code runtime", + kind: "Runtime", + state: "connected", + authority: "proposal", + version: "0.7", + detail: + "Registered coding runtime driven through the Coven execution substrate.", + meta: "stream-json", + }, + ]} + activity={[ + { + channel: "cli", + command: "coven doctor", + status: "success", + summary: "Local runtime and harness readiness verified.", + duration: "0.8s", + exitCode: 0, + timestamp: "now", + }, + { + channel: "sdk", + command: "cave.health({ timeoutMs: 5000 })", + status: "success", + summary: "Read-only Cave health returned through a caller-controlled transport.", + duration: "42ms", + timestamp: "now", + }, + { + channel: "daemon", + command: "session.create · project=OpenCoven/ui", + status: "blocked", + summary: + "Mutation is intentionally shown as blocked until the canonical authority grants it.", + timestamp: "now", + }, + ]} + aside={ +
+
+

+ Integration contract +

+

Normalize, then render.

+

+ SDK and CLI adapters map external responses into small view + models. UI code does not perform discovery, credential lookup, + transport negotiation, or daemon mutation. +

+
+
+

+ Public install +

+ + pnpm dlx shadcn@latest add https://ui.opencoven.ai/r/developer-surface.json + +
+
+

+ Canonical CLI +

+ + npm install -g @opencoven/cli + +
+
+ } + /> +
+
+
+ ); +} + +export { DeveloperShowcase }; From 24bf7bd23eea9fadb47fba5cb55697d631cf75ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=20Alexander=20=F0=9F=91=91?= Date: Fri, 28 Aug 2026 23:17:36 -0500 Subject: [PATCH 09/92] feat(specimens): route developer showcase --- apps/specimens/src/main.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/specimens/src/main.tsx b/apps/specimens/src/main.tsx index 15f8d77..9f8902f 100644 --- a/apps/specimens/src/main.tsx +++ b/apps/specimens/src/main.tsx @@ -4,6 +4,7 @@ import { createRoot } from "react-dom/client"; import "@opencoven/ui/globals.css"; import "./specimens.css"; import { App } from "./app"; +import { DeveloperShowcase } from "./developer-showcase"; const root = document.getElementById("root"); @@ -11,8 +12,10 @@ if (!root) { throw new Error("Specimen root is missing"); } +const normalizedPath = window.location.pathname.replace(/\/+$/, "") || "/"; + createRoot(root).render( - + {normalizedPath === "/developer" ? : } , ); From 7764b62e0884945a277773582b0deec2922c4c80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=20Alexander=20=F0=9F=91=91?= Date: Fri, 28 Aug 2026 23:17:53 -0500 Subject: [PATCH 10/92] docs(ui): define SDK and CLI adapter boundary --- docs/developer-surface.md | 88 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 docs/developer-surface.md diff --git a/docs/developer-surface.md b/docs/developer-surface.md new file mode 100644 index 0000000..82f0fd1 --- /dev/null +++ b/docs/developer-surface.md @@ -0,0 +1,88 @@ +# Developer surface integration contract + +OpenCoven UI exposes presentation primitives for development tooling. It does not own runtime discovery, credentials, authority, orchestration, session mutation, or execution. + +## Canonical ownership + +| Concern | Canonical producer | UI responsibility | +| --- | --- | --- | +| Cave/Coven read models | `@opencoven/sdk` packages | Normalize returned state into view models and render it | +| User-facing local CLI | `@opencoven/cli` (`coven`) | Render commands, status, and receipts supplied by the host | +| Session/runtime authority | Coven daemon (`coven.daemon.v1`) | Display authority state explicitly; never infer permission | +| Orchestration authority | Psyche | Display task/lease/approval/receipt state supplied by the client | +| Protected mutation | Threads + Coven | Present pending/proposed/committed state without performing the mutation | +| Production application behavior | Cave | Consume these components where appropriate; Cave remains product authority | + +## Current SDK status + +The TypeScript SDK is experimental. Its first public release is intentionally read-only: discovery, compatibility, pairing, health, and canonical reads are in scope; message sending, streaming, attachments, task handoffs, GitHub mutation, and offline mutation queues are deferred. + +Do not make a UI control look executable merely because an SDK type exists. Use `ConnectionStatus` authority labels and blocked/proposal states until a canonical producer supplies explicit authority. + +## Current CLI status + +The canonical user CLI is `@opencoven/cli`, invoked as `coven`. + +```bash +npm install -g @opencoven/cli +coven doctor +``` + +The SDK repository also contains a private experimental `@opencoven/dev-cli`. That workspace is for repository development and must not be advertised as the public OpenCoven CLI. + +## Adapter pattern + +Keep integration code outside the UI package: + +```ts +import type { + CommandReceiptProps, + ConnectionStatusProps, +} from '@opencoven/ui'; + +export function toCaveConnection(result: CaveHealth): ConnectionStatusProps { + return { + name: 'Cave client', + kind: 'SDK', + state: result.ok ? 'connected' : 'degraded', + authority: 'read-only', + version: result.protocolVersion, + meta: result.instanceId, + }; +} + +export function toCliReceipt(result: CovenCommandResult): CommandReceiptProps { + return { + channel: 'cli', + command: result.command, + status: result.exitCode === 0 ? 'success' : 'failed', + exitCode: result.exitCode, + duration: result.duration, + }; +} +``` + +Then render the normalized values: + +```tsx +import { DeveloperSurface } from '@opencoven/ui'; + + +``` + +The UI package performs no import-time I/O and should not add a dependency on `@opencoven/sdk` or `@opencoven/cli`. This prevents dependency cycles, keeps package consumption lightweight, and preserves the security boundary: adapters retrieve and verify state; components present it. + +## Registry installation + +```bash +pnpm dlx shadcn@latest add https://ui.opencoven.ai/r/connection-status.json +pnpm dlx shadcn@latest add https://ui.opencoven.ai/r/command-receipt.json +pnpm dlx shadcn@latest add https://ui.opencoven.ai/r/developer-surface.json +``` + +The assembled reference is available at `/developer` in the specimen app. From 69b1e52699f00e5267514c9f8bacc98afe68bf2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=20Alexander=20=F0=9F=91=91?= Date: Fri, 28 Aug 2026 23:18:16 -0500 Subject: [PATCH 11/92] fix(specimens): use supported button density --- apps/specimens/src/developer-showcase.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/specimens/src/developer-showcase.tsx b/apps/specimens/src/developer-showcase.tsx index 211e76c..60998ae 100644 --- a/apps/specimens/src/developer-showcase.tsx +++ b/apps/specimens/src/developer-showcase.tsx @@ -75,11 +75,11 @@ function DeveloperShowcase() { description="A normalized, presentation-only view over real SDK, CLI, daemon, runtime, and repository signals." actions={ <> - - From 790b1206429621a0a4966256e7245720b818583e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=20Alexander=20=F0=9F=91=91?= Date: Fri, 28 Aug 2026 23:18:39 -0500 Subject: [PATCH 12/92] fix(deploy): build registry before specimen app --- vercel.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vercel.json b/vercel.json index 3dac685..07b8f6c 100644 --- a/vercel.json +++ b/vercel.json @@ -1,7 +1,7 @@ { "framework": "vite", "installCommand": "pnpm install --frozen-lockfile", - "buildCommand": "pnpm build", + "buildCommand": "pnpm registry:build && pnpm build", "outputDirectory": "apps/specimens/dist", "rewrites": [ { From 268688b709ac48cc6544b27bb59b6811f28c8737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=20Alexander=20=F0=9F=91=91?= Date: Fri, 28 Aug 2026 23:19:00 -0500 Subject: [PATCH 13/92] test(ui): align accessibility assertion style --- packages/ui/tests/developer-surface.test.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/ui/tests/developer-surface.test.tsx b/packages/ui/tests/developer-surface.test.tsx index 7bd326d..49a4cc0 100644 --- a/packages/ui/tests/developer-surface.test.tsx +++ b/packages/ui/tests/developer-surface.test.tsx @@ -78,6 +78,8 @@ describe("developer surface components", () => { expect(screen.getByText("2 sources")).toBeInTheDocument(); expect(screen.getByText("1 receipt")).toBeInTheDocument(); expect(screen.getByText("Authority rule")).toBeInTheDocument(); - expect(await axe(container)).toHaveNoViolations(); + + const results = await axe(container); + expect(results.violations).toHaveLength(0); }); }); From d92d556c51405931b23c0a395f0101b1ef3a5bc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=20Alexander=20=F0=9F=91=91?= Date: Fri, 28 Aug 2026 23:20:35 -0500 Subject: [PATCH 14/92] refactor(specimens): remove nonfunctional showcase actions --- apps/specimens/src/developer-showcase.tsx | 34 +++++++++++------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/apps/specimens/src/developer-showcase.tsx b/apps/specimens/src/developer-showcase.tsx index 60998ae..6d9d07b 100644 --- a/apps/specimens/src/developer-showcase.tsx +++ b/apps/specimens/src/developer-showcase.tsx @@ -1,5 +1,5 @@ -import { Button, DeveloperSurface } from "@opencoven/ui"; -import { ArrowLeft, BookOpen, Boxes, TerminalSquare } from "lucide-react"; +import { DeveloperSurface } from "@opencoven/ui"; +import { ArrowLeft, BookOpen, Boxes } from "lucide-react"; function DeveloperShowcase() { return ( @@ -17,7 +17,10 @@ function DeveloperShowcase() { Developer surface -