Skip to content

pointcast 0.7.0

Choose a tag to compare

@github-actions github-actions released this 29 Sep 05:03
· 18 commits to main since this release

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 as used at, a wrong file, and no text at. Its code is now the page's own file, and the line is found (dashboard/index.tsx:81 in 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[].kind can 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 in get_element is 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 at on 4 of 6 elements (was 2), no wrong line (was one wrong used at). Stage 0's 15 lookups are unchanged; the Vue, Svelte and Django sets only get rounded styles:.

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 internal SegmentViewNode as 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-map for 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 in app/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" in lib/data.ts), follows @/ through tsconfig.json when the project has no src/, and ignores Next's metadata export (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 custom distDir.
  • 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.json records 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 MCP get_element tool and linked by pointcast issue. The /pointcast skill 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 main after 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 setup and 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 with download, 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 and in: 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.
  • requests format only; the classic format and the session format are unchanged. Specs without such cases are byte-identical.