Remove the snapshot command and enhance reader to try Firefox Reader View first, falling back to raw Turndown conversion of document.body when Reader View fails or is skipped via --no-reader. - reader always returns markdown by default (--format=json for structured) - JSON output includes method: 'reader' | 'raw' to signal extraction path - --no-reader skips Reader View (stays on loaded page, preserving JS mutations) - Add @ts-nocheck to test/smoke.js and exclude test/ from tsconfig - Update all tests from snapshot to reader with --no-reader for data URIs - Update AGENTS.md and help text BREAKING CHANGE: snapshot subcommand removed; use reader instead.
3.3 KiB
Project Guidelines
Purpose
This project provides small Firefox/Selenium browser utilities packaged by Nix:
glimpse- headless browser CLI with subcommands for page extraction, JS execution, screenshots, and search
Keep the tools simple, scriptable, and JSON-friendly.
Commands
Prefer relevant checks after changes because the full suite can take time:
npm run lint
npm run test:list
node test/smoke.js <tag-or-name>
For smoke testing without external network dependencies, use focused tags or scripts such as npm run test:wait, npm run test:errors, or node test/smoke.js reader js. Run npm test and nix build .#default --no-link when the change is broad, touches packaging, or needs full validation. Smoke tests require Firefox and geckodriver on PATH and use local data: HTML pages.
Do not attempt a live Kagi test unless KAGI_TOKEN is available.
CLI Conventions
glimpseis the generic CLI and should use subcommands.- Keep search as the
glimpse searchsubcommand. - Do not reintroduce a top-level
--searchflag toglimpse. - Browser execution should be headless by default.
- Use
--no-headlessas the opt-out. - Keep
--url=<server>support for connecting to an existing WebDriver server. --timeout=<ms>is a top-level option for command waits and defaults to10000.--wait-js=<code>and--wait-until=<state>are top-level wait options available to everyglimpsesubcommand.--js=<code>and--script=<file>are top-level options available to everyglimpsesubcommand and run before command-specific behavior.- Prefer structured JSON output for objects/arrays.
- CLI errors should be structured JSON on stderr with
ok: false, stableerror.code,error.message, andelapsedMs.
Current glimpse subcommands:
reader <url>- extract page content as Markdown (tries Firefox Reader View, falls back to raw Turndown conversion); supports--no-readerto skip Reader View,--format=jsonfor structured outputexec <url> --js=<code>or--script=<file>- execute JavaScript and return the resultscreenshot <url> --output=<file>- save a PNG screenshotsearch <query>- search with a supported provider and output JSON results
Runtime Requirements
The Nix package must ensure both firefox and geckodriver are available to installed binaries. The current wrapper does this by prefixing PATH for glimpse.
If running outside Nix, document that Firefox and geckodriver must be on PATH.
Code Style
- Use TypeScript with ES modules; source lives in
src/**/*.tsand builds todist/. - Keep code direct and minimal; avoid abstractions until they are needed.
- Add short Title Case comments above cohesive logic blocks.
- Prefer exact, actionable error messages.
- Keep command-line parsing simple unless a real need for a parser library appears.
Nix Notes
- Update
npmDepsHashwheneverpackage-lock.jsonchanges. - Keep the source filter excluding
.git,.direnv,node_modules, andresult. packages.defaultshould containglimpse.apps.defaultshould runglimpse.
Kagi Notes
Kagi search requires --token=<token> or KAGI_TOKEN. The token is validated by the Kagi provider and passed to Kagi as the token query parameter. The agent may not have this token, so live search validation is best-effort only.