mirror of
https://github.com/alkimake/paperclip.git
synced 2026-06-14 01:50:39 +09:00
- Plugin loader: install/reload/remove/reinstall external adapters from npm packages or local directories - Plugin store persisted at ~/.paperclip/adapter-plugins.json - Self-healing UI parser resolution with version caching - UI: Adapter Manager page, dynamic loader, display registry with humanized names for unknown adapter types - Dev watch: exclude adapter-plugins dir from tsx watcher to prevent mid-request server restarts during reinstall - All consumer fallbacks use getAdapterLabel() for consistent display - AdapterTypeDropdown uses controlled open state for proper close behavior - Remove hermes-local from built-in UI (externalized to plugin) - Add docs for external adapters and UI parser contract
38 lines
1.4 KiB
TypeScript
38 lines
1.4 KiB
TypeScript
// @vitest-environment node
|
|
|
|
import { describe, expect, it } from "vitest";
|
|
import { renderToStaticMarkup } from "react-dom/server";
|
|
import { ThemeProvider } from "../context/ThemeContext";
|
|
import { RunInvocationCard } from "../pages/AgentDetail";
|
|
|
|
describe("RunInvocationCard", () => {
|
|
it("keeps verbose invocation details collapsed by default", () => {
|
|
const html = renderToStaticMarkup(
|
|
<ThemeProvider>
|
|
<RunInvocationCard
|
|
payload={{
|
|
adapterType: "claude_local",
|
|
cwd: "/tmp/workspace",
|
|
command: "claude",
|
|
commandArgs: ["--dangerously-skip-permissions"],
|
|
commandNotes: ["Prompt is piped to claude via stdin."],
|
|
prompt: "very long prompt body",
|
|
context: { triggeredBy: "board" },
|
|
env: { ANTHROPIC_API_KEY: "***REDACTED***" },
|
|
}}
|
|
censorUsernameInLogs={false}
|
|
/>
|
|
</ThemeProvider>,
|
|
);
|
|
|
|
expect(html).toContain("Invocation");
|
|
expect(html).toContain("Adapter:");
|
|
expect(html).toContain("Working dir:");
|
|
expect(html).toContain("Details");
|
|
expect(html).not.toContain("Command:");
|
|
expect(html).not.toContain("Prompt is piped to claude via stdin.");
|
|
expect(html).not.toContain("very long prompt body");
|
|
expect(html).not.toContain("ANTHROPIC_API_KEY");
|
|
expect(html).not.toContain("triggeredBy");
|
|
});
|
|
});
|