pointcast 0.7.0
Extension, CLI and integrations at 0.7.0.
Fixed: words of side-by-side elements no longer run together (thanks @okdanko0520, #14)
- Texts of sibling elements laid out apart (flex or grid items, inline-blocks: a nav label and its badge, a date chip's two lines) read with a space between them, "Messages 3" instead of "Messages3". Inline siblings still read as one word ("$45"). Fixes #3.
Resolver pass 2: fewer wrong lines, more right ones (D9 note 2026-09-28)
- Fixed: on React 19 + Vite, an element written straight in a page that a router renders (
createFileRoute(…)({ component: Dashboard })) got the router's<Outlet />layout asused at, a wrong file, and notext at. Its code is now the page's own file, and the line is found (dashboard/index.tsx:81in shadcn-admin). - Fixed: a text written once in the file that uses a component, and also in that component's own file or its data (a page-title switch and the nav item's label), no longer gets the usage file's line. It is silent, or the nav entry's line when the link's href is written once.
- React 19 on Vite: the element's own component file is recorded (the file its JSX is written in, no line), so the spec says
defined in:for an element inside an app component, marked shared when its text is written elsewhere. Vue's component file gives the same line. - A text written more than once in the component files is told apart by the element's own component or tag (
<CardTitle>Overview</CardTitle>for a card title, not the tab or the nav data), and stays silent when it cannot be told. - New
class at:/id at:lines for elements with no text of their own: a distinctive class or id written once, on the element's own tag. Session format:resolved[].kindcan be"class"or"id". find:no longer lists utility classes (transition-all,ring-sidebar-ring);styles:rounds pixel lengths to whole pixels. Colors stay as they are.- CLI and MCP server: when the app is a subfolder of the project folder (
web/inside the repository), every path in the spec and inget_elementis shown from the project folder (web/src/…), so it opens as written. Unchanged when no single subfolder holds the recording's files. - On shadcn-admin's six-change set:
text aton 4 of 6 elements (was 2), no wrong line (was one wrongused at). Stage 0's 15 lookups are unchanged; the Vue, Svelte and Django sets only get roundedstyles:.
Code pointer on Next.js App Router (D9, results)
- Fixed: on Next.js (React 19, Turbopack dev), 0.6.0 named Next's build chunks as your code (
used at: `_next/static/chunks/14ei_next_0os_t-p._.js`) and gave Server Components no code at all, with Next's internalSegmentViewNodeas their component. - Client and Server Components now get their real chain, with lines: React 19's owner stacks are mapped through Next's own dev source maps (a chunk's
.map, and/__nextjs_source-mapfor Server Components), in the page, right after the gesture. Only paths inside your project and line numbers leave the page. A frame that cannot be mapped ends the chain rather than letting the next one take its place. On a 13-element example app: 13/13 chains right, where 0.6.0 had 6 wrong and 7 missing. - A page's or layout's own markup (an
<h1>written inapp/page.tsx) gets its own line as its code:used at: app/page.tsx:10. - The resolver (CLI, MCP server) finds text a Server Component renders from a data module it imports (
customer: "Jackson Lee"inlib/data.ts), follows@/throughtsconfig.jsonwhen the project has nosrc/, and ignores Next'smetadataexport (it fills the page title, not the page). Each is silent when ambiguous; Stage 0's 15 lookups are unchanged. - Not covered:
text at:lines in the pasted spec (Next's dev server serves no source; the MCP server and CLI read your repo),next dev --webpack, a customdistDir. - Session format:
renderedBy: []means "read, and no app component above the element"; readers that ignore it are unaffected. dev/examples/next-dashboard: the example app (Next.js 16, installed on its own, outside the workspace), with its ground truth;dev/eval/typed/record.mjs --tasks-file dev/eval/typed/next-tasks.jsonrecords it headlessly.
shown by: — where a value from data is displayed (D9 note 2026-09-28)
- When an element's text comes from a data literal (
customer: "Marco Peña"), the spec now also says which line renders that field:shown by: src/components/OrdersTable.tsx:38—<td>{order.customer}</td>.text at:/data at:still point at the value, for changing it;shown by:points at the markup, for changing how it is shown (link it, format it, badge it). - Recognizes
{x.key},{key},{x?.key}and{@html x.key}(React, Svelte) and{{ x.key }}with filters (Vue, Django, Jinja) as element content, in the component files already searched, innermost first. No key, no such rendering, or two of them: no line. Nothing else in the spec changes. - New optional session field
element.shownBy(session-format.md), also returned by the MCPget_elementtool and linked bypointcast issue. The/pointcastskill and Gemini command say when to use the line.
macOS and Linux: tested in CI, Option+click named as such
- The end-to-end suite now runs in CI on macOS and Windows as well as Linux (Chromium, headless): Linux and macOS on every pull request, Windows on
mainafter a merge, all three by hand (workflow_dispatch). The unit tests run on all three. The README no longer calls macOS and Linux untested. - Two tests fixed for macOS and Windows runners: the note-box test moved the caret with End, which macOS does not do (⌘↓ does), and GitHub's Windows runners get more room in the gesture-timing check, which measures the test harness, not Pointcast.
- On macOS the popup says ⌥ Option+click instead of Alt+click (Chrome maps Alt to Option there; the gesture is the same).
pointcast setupand the README mention it too. - New e2e test (
dev/e2e/alt-click-defaults.spec.ts): while recording, Alt/Option+click on a link, a link withdownload, a submit<button>, an<input type=submit>and links inside open and closed shadow roots only points. Nothing is followed, downloaded or submitted, and Alt+middle-click opens no tab. A control run without recording shows Chrome downloading the link, and downloading the form's response too. The typed-mode note box is checked with Alt/Option still held when it opens, and with Option+Enter.
Tighter specs: what you say without pointing stays with its request, copies of one component are one entry (D4 note, D5 note of 2026-09-28)
- A sentence said without pointing no longer becomes a request of its own when the times tie it to its neighbour: a follow-up said within 4 s of a request with gestures is appended to its quote ("… chips de aquí [e]. no me gustan …"), what you say within 6 s of pointing in silence becomes that pointing's quote ("[a] y hay que arreglar …"), and a short unfinished lead-in cut by a pause ("Luego en Proceso,") joins the request after it. At most one sentence per request, at most 20 words; anything else stays a request of its own. The quote keeps your words as spoken.
- 3 or more consecutive elements of one request that are copies of one component (same code lines, card, styles and page; paths differing in one index) render as one entry:
- [c–i] 7 × «Sem 2 …», «Sem 3 …», … → code:, the shared lines once andin: main › ul › li[1..7]. A line that differs (the HTML) is listed per element as[d] html: …. A preamble line explains the entry, only in a spec that has one. requestsformat only; the classic format and the session format are unchanged. Specs without such cases are byte-identical.