CLAUDE.md · git:20260911.cad8d02 · 2026-09-11 · sha256 dff436fb422d1b85
CLAUDE.md git:20260911.cad8d02A
Immutable. This exact content is served forever at /api/v1/blob/dff436fb422d1b85.
# CLAUDE.md — GRAB-URL Orientation for Claude agents working in this repository. Read this first; the detailed notes live in [`.claude/architecture/`](.claude/architecture/). **GRAB — Generate Request to API from Browser.** One `grab()` function with no runtime dependencies that replaces a request library: auto-JSON, auto-unzip, DOM parsing, dedupe, retry, timeout, rate limiting, caching, infinite scroll, mocks and a devtools overlay. Around it: a media-downloading CLI, an OpenAPI client generator, loading animations, and a Tauri wrapper. ## Ground rules 1. **npm, not bun or yarn.** `packageManager` pins `npm@11.19.1` and CI runs `npm install`. The Pages workflow uses `npm ci` deliberately — a floating resolve picks an incompatible fumadocs pair. Commit `package-lock.json`. 2. **The published package has one build, from the repo root.** `packages/*` are source folders, not independently published packages — `vite.config.ts` at the root compiles all of them into one `dist/`. See [`architecture/build.md`](.claude/architecture/build.md). 3. **Zero runtime dependencies in `grab-api`.** That is the product claim. Adding an import to `packages/grab-api/src/` that is not a Node builtin breaks it. 4. **Documentation goes in the user guide**, `grab-help-docs/content/docs`. The root `docs/` folder is gone — it was a vestigial Jekyll stub from before GitHub Pages switched to deploying via Actions, and #47 deleted it. Put nothing there, and do not recreate it. See [`architecture/documentation.md`](.claude/architecture/documentation.md). 5. **The skill is generated.** `grab-help-docs/content/docs/claude-skill.mdx` is written from `skills/use-grab-request/SKILL.md` — edit the skill, then run `npm run make:skill`. 6. **Never commit secrets**, credentials, API keys, or `dist/` changes that did not come from a build. ## Where things live | You want to change… | Go to | | --- | --- | | The `grab()` request function | `packages/grab-api/src/` | | The `grab-url` download CLI | `packages/grab-url-cli/src/` | | ZIP extract/create | `packages/archiver-web/src/` | | The OpenAPI → client generator | `packages/api2client/` | | `log()` and the JSON printer | `packages/log-json/src/` | | SVG / CLI spinners | `packages/loading-animations/src/` | | The 3D orbital loader | `packages/quantum-sphere-loading-animation/` | | The Tauri desktop/mobile wrapper | `packages/native-app-wrapper/` (not in the workspace globs) | | Build entries, externals, bundling | `vite.config.ts` at the root | | Documentation | `grab-help-docs/content/docs/` | | The agent skill | `skills/use-grab-request/SKILL.md` | Full map: [`architecture/overview.md`](.claude/architecture/overview.md). ## Commands ```bash npm install # never bun/yarn npm run build # vite build — the whole dist/ npm run make # icons → skill → docs → build (the full refresh) npm test # vitest npm run test:coverage # as CI runs it npm run test:cli # a real download, end to end ``` ## Before you open a PR - `npm run test:coverage`, and `npm run build` if you touched anything bundled. - If you changed the skill, run `npm run make:skill` and commit the regenerated docs page; `--check` fails when it is stale. - Commit style is **gitmoji + conventional commits**: `✨ feat(cli): archive a page into a folder with --page`. See [`architecture/conventions.md`](.claude/architecture/conventions.md). - Target `master`. Keep the PR focused. ## Detailed notes | Note | Covers | | --- | --- | | [overview.md](.claude/architecture/overview.md) | What each package does and how a request flows through `grab()` | | [build.md](.claude/architecture/build.md) | The single root build, entries, externals, and the traps in it | | [documentation.md](.claude/architecture/documentation.md) | The Fumadocs site, the two deployments, the vestigial root `docs/`, and the broken Vercel setting | | [conventions.md](.claude/architecture/conventions.md) | Code style, commits, PRs, CI, publishing | | [monorepo.md](.claude/architecture/monorepo.md) | Workspaces, npm vs pnpm, which packages actually publish, where the tests live | Each `packages/*` folder and `grab-help-docs` also has its own `CLAUDE.md` with the rules and traps specific to working in it.