mirror of
https://github.com/getpaseo/paseo.git
synced 2026-10-31 21:52:54 +00:00
markdown-it's typographer option rewrites characters after parsing, so a literal (c) came out as ©. Agents label steps and options (a), (b), (c) all the time, and an ordinary list rendering as (a), (b), © stops your eye every time. The same option turns ... into an ellipsis, --- into an em dash, and straight quotes into curly ones. Agent output is text people paste back into a shell or a file, so a curly quote in --name="my repo" looks correct on screen and fails when pasted. The markdown file preview had the same problem, showing characters that are not in the file on disk. Every in-app markdown surface now goes through one factory in utils/markdown-parser.ts, which leaves typographer off: agent chat, plan cards, pull request comment bodies and the file preview. The plan card was rendering through its library's built-in parser because it never passed a markdownit prop, and that default has typographer on. Link behaviour is unchanged. The assistant parser keeps its file:// permission and no other surface gains it, and linkify stays on for chat and the default renderer and off for plan cards, matching what each did before. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
38 lines
1.5 KiB
TypeScript
38 lines
1.5 KiB
TypeScript
import { expect, test } from "../support/fixtures";
|
|
import { waitForPermissionPrompt } from "../support/helpers/permissions";
|
|
import { openAgentRoute, seedMockAgentWorkspace } from "../support/helpers/mock-agent";
|
|
|
|
// The plan card has to pass its own markdown parser. Drop that prop and
|
|
// react-native-markdown-display silently supplies one with `typographer: true`
|
|
// (node_modules/react-native-markdown-display/src/index.js:139-141), which
|
|
// turns (c) into ©, curls straight quotes, and rewrites --- as an em dash.
|
|
// No unit test can catch that, because the defect lives in the JSX.
|
|
//
|
|
// Nothing here is provider-specific: the mock provider drives it, and the
|
|
// behavior is the same for every agent.
|
|
test.describe("Plan card markdown", () => {
|
|
test("renders plan text verbatim", async ({ page }) => {
|
|
test.setTimeout(180_000);
|
|
|
|
const session = await seedMockAgentWorkspace({
|
|
repoPrefix: "plan-card-markdown-",
|
|
title: "Plan card markdown e2e",
|
|
initialPrompt: "Emit synthetic plan approval.",
|
|
});
|
|
|
|
try {
|
|
await openAgentRoute(page, session);
|
|
await waitForPermissionPrompt(page, 120_000);
|
|
|
|
const planCard = page.getByTestId("permission-plan-card");
|
|
await expect(planCard).toContainText("(c)");
|
|
await expect(planCard).toContainText('--name="my repo"');
|
|
await expect(planCard).toContainText("---buzz");
|
|
await expect(planCard).not.toContainText("©");
|
|
await expect(planCard).not.toContainText("—buzz");
|
|
} finally {
|
|
await session.cleanup();
|
|
}
|
|
});
|
|
});
|