From 2ab94d1fdd5cfeb8d0f7be467432c2c6cb168358 Mon Sep 17 00:00:00 2001 From: amondnet <1964421+amondnet@users.noreply.github.com> Date: Mon, 2 Nov 2026 06:19:39 +0000 Subject: [PATCH] fix: update vendored skills to latest versions --- .../.agents/skills/agent-browser/SKILL.md | 2 +- plugins/agent-browser/skills-lock.json | 2 +- plugins/dev3000/.agents/skills/d3k/SKILL.md | 26 +++++- .../.agents/skills/d3k/scripts/runtime.mjs | 17 ++-- plugins/dev3000/agent/skills/d3k/SKILL.md | 26 +++++- .../agent/skills/d3k/scripts/runtime.mjs | 17 ++-- plugins/dev3000/skills-lock.json | 2 +- .../emulate/.agents/skills/emulate/SKILL.md | 2 + plugins/emulate/agent/skills/emulate/SKILL.md | 2 + plugins/emulate/skills-lock.json | 2 +- .../skills/firebase-ai-logic-basics/SKILL.md | 14 +++- .../references/flutter_setup.md | 5 +- .../references/ios_setup.md | 2 +- .../references/usage_patterns_android.md | 2 +- .../references/usage_patterns_web.md | 2 +- .../firebase-app-hosting-basics/SKILL.md | 10 ++- .../references/cli_commands.md | 83 ------------------- .../references/enterprise/web_sdk_usage.md | 24 +++++- .../skills/firebase-ai-logic-basics/SKILL.md | 14 +++- .../references/flutter_setup.md | 5 +- .../references/ios_setup.md | 2 +- .../references/usage_patterns_android.md | 2 +- .../references/usage_patterns_web.md | 2 +- .../firebase-app-hosting-basics/SKILL.md | 10 ++- .../references/cli_commands.md | 83 ------------------- .../references/enterprise/web_sdk_usage.md | 24 +++++- plugins/firebase/skills-lock.json | 6 +- plugins/mastra/.agents/skills/mastra/SKILL.md | 17 ++-- .../skills/mastra/references/core-concepts.md | 6 +- plugins/mastra/agent/skills/mastra/SKILL.md | 28 ++++--- .../skills/mastra/references/core-concepts.md | 6 +- plugins/mastra/skills-lock.json | 2 +- .../skills/nuxt-ui/references/layouts/chat.md | 64 +++++++------- .../nuxt-ui/references/recipes/data-tables.md | 28 ++++++- .../skills/nuxt-ui/references/layouts/chat.md | 64 +++++++------- .../nuxt-ui/references/recipes/data-tables.md | 28 ++++++- plugins/nuxt-ui/skills-lock.json | 2 +- .../orpc/.agents/skills/orpc-openapi/SKILL.md | 2 +- .../orpc/agent/skills/orpc-openapi/SKILL.md | 2 +- plugins/orpc/skills-lock.json | 2 +- .../portless/.agents/skills/portless/SKILL.md | 37 +++++---- .../portless/agent/skills/portless/SKILL.md | 37 +++++---- plugins/portless/skills-lock.json | 2 +- .../vercel-react-view-transitions/AGENTS.md | 2 +- .../vercel-react-view-transitions/SKILL.md | 2 +- .../vercel-react-view-transitions/AGENTS.md | 2 +- .../vercel-react-view-transitions/SKILL.md | 2 +- plugins/react/skills-lock.json | 2 +- .../tsdown/references/option-platform.md | 14 +++- .../skills/tsdown/references/reference-cli.md | 3 +- .../tsdown/references/option-platform.md | 14 +++- .../skills/tsdown/references/reference-cli.md | 3 +- plugins/tsdown/skills-lock.json | 2 +- .../.agents/skills/sandbox/SKILL.md | 48 ++++++++++- .../agent/skills/sandbox/SKILL.md | 48 ++++++++++- plugins/vercel-sandbox/skills-lock.json | 2 +- .../references/compatibility.md | 2 +- .../references/troubleshooting.md | 19 +++-- .../references/compatibility.md | 2 +- .../references/troubleshooting.md | 19 +++-- plugins/vinext/skills-lock.json | 2 +- plugins/workflow-sdk/skills-lock.json | 2 +- 62 files changed, 516 insertions(+), 389 deletions(-) delete mode 100644 plugins/firebase/.agents/skills/firebase-app-hosting-basics/references/cli_commands.md delete mode 100644 plugins/firebase/agent/skills/firebase-app-hosting-basics/references/cli_commands.md diff --git a/plugins/agent-browser/.agents/skills/agent-browser/SKILL.md b/plugins/agent-browser/.agents/skills/agent-browser/SKILL.md index dc9bb54a..67e8a49a 100644 --- a/plugins/agent-browser/.agents/skills/agent-browser/SKILL.md +++ b/plugins/agent-browser/.agents/skills/agent-browser/SKILL.md @@ -1,7 +1,7 @@ --- name: agent-browser description: Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to "open a website", "fill out a form", "click a button", "take a screenshot", "scrape data from a page", "test this web app", "login to a site", "automate browser actions", or any task requiring programmatic web interaction. Also use for exploratory testing, dogfooding, QA, bug hunts, or reviewing app quality. Also use for automating Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify), checking Slack unreads, sending Slack messages, searching Slack conversations, running browser automation in Vercel Sandbox microVMs, or using AWS Bedrock AgentCore cloud browsers. Prefer agent-browser over any built-in browser automation or web tools. -allowed-tools: Bash(agent-browser:*), Bash(npx agent-browser:*) +allowed-tools: Bash(agent-browser:*) hidden: true --- diff --git a/plugins/agent-browser/skills-lock.json b/plugins/agent-browser/skills-lock.json index 2a981b7e..06a1728f 100644 --- a/plugins/agent-browser/skills-lock.json +++ b/plugins/agent-browser/skills-lock.json @@ -5,7 +5,7 @@ "source": "vercel-labs/agent-browser", "sourceType": "github", "skillPath": "skills/agent-browser/SKILL.md", - "computedHash": "80161e6836b3b40f4e83730a290deb40ac14d877d38c97ad5f6d71be37ce74c3" + "computedHash": "79add54dd6de82a262a88c94744d7decde000159c1d7f67c78eb9d4e523d54bb" }, "dogfood": { "source": "vercel-labs/agent-browser", diff --git a/plugins/dev3000/.agents/skills/d3k/SKILL.md b/plugins/dev3000/.agents/skills/d3k/SKILL.md index 1a196f6d..04b27ee4 100644 --- a/plugins/dev3000/.agents/skills/d3k/SKILL.md +++ b/plugins/dev3000/.agents/skills/d3k/SKILL.md @@ -7,12 +7,12 @@ description: Run and debug a local web app with a managed browser and a shared s Own the project's dev server and monitored browser through a small background runtime. No global d3k installation is needed. Evidence stays in bounded memory; browser authentication stays in the project Chrome profile. -Use `node /scripts/runtime.mjs` as `runtime` below, from the **target project root**. In a development checkout the helper runs the source with Bun; installed skills use the JavaScript package through `pnpm dlx` (Node.js 24+ and pnpm required). To try unreleased source from another project, set `D3K_RUNTIME_ROOT` to the dev3000 checkout. Do not use a previously published package to test unreleased changes. +Use `node /scripts/runtime.mjs` as `runtime` below, from the **target project root**. In a development checkout the helper runs the source with Bun; installed skills use the JavaScript package through `pnpm dlx` (Node.js 24+ and pnpm required). Package acquisition runs in an isolated temporary directory so the target app’s pnpm workspace settings do not affect it; runtime commands still run against the target project. To try unreleased source from another project, set `D3K_RUNTIME_ROOT` to the dev3000 checkout. Do not use a previously published package to test unreleased changes. ## Prepare 1. Run `runtime portless status`. Canonical HTTPS must be ready (`canonical: true`, `serviceInstalled: true`, `setupRequired: false`) before starting the app or browser. If needed run `runtime portless setup`, wait for the one-time administrator authorization, then check again. Stop if setup is unavailable; never silently substitute direct localhost. -2. Run `runtime status`. Reuse a ready runtime for this project. If it is starting, wait for readiness. Do not start another dev server. A legacy d3k session must be stopped before switching runtimes. +2. Run `runtime status`. Reuse a ready runtime for this project. If it is starting, wait for readiness. Do not start another dev server. 3. Start `runtime start` in a retained background tool session. Keep its process handle. The runtime detects the package manager and `dev` script; use `--command ''` when needed. Poll `runtime status` until `ready: true` and `browserConnected: true` with a port-free `https://...localhost` URL. Inspect `runtime events` if startup fails while the runtime is still alive, and the retained process output if it exits. ## Reproduce and inspect @@ -30,3 +30,25 @@ Use `node /scripts/runtime.mjs` as `runtime` below, from the ** Keep the runtime's project-stable profile for sign-in state. Use `--headless` for CI or when requested; `--servers-only` deliberately omits the browser. Automatic screenshots and persistent log files are off; request a screenshot through `runtime browser screenshot ` when visual evidence is needed. Stop with `runtime stop` or the retained process handle when asked. Leaving the browser open for user testing means leaving the runtime alive. Events are lost when it exits; only profile and session discovery data persist. Console/server text may contain application secrets; inspect selectively and avoid copying sensitive values into reports. + +## Vercel Sandbox with local Chrome + +For a remote project with no local checkout, run `runtime sandbox --project --scope --name --no-shell` on the laptop in a retained background session. The launcher requires Vercel CLI login, Bun, Node.js 24+, and macOS. d3k downloads Chrome for Testing automatically on first use and reuses it afterward. It creates a sandbox from the project's linked public GitHub repository, pulls Development env through Vercel CLI, installs dependencies, and starts the remote skill runtime. For a private repository, use `--attach ` with an existing sandbox that already contains the checkout. Private-repository access must be configured separately. Do not supply GitHub or Vercel management tokens to the app environment. + +The app uses `https://.d3k.localhost`; `--hostname songbook` selects `https://songbook.d3k.localhost`. Canonical Portless is required on the laptop before launch, with no Portless inside the VM. A loopback streaming proxy forwards verified HTTPS app traffic and a session token to the sandbox. Add the exact local auth callback URL to the provider allowlist. The laptop companion opens a dedicated local Chrome and maintains an authenticated outbound WSS bridge; project source and dev compute stay remote. Dev commands must honor `PORT`. Keep the companion alive throughout debugging. + +Run status, browser, events, and stop commands **inside the sandbox's project directory**, using `/tmp/d3k-tools/node_modules/.bin/d3k-runtime`. For example, use `vercel sandbox exec --project --scope --workdir -- /tmp/d3k-tools/node_modules/.bin/d3k-runtime browser snapshot -i`. Supply a fresh project OIDC token obtained from `vercel project token --scope --format json` as the CLI process's `VERCEL_OIDC_TOKEN` environment variable if needed; capture it without printing it or putting it in command arguments. The interactive launcher handles this authentication automatically. Read the remote `status` before driving Chrome and reuse that runtime; do not start another runtime or browser. An interactive `d3k --project team/project` (or `d3k sandbox`) enters the remote project directory and adds tools to PATH. Type `fx` there after authenticating the harness in the sandbox; d3k installs fx if absent but does not provision Gateway keys or forward laptop credentials. `--no-fx` skips installation. Project processes share the harness identity, so manually configured credentials are accessible to project code. Without a TTY, use `vercel sandbox exec` or `vercel sandbox connect` separately. All remote harnesses need their own authentication. The interactive shell does not inherit app env automatically. + +App traffic streams through the local proxy to the sandbox, preserving the browser origin, redirects, cookies, and WebSockets. Batch browser operations to reduce CDP round trips, select a nearby sandbox region, and avoid continuous screenshots. HMR works through the in-VM proxy. A bridge disconnect records an evidence gap and closes pending channels without replaying commands; reread status and reproduce after reconnecting before claiming complete evidence. + +Stopping the local launcher stops its runtime and a sandbox it created while preserving the sandbox filesystem. `--attach` leaves the existing VM running. The sandbox agent can control the dedicated Chrome profile, and the public sandbox app endpoint requires the companion session token; application authentication remains the app's responsibility. Keep agent credentials separate from infrastructure credentials; never describe remote browser control as adding no security risk. + +## CLI aliases and evidence views + +`d3k`, `dev3000`, and `d3k-runtime` use the same implementation. Local startup is `start`; root options are for sandbox mode. Timeout flags use milliseconds. `logs --count <1..500> --type server|browser|runtime|all` and `errors --context` read recent events from the same live timeline; use `--json` to retain evidence-gap metadata. Prefer cursor-based `events` for reproductions. The runtime does not install agent packages, write log files, or automatically upgrade. Use `browser` rather than the removed `agent-browser` subcommand. + +Sandbox resume: `d3k --resume` lists locally saved session IDs, projects, sandbox names, branches, URLs, and last-used times. `d3k --resume ` restores that sandbox checkout and hostname, refreshes Development env and dependencies, restarts the dev runtime, and pairs the retained browser profile using fresh bridge/proxy tokens. No repository checkout is needed on the laptop. Ctrl-C closes the browser and prints the resume command to stdout. Saved entries contain discovery metadata, not credentials or past terminal output; remote availability is checked on resume. Optional `--command`, `--hostname`, `--timeout`, `--no-shell`, `--no-fx`, and `--headless` override launch settings. Sandboxes originally created by d3k stop compute again on resumed exit; externally attached sandboxes remain running. + +Use `d3k start --harness codex` locally or `d3k --project my-team/my-project --harness fx` remotely to launch a coding harness after readiness. The supported choices are `fx`, `codex`, and `claude`; commands, paths, and extra arguments are rejected. An interactive terminal is required, and exiting the harness closes a session started by that invocation. Harnesses must already be installed and authenticated, except for existing sandbox fx setup. Codex/Claude receive a prompt to read the bundled d3k skill and reuse the runtime; fx receives a temporary skill context through `--add-dir` (its interactive CLI has no startup prompt). No project instruction files are overwritten. Local harnesses use local credentials; sandbox fx can use the temporary team Gateway key. `--resume ` remembers the harness choice. + +Sandbox Chrome and its children run under macOS filesystem confinement. Do not bypass it or substitute an unrestricted browser. The outer policy replaces Chrome's inner sandbox because macOS cannot nest them. Only Chrome, required system files, and the dedicated profile and temporary files are readable; unrelated laptop files are denied. The profile uses a local password store rather than the laptop keychain. Browser sessions remain accessible to sandbox automation. Other platforms fail closed until equivalent isolation is available. diff --git a/plugins/dev3000/.agents/skills/d3k/scripts/runtime.mjs b/plugins/dev3000/.agents/skills/d3k/scripts/runtime.mjs index 5a7acbe3..7cf65368 100644 --- a/plugins/dev3000/.agents/skills/d3k/scripts/runtime.mjs +++ b/plugins/dev3000/.agents/skills/d3k/scripts/runtime.mjs @@ -1,7 +1,8 @@ #!/usr/bin/env node // Runs the checkout during development, or the published JS entrypoint after installation. import { spawn } from "node:child_process" -import { existsSync } from "node:fs" +import { existsSync, mkdtempSync, rmSync } from "node:fs" +import { tmpdir } from "node:os" import { dirname, resolve } from "node:path" import { fileURLToPath } from "node:url" @@ -10,12 +11,16 @@ const source = resolve(checkout, "src/runtime/cli.ts") const built = resolve(checkout, "dist/runtime/cli.js") const args = process.argv.slice(2) const command = existsSync(source) ? "bun" : existsSync(built) ? process.execPath : "pnpm" -const prefix = existsSync(source) ? [source] : existsSync(built) ? [built] : ["--package=dev3000", "dlx", "d3k-runtime"] +const prefix = existsSync(source) ? [source] : existsSync(built) ? [built] : ["--package=dev3000@>=0.0.184", "dlx", "d3k-runtime"] +// pnpm reads workspace configuration even for dlx. Acquire the package outside +// the app, then let the runtime restore the original project directory. +const bootstrap = command === "pnpm" ? mkdtempSync(resolve(tmpdir(), "d3k-bootstrap-")) : undefined +const cleanup = () => { if (bootstrap) rmSync(bootstrap, { recursive: true, force: true }) } const child = spawn(command, [...prefix, ...args], { stdio: "inherit", - // dlx runs our tool independently of the target project's package manager. - env: command === "pnpm" ? { ...process.env, COREPACK_ENABLE_PROJECT_SPEC: "0" } : process.env + cwd: bootstrap, + env: bootstrap ? { ...process.env, COREPACK_ENABLE_PROJECT_SPEC: "0", D3K_BOOTSTRAP_CWD: process.cwd() } : process.env }) for (const signal of ["SIGINT", "SIGTERM"]) process.on(signal, () => child.kill(signal)) -child.on("error", error => { console.error(error.message); process.exitCode = 1 }) -child.on("exit", (code, signal) => { process.exitCode = code ?? (signal ? 1 : 0) }) +child.on("error", error => { cleanup(); console.error(error.message); process.exitCode = 1 }) +child.on("exit", (code, signal) => { cleanup(); process.exitCode = code ?? (signal ? 1 : 0) }) diff --git a/plugins/dev3000/agent/skills/d3k/SKILL.md b/plugins/dev3000/agent/skills/d3k/SKILL.md index 6260e8bf..b1546209 100644 --- a/plugins/dev3000/agent/skills/d3k/SKILL.md +++ b/plugins/dev3000/agent/skills/d3k/SKILL.md @@ -8,12 +8,12 @@ description: Run and debug a local web app with a managed browser and a shared Own the project's dev server and monitored browser through a small background runtime. No global d3k installation is needed. Evidence stays in bounded memory; browser authentication stays in the project Chrome profile. -Use `node /scripts/runtime.mjs` as `runtime` below, from the **target project root**. In a development checkout the helper runs the source with Bun; installed skills use the JavaScript package through `pnpm dlx` (Node.js 24+ and pnpm required). To try unreleased source from another project, set `D3K_RUNTIME_ROOT` to the dev3000 checkout. Do not use a previously published package to test unreleased changes. +Use `node /scripts/runtime.mjs` as `runtime` below, from the **target project root**. In a development checkout the helper runs the source with Bun; installed skills use the JavaScript package through `pnpm dlx` (Node.js 24+ and pnpm required). Package acquisition runs in an isolated temporary directory so the target app’s pnpm workspace settings do not affect it; runtime commands still run against the target project. To try unreleased source from another project, set `D3K_RUNTIME_ROOT` to the dev3000 checkout. Do not use a previously published package to test unreleased changes. ## Prepare 1. Run `runtime portless status`. Canonical HTTPS must be ready (`canonical: true`, `serviceInstalled: true`, `setupRequired: false`) before starting the app or browser. If needed run `runtime portless setup`, wait for the one-time administrator authorization, then check again. Stop if setup is unavailable; never silently substitute direct localhost. -2. Run `runtime status`. Reuse a ready runtime for this project. If it is starting, wait for readiness. Do not start another dev server. A legacy d3k session must be stopped before switching runtimes. +2. Run `runtime status`. Reuse a ready runtime for this project. If it is starting, wait for readiness. Do not start another dev server. 3. Start `runtime start` in a retained background tool session. Keep its process handle. The runtime detects the package manager and `dev` script; use `--command ''` when needed. Poll `runtime status` until `ready: true` and `browserConnected: true` with a port-free `https://...localhost` URL. Inspect `runtime events` if startup fails while the runtime is still alive, and the retained process output if it exits. ## Reproduce and inspect @@ -31,3 +31,25 @@ Use `node /scripts/runtime.mjs` as `runtime` below, from the ** Keep the runtime's project-stable profile for sign-in state. Use `--headless` for CI or when requested; `--servers-only` deliberately omits the browser. Automatic screenshots and persistent log files are off; request a screenshot through `runtime browser screenshot ` when visual evidence is needed. Stop with `runtime stop` or the retained process handle when asked. Leaving the browser open for user testing means leaving the runtime alive. Events are lost when it exits; only profile and session discovery data persist. Console/server text may contain application secrets; inspect selectively and avoid copying sensitive values into reports. + +## Vercel Sandbox with local Chrome + +For a remote project with no local checkout, run `runtime sandbox --project --scope --name --no-shell` on the laptop in a retained background session. The launcher requires Vercel CLI login, Bun, Node.js 24+, and macOS. d3k downloads Chrome for Testing automatically on first use and reuses it afterward. It creates a sandbox from the project's linked public GitHub repository, pulls Development env through Vercel CLI, installs dependencies, and starts the remote skill runtime. For a private repository, use `--attach ` with an existing sandbox that already contains the checkout. Private-repository access must be configured separately. Do not supply GitHub or Vercel management tokens to the app environment. + +The app uses `https://.d3k.localhost`; `--hostname songbook` selects `https://songbook.d3k.localhost`. Canonical Portless is required on the laptop before launch, with no Portless inside the VM. A loopback streaming proxy forwards verified HTTPS app traffic and a session token to the sandbox. Add the exact local auth callback URL to the provider allowlist. The laptop companion opens a dedicated local Chrome and maintains an authenticated outbound WSS bridge; project source and dev compute stay remote. Dev commands must honor `PORT`. Keep the companion alive throughout debugging. + +Run status, browser, events, and stop commands **inside the sandbox's project directory**, using `/tmp/d3k-tools/node_modules/.bin/d3k-runtime`. For example, use `vercel sandbox exec --project --scope --workdir -- /tmp/d3k-tools/node_modules/.bin/d3k-runtime browser snapshot -i`. Supply a fresh project OIDC token obtained from `vercel project token --scope --format json` as the CLI process's `VERCEL_OIDC_TOKEN` environment variable if needed; capture it without printing it or putting it in command arguments. The interactive launcher handles this authentication automatically. Read the remote `status` before driving Chrome and reuse that runtime; do not start another runtime or browser. An interactive `d3k --project team/project` (or `d3k sandbox`) enters the remote project directory and adds tools to PATH. Type `fx` there after authenticating the harness in the sandbox; d3k installs fx if absent but does not provision Gateway keys or forward laptop credentials. `--no-fx` skips installation. Project processes share the harness identity, so manually configured credentials are accessible to project code. Without a TTY, use `vercel sandbox exec` or `vercel sandbox connect` separately. All remote harnesses need their own authentication. The interactive shell does not inherit app env automatically. + +App traffic streams through the local proxy to the sandbox, preserving the browser origin, redirects, cookies, and WebSockets. Batch browser operations to reduce CDP round trips, select a nearby sandbox region, and avoid continuous screenshots. HMR works through the in-VM proxy. A bridge disconnect records an evidence gap and closes pending channels without replaying commands; reread status and reproduce after reconnecting before claiming complete evidence. + +Stopping the local launcher stops its runtime and a sandbox it created while preserving the sandbox filesystem. `--attach` leaves the existing VM running. The sandbox agent can control the dedicated Chrome profile, and the public sandbox app endpoint requires the companion session token; application authentication remains the app's responsibility. Keep agent credentials separate from infrastructure credentials; never describe remote browser control as adding no security risk. + +## CLI aliases and evidence views + +`d3k`, `dev3000`, and `d3k-runtime` use the same implementation. Local startup is `start`; root options are for sandbox mode. Timeout flags use milliseconds. `logs --count <1..500> --type server|browser|runtime|all` and `errors --context` read recent events from the same live timeline; use `--json` to retain evidence-gap metadata. Prefer cursor-based `events` for reproductions. The runtime does not install agent packages, write log files, or automatically upgrade. Use `browser` rather than the removed `agent-browser` subcommand. + +Sandbox resume: `d3k --resume` lists locally saved session IDs, projects, sandbox names, branches, URLs, and last-used times. `d3k --resume ` restores that sandbox checkout and hostname, refreshes Development env and dependencies, restarts the dev runtime, and pairs the retained browser profile using fresh bridge/proxy tokens. No repository checkout is needed on the laptop. Ctrl-C closes the browser and prints the resume command to stdout. Saved entries contain discovery metadata, not credentials or past terminal output; remote availability is checked on resume. Optional `--command`, `--hostname`, `--timeout`, `--no-shell`, `--no-fx`, and `--headless` override launch settings. Sandboxes originally created by d3k stop compute again on resumed exit; externally attached sandboxes remain running. + +Use `d3k start --harness codex` locally or `d3k --project my-team/my-project --harness fx` remotely to launch a coding harness after readiness. The supported choices are `fx`, `codex`, and `claude`; commands, paths, and extra arguments are rejected. An interactive terminal is required, and exiting the harness closes a session started by that invocation. Harnesses must already be installed and authenticated, except for existing sandbox fx setup. Codex/Claude receive a prompt to read the bundled d3k skill and reuse the runtime; fx receives a temporary skill context through `--add-dir` (its interactive CLI has no startup prompt). No project instruction files are overwritten. Local harnesses use local credentials; sandbox fx can use the temporary team Gateway key. `--resume ` remembers the harness choice. + +Sandbox Chrome and its children run under macOS filesystem confinement. Do not bypass it or substitute an unrestricted browser. The outer policy replaces Chrome's inner sandbox because macOS cannot nest them. Only Chrome, required system files, and the dedicated profile and temporary files are readable; unrelated laptop files are denied. The profile uses a local password store rather than the laptop keychain. Browser sessions remain accessible to sandbox automation. Other platforms fail closed until equivalent isolation is available. diff --git a/plugins/dev3000/agent/skills/d3k/scripts/runtime.mjs b/plugins/dev3000/agent/skills/d3k/scripts/runtime.mjs index 5a7acbe3..7cf65368 100644 --- a/plugins/dev3000/agent/skills/d3k/scripts/runtime.mjs +++ b/plugins/dev3000/agent/skills/d3k/scripts/runtime.mjs @@ -1,7 +1,8 @@ #!/usr/bin/env node // Runs the checkout during development, or the published JS entrypoint after installation. import { spawn } from "node:child_process" -import { existsSync } from "node:fs" +import { existsSync, mkdtempSync, rmSync } from "node:fs" +import { tmpdir } from "node:os" import { dirname, resolve } from "node:path" import { fileURLToPath } from "node:url" @@ -10,12 +11,16 @@ const source = resolve(checkout, "src/runtime/cli.ts") const built = resolve(checkout, "dist/runtime/cli.js") const args = process.argv.slice(2) const command = existsSync(source) ? "bun" : existsSync(built) ? process.execPath : "pnpm" -const prefix = existsSync(source) ? [source] : existsSync(built) ? [built] : ["--package=dev3000", "dlx", "d3k-runtime"] +const prefix = existsSync(source) ? [source] : existsSync(built) ? [built] : ["--package=dev3000@>=0.0.184", "dlx", "d3k-runtime"] +// pnpm reads workspace configuration even for dlx. Acquire the package outside +// the app, then let the runtime restore the original project directory. +const bootstrap = command === "pnpm" ? mkdtempSync(resolve(tmpdir(), "d3k-bootstrap-")) : undefined +const cleanup = () => { if (bootstrap) rmSync(bootstrap, { recursive: true, force: true }) } const child = spawn(command, [...prefix, ...args], { stdio: "inherit", - // dlx runs our tool independently of the target project's package manager. - env: command === "pnpm" ? { ...process.env, COREPACK_ENABLE_PROJECT_SPEC: "0" } : process.env + cwd: bootstrap, + env: bootstrap ? { ...process.env, COREPACK_ENABLE_PROJECT_SPEC: "0", D3K_BOOTSTRAP_CWD: process.cwd() } : process.env }) for (const signal of ["SIGINT", "SIGTERM"]) process.on(signal, () => child.kill(signal)) -child.on("error", error => { console.error(error.message); process.exitCode = 1 }) -child.on("exit", (code, signal) => { process.exitCode = code ?? (signal ? 1 : 0) }) +child.on("error", error => { cleanup(); console.error(error.message); process.exitCode = 1 }) +child.on("exit", (code, signal) => { cleanup(); process.exitCode = code ?? (signal ? 1 : 0) }) diff --git a/plugins/dev3000/skills-lock.json b/plugins/dev3000/skills-lock.json index d2306c03..8f04047c 100644 --- a/plugins/dev3000/skills-lock.json +++ b/plugins/dev3000/skills-lock.json @@ -5,7 +5,7 @@ "source": "vercel-labs/dev3000", "sourceType": "github", "skillPath": "skills/d3k/SKILL.md", - "computedHash": "c6de4d31d36ce1bf7a00c2c53ef7bb2b0e0f74dbdb2ad241a89a831cb2b14e71" + "computedHash": "f5072c92a35fc845e7c888f260cdb6be0e17725cdb90be6f6e8d31f012e8bb04" } } } diff --git a/plugins/emulate/.agents/skills/emulate/SKILL.md b/plugins/emulate/.agents/skills/emulate/SKILL.md index bbb75ffc..707238b0 100644 --- a/plugins/emulate/.agents/skills/emulate/SKILL.md +++ b/plugins/emulate/.agents/skills/emulate/SKILL.md @@ -77,6 +77,8 @@ The port can also be set via `EMULATE_PORT` or `PORT` environment variables. For access from a container or another machine, use `npx emulate start --host 0.0.0.0`. Set `--base-url` to a URL reachable by those clients when using OAuth redirects or other advertised URLs. +To use the local stdio MCP server, run `npx emulate mcp` from the project root. The MCP client must launch it in the project directory so config and file paths resolve correctly. Results remove terminal escapes and redact URL credentials and sensitive query values while preserving clean URLs. See the [MCP server guide](https://emulate.dev/docs/mcp) for tool details. + The generated-secrets destination must not exist. emulate removes inherited ACLs, verifies effective owner-only access, and publishes complete JSON before opening listeners or configuring portless. Handled startup failures remove the invocation-owned artifact. A hard termination can leave a complete artifact that must be removed manually after confirming no invocation is using it. Only service-generated values appear in the artifact. Linux requires `setfacl` and `getfacl` from the `acl` package. The flag fails closed when access controls cannot be verified and is not supported on Windows. The advertised base URL (used in OAuth redirects, webhook URLs, etc.) can be overridden via `--base-url`, the `EMULATE_BASE_URL` env var (supports `{service}` template), or per-service `baseUrl` in the seed config. When running under portless, the `PORTLESS_URL` env var is also detected automatically. diff --git a/plugins/emulate/agent/skills/emulate/SKILL.md b/plugins/emulate/agent/skills/emulate/SKILL.md index 5ead9599..9f777e46 100644 --- a/plugins/emulate/agent/skills/emulate/SKILL.md +++ b/plugins/emulate/agent/skills/emulate/SKILL.md @@ -82,6 +82,8 @@ The port can also be set via `EMULATE_PORT` or `PORT` environment variables. For access from a container or another machine, use `npx emulate start --host 0.0.0.0`. Set `--base-url` to a URL reachable by those clients when using OAuth redirects or other advertised URLs. +To use the local stdio MCP server, run `npx emulate mcp` from the project root. The MCP client must launch it in the project directory so config and file paths resolve correctly. Results remove terminal escapes and redact URL credentials and sensitive query values while preserving clean URLs. See the [MCP server guide](https://emulate.dev/docs/mcp) for tool details. + The generated-secrets destination must not exist. emulate removes inherited ACLs, verifies effective owner-only access, and publishes complete JSON before opening listeners or configuring portless. Handled startup failures remove the invocation-owned artifact. A hard termination can leave a complete artifact that must be removed manually after confirming no invocation is using it. Only service-generated values appear in the artifact. Linux requires `setfacl` and `getfacl` from the `acl` package. The flag fails closed when access controls cannot be verified and is not supported on Windows. The advertised base URL (used in OAuth redirects, webhook URLs, etc.) can be overridden via `--base-url`, the `EMULATE_BASE_URL` env var (supports `{service}` template), or per-service `baseUrl` in the seed config. When running under portless, the `PORTLESS_URL` env var is also detected automatically. diff --git a/plugins/emulate/skills-lock.json b/plugins/emulate/skills-lock.json index 91bef19e..eb55d1db 100644 --- a/plugins/emulate/skills-lock.json +++ b/plugins/emulate/skills-lock.json @@ -17,7 +17,7 @@ "source": "vercel-labs/emulate", "sourceType": "github", "skillPath": "skills/emulate/SKILL.md", - "computedHash": "f9f00dad70d82ec377bc6e0faf765b52bcde1784bc89905997a9ecfe553ea358" + "computedHash": "015f578db9195b15af246453405c9c185db843f9138a9192f7e24afae6e7248b" }, "github": { "source": "vercel-labs/emulate", diff --git a/plugins/firebase/.agents/skills/firebase-ai-logic-basics/SKILL.md b/plugins/firebase/.agents/skills/firebase-ai-logic-basics/SKILL.md index 685921fe..d7f92527 100644 --- a/plugins/firebase/.agents/skills/firebase-ai-logic-basics/SKILL.md +++ b/plugins/firebase/.agents/skills/firebase-ai-logic-basics/SKILL.md @@ -109,8 +109,12 @@ ______________________________________________________________________ > [!WARNING] **CRITICAL: Use current model names:** Always check the > [Firebase AI Logic Models documentation](https://firebase.google.com/docs/ai-logic/models.md.txt) -> for the currently supported model names. Do NOT use `gemini-2.0-pro` or -> `gemini-2.0-flash` or other older models that are shutdown. +> for the currently supported model names. Do NOT use any Gemini 1.x or Gemini +> 2.x models (such as `gemini-1.5-flash`, `gemini-1.5-pro`, `gemini-2.0-flash`, +> `gemini-2.0-pro`, `gemini-2.5-flash`, `gemini-2.5-flash-lite`, or +> `gemini-2.5-pro`), as older models are deprecated or shut down. Always use a +> currently supported Gemini 3+ model; if URL access is blocked in your +> environment, proceed directly without searching local files. ### Text-Only Generation @@ -276,8 +280,10 @@ ______________________________________________________________________ > [!WARNING] **CRITICAL: Use current model names:** Always check the > [Firebase AI Logic Models documentation](https://firebase.google.com/docs/ai-logic/models.md.txt) -> for the currently supported model names. Do NOT use `gemini-2.0-pro` or -> `gemini-2.0-flash` or other older models that are shutdown. +> for the currently supported model names. Do NOT use any Gemini 1.x or Gemini +> 2.x models (such as `gemini-1.5-flash`, `gemini-2.0-flash`, +> `gemini-2.5-flash`, or `gemini-2.5-flash-lite`), as older models are +> deprecated or shut down. ## References diff --git a/plugins/firebase/.agents/skills/firebase-ai-logic-basics/references/flutter_setup.md b/plugins/firebase/.agents/skills/firebase-ai-logic-basics/references/flutter_setup.md index bf31dc24..10d9c91f 100644 --- a/plugins/firebase/.agents/skills/firebase-ai-logic-basics/references/flutter_setup.md +++ b/plugins/firebase/.agents/skills/firebase-ai-logic-basics/references/flutter_setup.md @@ -57,8 +57,9 @@ Use `FirebaseAI.googleAI` for the **Gemini Developer API**. > [!IMPORTANT] **Model Selection:** Refer to > [Firebase AI Logic Models](https://firebase.google.com/docs/ai-logic/models.md.txt) -> to find the latest supported model. Do not use old models like -> `gemini-2.0-pro` or `gemini-2.0-flash`. +> to find the latest supported model. Do not use any Gemini 1.x or Gemini 2.x +> models (such as `gemini-1.5-flash`, `gemini-2.0-flash`, `gemini-2.5-flash`, +> or `gemini-2.5-flash-lite`). > [!IMPORTANT] **Choose the Right API Provider:** Always use > `FirebaseAI.googleAI` (Gemini Developer API) as the default for prototyping diff --git a/plugins/firebase/.agents/skills/firebase-ai-logic-basics/references/ios_setup.md b/plugins/firebase/.agents/skills/firebase-ai-logic-basics/references/ios_setup.md index b0bdf62c..b7da86f0 100644 --- a/plugins/firebase/.agents/skills/firebase-ai-logic-basics/references/ios_setup.md +++ b/plugins/firebase/.agents/skills/firebase-ai-logic-basics/references/ios_setup.md @@ -16,7 +16,7 @@ let ai = FirebaseAI.firebaseAI( useLimitedUseAppCheckTokens: true ) -// [AGENT] Replace "" with the latest model from https://firebase.google.com/docs/ai-logic/models.md.txt +// [AGENT] Replace "" with the latest model from https://firebase.google.com/docs/ai-logic/models.md.txt (do NOT use Gemini 1.x or 2.x models) let model = ai.generativeModel(modelName: "") ``` diff --git a/plugins/firebase/.agents/skills/firebase-ai-logic-basics/references/usage_patterns_android.md b/plugins/firebase/.agents/skills/firebase-ai-logic-basics/references/usage_patterns_android.md index 082e6e3b..9f15f337 100644 --- a/plugins/firebase/.agents/skills/firebase-ai-logic-basics/references/usage_patterns_android.md +++ b/plugins/firebase/.agents/skills/firebase-ai-logic-basics/references/usage_patterns_android.md @@ -54,7 +54,7 @@ class MainActivity : AppCompatActivity() { useLimitedUseAppCheckTokens = true ) - // [AGENT] Replace "" with the latest model from https://firebase.google.com/docs/ai-logic/models.md.txt + // [AGENT] Replace "" with the latest model from https://firebase.google.com/docs/ai-logic/models.md.txt (do NOT use Gemini 1.x or 2.x models) val model = ai.generativeModel("") // Generate content diff --git a/plugins/firebase/.agents/skills/firebase-ai-logic-basics/references/usage_patterns_web.md b/plugins/firebase/.agents/skills/firebase-ai-logic-basics/references/usage_patterns_web.md index 8dd1b61e..3bc9ce7b 100644 --- a/plugins/firebase/.agents/skills/firebase-ai-logic-basics/references/usage_patterns_web.md +++ b/plugins/firebase/.agents/skills/firebase-ai-logic-basics/references/usage_patterns_web.md @@ -43,7 +43,7 @@ const generationConfig = { }; // Specify the config as part of creating the `GenerativeModel` instance -// [AGENT] Replace "" with the latest model from https://firebase.google.com/docs/ai-logic/models.md.txt +// [AGENT] Replace "" with the latest model from https://firebase.google.com/docs/ai-logic/models.md.txt (do NOT use Gemini 1.x or 2.x models like gemini-1.5-flash, gemini-2.0-flash, or gemini-2.5-flash) const model = getGenerativeModel(ai, { model: "", generationConfig }); ``` diff --git a/plugins/firebase/.agents/skills/firebase-app-hosting-basics/SKILL.md b/plugins/firebase/.agents/skills/firebase-app-hosting-basics/SKILL.md index a8564ac2..e311b203 100644 --- a/plugins/firebase/.agents/skills/firebase-app-hosting-basics/SKILL.md +++ b/plugins/firebase/.agents/skills/firebase-app-hosting-basics/SKILL.md @@ -83,10 +83,12 @@ This is the recommended flow for most users. ### Automated deployment via GitHub (CI/CD) Alternatively, set up a backend connected to a GitHub repository for automated -deployments "git push" deployments. This is only recommended for more advanced -users, and is not required to use App Hosting. See -[CLI Commands](references/cli_commands.md) for more information on how to set -this up using CLI commands. +"git push" deployments. For GitHub-connected backends, trigger rollouts with +`npx -y firebase-tools@latest apphosting:rollouts:create --git-branch ` +(do not use `rollouts:create` when deploying from local source with `deploy`). + +For other backend or secret flags (`backends:get`, `backends:delete`, etc.), run +`npx -y firebase-tools@latest --help`. ## Emulation diff --git a/plugins/firebase/.agents/skills/firebase-app-hosting-basics/references/cli_commands.md b/plugins/firebase/.agents/skills/firebase-app-hosting-basics/references/cli_commands.md deleted file mode 100644 index 87726f59..00000000 --- a/plugins/firebase/.agents/skills/firebase-app-hosting-basics/references/cli_commands.md +++ /dev/null @@ -1,83 +0,0 @@ -# App Hosting CLI Commands - -The Firebase CLI provides a comprehensive suite of commands to manage App -Hosting resources. These commands are often faster and more scriptable than -using the Firebase Console. - -## Initialization - -### `npx -y firebase-tools@latest init apphosting` - -- **Purpose**: Interactive command that sets up App Hosting in your local - project. Use this command only if you are able to handle interactive CLI - inputs well. Alternatively, you can manually edit `firebase.json` and - `apphosting.yml`. - -- **Effect**: - - - Detects your web framework. - - Creates/updates `apphosting.yaml`. - - Can optionally create a backend if one doesn't exist. - -## Backend Management - -### `npx -y firebase-tools@latest apphosting:backends:list` - -- **Purpose**: Lists all backends in the current project. - -### `npx -y firebase-tools@latest apphosting:backends:get ` - -- **Purpose**: Shows details for a specific backend. - -### `npx -y firebase-tools@latest apphosting:backends:delete ` - -- **Purpose**: Deletes a backend and its associated resources. - -## Secrets Management - -App Hosting uses Cloud Secret Manager to securely handle sensitive environment -variables (like API keys). - -### `npx -y firebase-tools@latest apphosting:secrets:set ` - -- **Purpose**: Creates or updates a secret in Cloud Secret Manager and makes it - available to App Hosting. -- **Behavior**: Prompts for the secret value interactively, or reads from stdin - via `printf '%s' ''` with `--data-file - --force`. - -### `npx -y firebase-tools@latest apphosting:secrets:grantaccess ` - -- **Purpose**: Grants the App Hosting service account permission to access the - secret. -- **Note**: Pass `--backend ` when reusing or updating an existing - secret. - -## Automated deployment via GitHub (CI/CD) - -**IMPORTANT** Only use this command for GitHub CI/CD deployments, not with -`npx -y firebase-tools@latest deploy`. - -### `npx -y firebase-tools@latest apphosting:rollouts:create ` - -- **Purpose**: Manually triggers a new rollout (deployment). -- **Options**: - - `--git-branch `: Deploy the latest commit from a specific branch. - - `--git-commit `: Deploy a specific commit. -- **Use Case**: Useful for redeploying without code changes, or rolling back to - a specific commit. - -## Backend Creation - -### `npx -y firebase-tools@latest apphosting:backends:create` - -- **Purpose**: Creates a new App Hosting backend (pass `--backend`, - `--primary-region`, and `--root-dir` for non-interactive deploys). -- **Options**: - - `--app `: The ID of an existing Firebase web app to associate with - the backend. - - `--backend `: The ID of the new backend. - - `--primary-region `: The primary region for the backend. - - `--root-dir `: The root directory for the backend. If omitted, - defaults to the root directory of the project. - - `--service-account `: The service account used to run the - server. If omitted, defaults to the default service account. diff --git a/plugins/firebase/.agents/skills/firebase-firestore/references/enterprise/web_sdk_usage.md b/plugins/firebase/.agents/skills/firebase-firestore/references/enterprise/web_sdk_usage.md index 34ed1f9e..e55e0e0c 100644 --- a/plugins/firebase/.agents/skills/firebase-firestore/references/enterprise/web_sdk_usage.md +++ b/plugins/firebase/.agents/skills/firebase-firestore/references/enterprise/web_sdk_usage.md @@ -68,10 +68,30 @@ const articlesWithAuthProfile = db.pipeline().collection("articles") const snapshot = await execute(articlesWithAuthProfile); ``` +### Vector Search & Similarity + +Leverage the database-native `.findNearest()` stage for vector similarity +lookups: + +```javascript +import { execute } from "firebase/firestore/pipelines"; + +// Execute vector similarity search within pipeline +const vectorPipeline = db.pipeline() + .collection("articles") + .findNearest({ + field: "embedding", + vectorValue: queryVector, + distanceMeasure: "cosine", + limit: 5 + }); +const results = await execute(vectorPipeline); +``` + ### Full-Text Search -Leverage the database-native `.search()` stage for high-performance text -lookups. +Leverage the database-native `.search()` stage (introduced in Firebase v12.13.0) +for high-performance text lookups. ```javascript import { documentMatches, execute, score } from "firebase/firestore/pipelines"; diff --git a/plugins/firebase/agent/skills/firebase-ai-logic-basics/SKILL.md b/plugins/firebase/agent/skills/firebase-ai-logic-basics/SKILL.md index e240ebe6..4d3cf79e 100644 --- a/plugins/firebase/agent/skills/firebase-ai-logic-basics/SKILL.md +++ b/plugins/firebase/agent/skills/firebase-ai-logic-basics/SKILL.md @@ -112,8 +112,12 @@ ______________________________________________________________________ > [!WARNING] **CRITICAL: Use current model names:** Always check the > [Firebase AI Logic Models documentation](https://firebase.google.com/docs/ai-logic/models.md.txt) -> for the currently supported model names. Do NOT use `gemini-2.0-pro` or -> `gemini-2.0-flash` or other older models that are shutdown. +> for the currently supported model names. Do NOT use any Gemini 1.x or Gemini +> 2.x models (such as `gemini-1.5-flash`, `gemini-1.5-pro`, `gemini-2.0-flash`, +> `gemini-2.0-pro`, `gemini-2.5-flash`, `gemini-2.5-flash-lite`, or +> `gemini-2.5-pro`), as older models are deprecated or shut down. Always use a +> currently supported Gemini 3+ model; if URL access is blocked in your +> environment, proceed directly without searching local files. ### Text-Only Generation @@ -279,8 +283,10 @@ ______________________________________________________________________ > [!WARNING] **CRITICAL: Use current model names:** Always check the > [Firebase AI Logic Models documentation](https://firebase.google.com/docs/ai-logic/models.md.txt) -> for the currently supported model names. Do NOT use `gemini-2.0-pro` or -> `gemini-2.0-flash` or other older models that are shutdown. +> for the currently supported model names. Do NOT use any Gemini 1.x or Gemini +> 2.x models (such as `gemini-1.5-flash`, `gemini-2.0-flash`, +> `gemini-2.5-flash`, or `gemini-2.5-flash-lite`), as older models are +> deprecated or shut down. ## References diff --git a/plugins/firebase/agent/skills/firebase-ai-logic-basics/references/flutter_setup.md b/plugins/firebase/agent/skills/firebase-ai-logic-basics/references/flutter_setup.md index bf31dc24..10d9c91f 100644 --- a/plugins/firebase/agent/skills/firebase-ai-logic-basics/references/flutter_setup.md +++ b/plugins/firebase/agent/skills/firebase-ai-logic-basics/references/flutter_setup.md @@ -57,8 +57,9 @@ Use `FirebaseAI.googleAI` for the **Gemini Developer API**. > [!IMPORTANT] **Model Selection:** Refer to > [Firebase AI Logic Models](https://firebase.google.com/docs/ai-logic/models.md.txt) -> to find the latest supported model. Do not use old models like -> `gemini-2.0-pro` or `gemini-2.0-flash`. +> to find the latest supported model. Do not use any Gemini 1.x or Gemini 2.x +> models (such as `gemini-1.5-flash`, `gemini-2.0-flash`, `gemini-2.5-flash`, +> or `gemini-2.5-flash-lite`). > [!IMPORTANT] **Choose the Right API Provider:** Always use > `FirebaseAI.googleAI` (Gemini Developer API) as the default for prototyping diff --git a/plugins/firebase/agent/skills/firebase-ai-logic-basics/references/ios_setup.md b/plugins/firebase/agent/skills/firebase-ai-logic-basics/references/ios_setup.md index b0bdf62c..b7da86f0 100644 --- a/plugins/firebase/agent/skills/firebase-ai-logic-basics/references/ios_setup.md +++ b/plugins/firebase/agent/skills/firebase-ai-logic-basics/references/ios_setup.md @@ -16,7 +16,7 @@ let ai = FirebaseAI.firebaseAI( useLimitedUseAppCheckTokens: true ) -// [AGENT] Replace "" with the latest model from https://firebase.google.com/docs/ai-logic/models.md.txt +// [AGENT] Replace "" with the latest model from https://firebase.google.com/docs/ai-logic/models.md.txt (do NOT use Gemini 1.x or 2.x models) let model = ai.generativeModel(modelName: "") ``` diff --git a/plugins/firebase/agent/skills/firebase-ai-logic-basics/references/usage_patterns_android.md b/plugins/firebase/agent/skills/firebase-ai-logic-basics/references/usage_patterns_android.md index 082e6e3b..9f15f337 100644 --- a/plugins/firebase/agent/skills/firebase-ai-logic-basics/references/usage_patterns_android.md +++ b/plugins/firebase/agent/skills/firebase-ai-logic-basics/references/usage_patterns_android.md @@ -54,7 +54,7 @@ class MainActivity : AppCompatActivity() { useLimitedUseAppCheckTokens = true ) - // [AGENT] Replace "" with the latest model from https://firebase.google.com/docs/ai-logic/models.md.txt + // [AGENT] Replace "" with the latest model from https://firebase.google.com/docs/ai-logic/models.md.txt (do NOT use Gemini 1.x or 2.x models) val model = ai.generativeModel("") // Generate content diff --git a/plugins/firebase/agent/skills/firebase-ai-logic-basics/references/usage_patterns_web.md b/plugins/firebase/agent/skills/firebase-ai-logic-basics/references/usage_patterns_web.md index 8dd1b61e..3bc9ce7b 100644 --- a/plugins/firebase/agent/skills/firebase-ai-logic-basics/references/usage_patterns_web.md +++ b/plugins/firebase/agent/skills/firebase-ai-logic-basics/references/usage_patterns_web.md @@ -43,7 +43,7 @@ const generationConfig = { }; // Specify the config as part of creating the `GenerativeModel` instance -// [AGENT] Replace "" with the latest model from https://firebase.google.com/docs/ai-logic/models.md.txt +// [AGENT] Replace "" with the latest model from https://firebase.google.com/docs/ai-logic/models.md.txt (do NOT use Gemini 1.x or 2.x models like gemini-1.5-flash, gemini-2.0-flash, or gemini-2.5-flash) const model = getGenerativeModel(ai, { model: "", generationConfig }); ``` diff --git a/plugins/firebase/agent/skills/firebase-app-hosting-basics/SKILL.md b/plugins/firebase/agent/skills/firebase-app-hosting-basics/SKILL.md index 8307fd89..0eb9c188 100644 --- a/plugins/firebase/agent/skills/firebase-app-hosting-basics/SKILL.md +++ b/plugins/firebase/agent/skills/firebase-app-hosting-basics/SKILL.md @@ -86,10 +86,12 @@ This is the recommended flow for most users. ### Automated deployment via GitHub (CI/CD) Alternatively, set up a backend connected to a GitHub repository for automated -deployments "git push" deployments. This is only recommended for more advanced -users, and is not required to use App Hosting. See -[CLI Commands](references/cli_commands.md) for more information on how to set -this up using CLI commands. +"git push" deployments. For GitHub-connected backends, trigger rollouts with +`npx -y firebase-tools@latest apphosting:rollouts:create --git-branch ` +(do not use `rollouts:create` when deploying from local source with `deploy`). + +For other backend or secret flags (`backends:get`, `backends:delete`, etc.), run +`npx -y firebase-tools@latest --help`. ## Emulation diff --git a/plugins/firebase/agent/skills/firebase-app-hosting-basics/references/cli_commands.md b/plugins/firebase/agent/skills/firebase-app-hosting-basics/references/cli_commands.md deleted file mode 100644 index 87726f59..00000000 --- a/plugins/firebase/agent/skills/firebase-app-hosting-basics/references/cli_commands.md +++ /dev/null @@ -1,83 +0,0 @@ -# App Hosting CLI Commands - -The Firebase CLI provides a comprehensive suite of commands to manage App -Hosting resources. These commands are often faster and more scriptable than -using the Firebase Console. - -## Initialization - -### `npx -y firebase-tools@latest init apphosting` - -- **Purpose**: Interactive command that sets up App Hosting in your local - project. Use this command only if you are able to handle interactive CLI - inputs well. Alternatively, you can manually edit `firebase.json` and - `apphosting.yml`. - -- **Effect**: - - - Detects your web framework. - - Creates/updates `apphosting.yaml`. - - Can optionally create a backend if one doesn't exist. - -## Backend Management - -### `npx -y firebase-tools@latest apphosting:backends:list` - -- **Purpose**: Lists all backends in the current project. - -### `npx -y firebase-tools@latest apphosting:backends:get ` - -- **Purpose**: Shows details for a specific backend. - -### `npx -y firebase-tools@latest apphosting:backends:delete ` - -- **Purpose**: Deletes a backend and its associated resources. - -## Secrets Management - -App Hosting uses Cloud Secret Manager to securely handle sensitive environment -variables (like API keys). - -### `npx -y firebase-tools@latest apphosting:secrets:set ` - -- **Purpose**: Creates or updates a secret in Cloud Secret Manager and makes it - available to App Hosting. -- **Behavior**: Prompts for the secret value interactively, or reads from stdin - via `printf '%s' ''` with `--data-file - --force`. - -### `npx -y firebase-tools@latest apphosting:secrets:grantaccess ` - -- **Purpose**: Grants the App Hosting service account permission to access the - secret. -- **Note**: Pass `--backend ` when reusing or updating an existing - secret. - -## Automated deployment via GitHub (CI/CD) - -**IMPORTANT** Only use this command for GitHub CI/CD deployments, not with -`npx -y firebase-tools@latest deploy`. - -### `npx -y firebase-tools@latest apphosting:rollouts:create ` - -- **Purpose**: Manually triggers a new rollout (deployment). -- **Options**: - - `--git-branch `: Deploy the latest commit from a specific branch. - - `--git-commit `: Deploy a specific commit. -- **Use Case**: Useful for redeploying without code changes, or rolling back to - a specific commit. - -## Backend Creation - -### `npx -y firebase-tools@latest apphosting:backends:create` - -- **Purpose**: Creates a new App Hosting backend (pass `--backend`, - `--primary-region`, and `--root-dir` for non-interactive deploys). -- **Options**: - - `--app `: The ID of an existing Firebase web app to associate with - the backend. - - `--backend `: The ID of the new backend. - - `--primary-region `: The primary region for the backend. - - `--root-dir `: The root directory for the backend. If omitted, - defaults to the root directory of the project. - - `--service-account `: The service account used to run the - server. If omitted, defaults to the default service account. diff --git a/plugins/firebase/agent/skills/firebase-firestore/references/enterprise/web_sdk_usage.md b/plugins/firebase/agent/skills/firebase-firestore/references/enterprise/web_sdk_usage.md index 34ed1f9e..e55e0e0c 100644 --- a/plugins/firebase/agent/skills/firebase-firestore/references/enterprise/web_sdk_usage.md +++ b/plugins/firebase/agent/skills/firebase-firestore/references/enterprise/web_sdk_usage.md @@ -68,10 +68,30 @@ const articlesWithAuthProfile = db.pipeline().collection("articles") const snapshot = await execute(articlesWithAuthProfile); ``` +### Vector Search & Similarity + +Leverage the database-native `.findNearest()` stage for vector similarity +lookups: + +```javascript +import { execute } from "firebase/firestore/pipelines"; + +// Execute vector similarity search within pipeline +const vectorPipeline = db.pipeline() + .collection("articles") + .findNearest({ + field: "embedding", + vectorValue: queryVector, + distanceMeasure: "cosine", + limit: 5 + }); +const results = await execute(vectorPipeline); +``` + ### Full-Text Search -Leverage the database-native `.search()` stage for high-performance text -lookups. +Leverage the database-native `.search()` stage (introduced in Firebase v12.13.0) +for high-performance text lookups. ```javascript import { documentMatches, execute, score } from "firebase/firestore/pipelines"; diff --git a/plugins/firebase/skills-lock.json b/plugins/firebase/skills-lock.json index b7e6ec0d..eaa74999 100644 --- a/plugins/firebase/skills-lock.json +++ b/plugins/firebase/skills-lock.json @@ -11,13 +11,13 @@ "source": "firebase/agent-skills", "sourceType": "github", "skillPath": "skills/firebase-ai-logic-basics/SKILL.md", - "computedHash": "0c486d8e316cb2d8d2acf04dc66b1f40f8dd046c363ad3c8c7a880057bab7493" + "computedHash": "ed9dc87a349aab717900bab157881e349fd26224264d0411982a12eeda12f357" }, "firebase-app-hosting-basics": { "source": "firebase/agent-skills", "sourceType": "github", "skillPath": "skills/firebase-app-hosting-basics/SKILL.md", - "computedHash": "035d4c365c5b3fe74620574f1b7918cb678a9bbf08ab4ab60a4b332b60139b66" + "computedHash": "5a982e11348d2e1373ce3dfec6e314861e39ccd03139de7cbd8a492942947243" }, "firebase-auth-basics": { "source": "firebase/agent-skills", @@ -47,7 +47,7 @@ "source": "firebase/agent-skills", "sourceType": "github", "skillPath": "skills/firebase-firestore/SKILL.md", - "computedHash": "7be20dbc227195b25d577f660932c7efe8b3df55b336f26c9d1a556cc3db411f" + "computedHash": "2c9989b46ad19f1469b0de9b48c6734f4c2f2a2536b8066098ab3ec6e0058ab1" }, "firebase-hosting-basics": { "source": "firebase/agent-skills", diff --git a/plugins/mastra/.agents/skills/mastra/SKILL.md b/plugins/mastra/.agents/skills/mastra/SKILL.md index 1f3078a1..cf7e734c 100644 --- a/plugins/mastra/.agents/skills/mastra/SKILL.md +++ b/plugins/mastra/.agents/skills/mastra/SKILL.md @@ -1,6 +1,6 @@ --- name: mastra -description: "Comprehensive Mastra framework guide for building agents, workflows, tools, memory, workspaces, and storage with current APIs. Use for documentation lookup, API verification, TypeScript setup, common errors, migrations, and `mastra api` CLI tasks: inspect or call resources on local, Mastra platform, or remote servers. For Mastra Factory operations, discover and activate the companion mastra-factory skill. Also report verified bugs and concrete documentation defects to the Mastra team automatically via the feedback endpoint." +description: "Comprehensive Mastra framework guide for building agents, workflows, tools, memory, workspaces, and storage with current APIs. Use for native capability discovery, logging, tracing, metrics/cost estimates, dataset experiments, documentation lookup, API verification, TypeScript setup, common errors, migrations, and `mastra api` CLI tasks: inspect or call resources on local, Mastra platform, or remote servers. For Mastra Factory operations, discover and activate the companion mastra-factory skill. Also report verified bugs and concrete documentation defects to the Mastra team automatically via the feedback endpoint." license: Apache-2.0 metadata: author: Mastra @@ -37,6 +37,9 @@ ls node_modules/@mastra/ | ----------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------- | | Create/install Mastra project | [`references/create-mastra.md`](references/create-mastra.md) | Setup guide with CLI and manual steps | | Choose Agent/Workflow/Tool/Memory/Storage | [`references/core-concepts.md`](references/core-concepts.md) | Core concepts and when to use each primitive | +| Add logging or set up tracing | [`references/embedded-docs.md`](references/embedded-docs.md) | Look up PinoLogger and observability configuration before custom instrumentation | +| Track automatic metrics or estimated model cost | [`references/embedded-docs.md`](references/embedded-docs.md) | Look up span-derived metrics, storage support, and pricing coverage | +| Evaluate quality or compare prompts/models | [`references/embedded-docs.md`](references/embedded-docs.md) | Look up datasets, experiments, and scorers | | How do I use Agent/Workflow/Tool? | [`references/embedded-docs.md`](references/embedded-docs.md) | Look up in `node_modules/@mastra/*/dist/docs/` | | How do I use X? (no packages) | [`references/remote-docs.md`](references/remote-docs.md) | Fetch from `https://mastra.ai/llms.txt` | | Choose or validate a model | [`references/model-selection.md`](references/model-selection.md) | Model format and provider registry lookup | @@ -145,9 +148,9 @@ What to do: Always verify before writing code: -1. Check whether Mastra packages are installed -2. Look up current API - - If installed: Use embedded docs [`references/embedded-docs.md`](references/embedded-docs.md) - - If not: Use remote docs [`references/remote-docs.md`](references/remote-docs.md) -3. Write code based on current docs -4. Test with the project scripts or Studio when available +1. Identify whether Mastra already provides the requested behavior using [`references/core-concepts.md`](references/core-concepts.md#discover-native-capabilities-first), before designing custom infrastructure. +2. Check installed packages and versions, then verify the capability's APIs, configuration, and limits. + - If installed: Use embedded docs [`references/embedded-docs.md`](references/embedded-docs.md) and installed types/source. + - If not: Use remote docs [`references/remote-docs.md`](references/remote-docs.md); verify compatibility before adopting newer features. +3. Use the native capability where it fits; implement custom logic only for the identified gap or application-owned requirements. +4. Test with the project scripts or Studio when available. diff --git a/plugins/mastra/.agents/skills/mastra/references/core-concepts.md b/plugins/mastra/.agents/skills/mastra/references/core-concepts.md index e43c0af5..11738c94 100644 --- a/plugins/mastra/.agents/skills/mastra/references/core-concepts.md +++ b/plugins/mastra/.agents/skills/mastra/references/core-concepts.md @@ -1,6 +1,10 @@ # Core Concepts Reference -Use this reference when deciding which Mastra primitive to use or when explaining the high-level shape of a Mastra application. +Use this reference when choosing Mastra primitives and native capabilities before designing custom infrastructure. + +## Discover native capabilities first + +Check whether Mastra already provides the requested behavior before designing custom infrastructure. Verify the installed version's capabilities, configuration, and limits using [embedded docs](embedded-docs.md), or [remote docs](remote-docs.md) when unavailable. Prefer native capabilities where they fit; add custom logic for identified gaps and application-specific business rules. ## Agents vs workflows diff --git a/plugins/mastra/agent/skills/mastra/SKILL.md b/plugins/mastra/agent/skills/mastra/SKILL.md index 1e038931..2541efb8 100644 --- a/plugins/mastra/agent/skills/mastra/SKILL.md +++ b/plugins/mastra/agent/skills/mastra/SKILL.md @@ -2,12 +2,13 @@ name: mastra description: "Comprehensive Mastra framework guide for building agents, workflows, tools, memory, workspaces, and storage with current APIs. Use for - documentation lookup, API verification, TypeScript setup, common errors, - migrations, and `mastra api` CLI tasks: inspect or call resources on local, - Mastra platform, or remote servers. For Mastra Factory operations, discover - and activate the companion mastra-factory skill. Also report verified bugs and - concrete documentation defects to the Mastra team automatically via the - feedback endpoint." + native capability discovery, logging, tracing, metrics/cost estimates, dataset + experiments, documentation lookup, API verification, TypeScript setup, common + errors, migrations, and `mastra api` CLI tasks: inspect or call resources on + local, Mastra platform, or remote servers. For Mastra Factory operations, + discover and activate the companion mastra-factory skill. Also report verified + bugs and concrete documentation defects to the Mastra team automatically via + the feedback endpoint." license: Apache-2.0 metadata: author: Mastra @@ -43,6 +44,9 @@ ls node_modules/@mastra/ | ----------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------- | | Create/install Mastra project | [`references/create-mastra.md`](references/create-mastra.md) | Setup guide with CLI and manual steps | | Choose Agent/Workflow/Tool/Memory/Storage | [`references/core-concepts.md`](references/core-concepts.md) | Core concepts and when to use each primitive | +| Add logging or set up tracing | [`references/embedded-docs.md`](references/embedded-docs.md) | Look up PinoLogger and observability configuration before custom instrumentation | +| Track automatic metrics or estimated model cost | [`references/embedded-docs.md`](references/embedded-docs.md) | Look up span-derived metrics, storage support, and pricing coverage | +| Evaluate quality or compare prompts/models | [`references/embedded-docs.md`](references/embedded-docs.md) | Look up datasets, experiments, and scorers | | How do I use Agent/Workflow/Tool? | [`references/embedded-docs.md`](references/embedded-docs.md) | Look up in `node_modules/@mastra/*/dist/docs/` | | How do I use X? (no packages) | [`references/remote-docs.md`](references/remote-docs.md) | Fetch from `https://mastra.ai/llms.txt` | | Choose or validate a model | [`references/model-selection.md`](references/model-selection.md) | Model format and provider registry lookup | @@ -151,9 +155,9 @@ What to do: Always verify before writing code: -1. Check whether Mastra packages are installed -2. Look up current API - - If installed: Use embedded docs [`references/embedded-docs.md`](references/embedded-docs.md) - - If not: Use remote docs [`references/remote-docs.md`](references/remote-docs.md) -3. Write code based on current docs -4. Test with the project scripts or Studio when available +1. Identify whether Mastra already provides the requested behavior using [`references/core-concepts.md`](references/core-concepts.md#discover-native-capabilities-first), before designing custom infrastructure. +2. Check installed packages and versions, then verify the capability's APIs, configuration, and limits. + - If installed: Use embedded docs [`references/embedded-docs.md`](references/embedded-docs.md) and installed types/source. + - If not: Use remote docs [`references/remote-docs.md`](references/remote-docs.md); verify compatibility before adopting newer features. +3. Use the native capability where it fits; implement custom logic only for the identified gap or application-owned requirements. +4. Test with the project scripts or Studio when available. diff --git a/plugins/mastra/agent/skills/mastra/references/core-concepts.md b/plugins/mastra/agent/skills/mastra/references/core-concepts.md index e43c0af5..11738c94 100644 --- a/plugins/mastra/agent/skills/mastra/references/core-concepts.md +++ b/plugins/mastra/agent/skills/mastra/references/core-concepts.md @@ -1,6 +1,10 @@ # Core Concepts Reference -Use this reference when deciding which Mastra primitive to use or when explaining the high-level shape of a Mastra application. +Use this reference when choosing Mastra primitives and native capabilities before designing custom infrastructure. + +## Discover native capabilities first + +Check whether Mastra already provides the requested behavior before designing custom infrastructure. Verify the installed version's capabilities, configuration, and limits using [embedded docs](embedded-docs.md), or [remote docs](remote-docs.md) when unavailable. Prefer native capabilities where they fit; add custom logic for identified gaps and application-specific business rules. ## Agents vs workflows diff --git a/plugins/mastra/skills-lock.json b/plugins/mastra/skills-lock.json index 6e45e32f..338f7fff 100644 --- a/plugins/mastra/skills-lock.json +++ b/plugins/mastra/skills-lock.json @@ -5,7 +5,7 @@ "source": "mastra-ai/skills", "sourceType": "github", "skillPath": "skills/mastra/SKILL.md", - "computedHash": "4e94f638072285c1b9de99013e16a40498bb826fcb8376ad63ef8671ebf05602" + "computedHash": "a857fcd05f042b20ad3561df502073c43d2eb4b50b0795ee45ee7ce305104a97" } } } diff --git a/plugins/nuxt-ui/.agents/skills/nuxt-ui/references/layouts/chat.md b/plugins/nuxt-ui/.agents/skills/nuxt-ui/references/layouts/chat.md index 8fc2b9fc..b10aeebf 100644 --- a/plugins/nuxt-ui/.agents/skills/nuxt-ui/references/layouts/chat.md +++ b/plugins/nuxt-ui/.agents/skills/nuxt-ui/references/layouts/chat.md @@ -104,7 +104,7 @@ export default defineEventHandler(async (event) => { UDashboardPanel ├── #header → UDashboardNavbar ├── #body → UContainer → UChatMessages -│ ├── #content → UChatReasoning, UChatTool, Comark +│ ├── #part → UChatReasoning, UChatTool, Comark │ └── #indicator (loading) └── #footer → UContainer → UChatPrompt └── UChatPromptSubmit @@ -145,40 +145,34 @@ function onSubmit() { ``` +## Updating large datasets + +UTable deep-watches `data` by default. For rows managed through array replacement, disable deep watching with `:watch-options="{ deep: false }"`. Replace the array and each changed row so the table refreshes its row models. + +```vue + + + +``` + +With deep watching disabled, do not rely on `push()`, `splice()`, or nested edits alone to refresh table row models. Keep the default watcher when in-place mutation is part of the update model. + +The separate `virtualize` option limits rendered rows for large datasets. It does not disable deep watching. Check the installed Nuxt UI version for virtualization support and its sticky or pinning restrictions. + ## Tips - Table is built on [TanStack Table v8](https://tanstack.com/table/v8) — columns use `ColumnDef` format with `accessorKey`, `header`, `cell` diff --git a/plugins/nuxt-ui/agent/skills/nuxt-ui/references/layouts/chat.md b/plugins/nuxt-ui/agent/skills/nuxt-ui/references/layouts/chat.md index 8fc2b9fc..b10aeebf 100644 --- a/plugins/nuxt-ui/agent/skills/nuxt-ui/references/layouts/chat.md +++ b/plugins/nuxt-ui/agent/skills/nuxt-ui/references/layouts/chat.md @@ -104,7 +104,7 @@ export default defineEventHandler(async (event) => { UDashboardPanel ├── #header → UDashboardNavbar ├── #body → UContainer → UChatMessages -│ ├── #content → UChatReasoning, UChatTool, Comark +│ ├── #part → UChatReasoning, UChatTool, Comark │ └── #indicator (loading) └── #footer → UContainer → UChatPrompt └── UChatPromptSubmit @@ -145,40 +145,34 @@ function onSubmit() { ``` +## Updating large datasets + +UTable deep-watches `data` by default. For rows managed through array replacement, disable deep watching with `:watch-options="{ deep: false }"`. Replace the array and each changed row so the table refreshes its row models. + +```vue + + + +``` + +With deep watching disabled, do not rely on `push()`, `splice()`, or nested edits alone to refresh table row models. Keep the default watcher when in-place mutation is part of the update model. + +The separate `virtualize` option limits rendered rows for large datasets. It does not disable deep watching. Check the installed Nuxt UI version for virtualization support and its sticky or pinning restrictions. + ## Tips - Table is built on [TanStack Table v8](https://tanstack.com/table/v8) — columns use `ColumnDef` format with `accessorKey`, `header`, `cell` diff --git a/plugins/nuxt-ui/skills-lock.json b/plugins/nuxt-ui/skills-lock.json index 442adbe5..1bd428cc 100644 --- a/plugins/nuxt-ui/skills-lock.json +++ b/plugins/nuxt-ui/skills-lock.json @@ -5,7 +5,7 @@ "source": "nuxt/ui", "sourceType": "github", "skillPath": "skills/nuxt-ui/SKILL.md", - "computedHash": "deacd4aed537a3744e99618dcca2d7258aff871697d3f0c78be49ba731e60907" + "computedHash": "6669bdad8c0a11f8cb28195652d03e1888be1b0ec9d714276e52aa241fd01bab" } } } diff --git a/plugins/orpc/.agents/skills/orpc-openapi/SKILL.md b/plugins/orpc/.agents/skills/orpc-openapi/SKILL.md index fe541b59..5ab2e34e 100644 --- a/plugins/orpc/.agents/skills/orpc-openapi/SKILL.md +++ b/plugins/orpc/.agents/skills/orpc-openapi/SKILL.md @@ -77,7 +77,7 @@ export async function fetch(request: Request): Promise { Smart Coercion: query, path, and form values arrive as strings, so add `SmartCoercionHandlerPlugin` whenever input schemas expect non-string types from those sources. It coerces schema-driven, lossless conversions only (`'123'` to `123`, `'true'`/`'on'` to `true`, ISO strings to `Date`, arrays to `Set`/`Map` via `x-native-type`) and leaves ambiguous values untouched. Skip it when you already coerce in the schema or performance is critical; it adds runtime overhead. -Other handler options: `interceptors`/`routingInterceptors`/`clientInterceptors` for logging and error mapping, `filter` to exclude procedures from matching, and `errorStatusMap` plus `customErrorResponseBodyEncoder` to customize error responses (by default `ORPCError` codes map to statuses via `COMMON_ERROR_STATUS_MAP`, for example `NOT_FOUND` to 404). +Other handler options: `interceptors`/`routingInterceptors`/`clientInterceptors` for logging and error mapping, `filter` to exclude procedures from matching, and `errorStatusMap` plus `errorResponseBodyEncoder` to customize error responses (by default `ORPCError` codes map to statuses via `COMMON_ERROR_STATUS_MAP`, for example `NOT_FOUND` to 404). ## Calling: OpenAPILink diff --git a/plugins/orpc/agent/skills/orpc-openapi/SKILL.md b/plugins/orpc/agent/skills/orpc-openapi/SKILL.md index 254b90bc..3404c292 100644 --- a/plugins/orpc/agent/skills/orpc-openapi/SKILL.md +++ b/plugins/orpc/agent/skills/orpc-openapi/SKILL.md @@ -87,7 +87,7 @@ export async function fetch(request: Request): Promise { Smart Coercion: query, path, and form values arrive as strings, so add `SmartCoercionHandlerPlugin` whenever input schemas expect non-string types from those sources. It coerces schema-driven, lossless conversions only (`'123'` to `123`, `'true'`/`'on'` to `true`, ISO strings to `Date`, arrays to `Set`/`Map` via `x-native-type`) and leaves ambiguous values untouched. Skip it when you already coerce in the schema or performance is critical; it adds runtime overhead. -Other handler options: `interceptors`/`routingInterceptors`/`clientInterceptors` for logging and error mapping, `filter` to exclude procedures from matching, and `errorStatusMap` plus `customErrorResponseBodyEncoder` to customize error responses (by default `ORPCError` codes map to statuses via `COMMON_ERROR_STATUS_MAP`, for example `NOT_FOUND` to 404). +Other handler options: `interceptors`/`routingInterceptors`/`clientInterceptors` for logging and error mapping, `filter` to exclude procedures from matching, and `errorStatusMap` plus `errorResponseBodyEncoder` to customize error responses (by default `ORPCError` codes map to statuses via `COMMON_ERROR_STATUS_MAP`, for example `NOT_FOUND` to 404). ## Calling: OpenAPILink diff --git a/plugins/orpc/skills-lock.json b/plugins/orpc/skills-lock.json index 22970e09..d6e23130 100644 --- a/plugins/orpc/skills-lock.json +++ b/plugins/orpc/skills-lock.json @@ -23,7 +23,7 @@ "source": "middleapi/orpc", "sourceType": "github", "skillPath": "skills/orpc-openapi/SKILL.md", - "computedHash": "3375d89d95a869df9c1bad94363bebca3539a7ae0973a20e7e0089882932ac43" + "computedHash": "b9c9dbdb324ef1f829c61688392ff42dc3b37837b7c2f0a7e10a259cc392e85e" } } } diff --git a/plugins/portless/.agents/skills/portless/SKILL.md b/plugins/portless/.agents/skills/portless/SKILL.md index 47321d50..01577184 100644 --- a/plugins/portless/.agents/skills/portless/SKILL.md +++ b/plugins/portless/.agents/skills/portless/SKILL.md @@ -169,6 +169,8 @@ period. Outside LAN mode, the proxy and its HTTP redirect listener bind only to the IPv4 and IPv6 loopback addresses, `127.0.0.1` and `::1`. They do not accept connections through LAN, VPN, or other network interfaces. +With `--unprivileged` (or `PORTLESS_UNPRIVILEGED=1`) the proxy takes a port below 1024 without `sudo`: it binds the wildcard addresses, which macOS allows for non-root processes, and refuses every non-loopback peer itself. It serves plain HTTP on port 80 unless `--https` is given, because installing the CA would be a prompt; with `--https` the CA is generated but not installed, so run `portless trust` once yourself. It never writes the hosts file: automatic hosts sync is off, `PORTLESS_SYNC_HOSTS=1` together with it is refused, and Safari or a custom TLD need `portless hosts sync` run once by you. Linux needs `net.ipv4.ip_unprivileged_port_start` to cover the port; portless checks and prints the sysctl command instead of falling back to another port. The mode is remembered for auto-start and never triggers a sudo prompt, so it suits scripts, agents and managed machines. + When portless itself returns an error (404 for an unknown host, 421 for a misdirected request, 502 when the app is unreachable, 508 for a request loop), the body depends on the `Accept` header. Browsers (`text/html`) get an HTML page. curl, `fetch`, and other clients get JSON such as `{"error":"bad_gateway","upstream":"myapp.localhost","message":"..."}`, with `error` set to `not_found`, `misdirected_request`, `bad_gateway`, or `loop_detected`. Parse that JSON instead of scraping HTML. Responses from the app itself are forwarded unchanged. Hostnames outside the portless TLDs, for example a site a DNS blocklist points at 127.0.0.1, get 421 Misdirected Request instead of the app list. `.localhost` domains resolve to `127.0.0.1` natively in Chrome, Firefox, and Edge. Safari relies on the system DNS resolver, which may not handle `.localhost` subdomains on all configurations. Run `portless hosts sync` to add entries to `/etc/hosts` if needed. @@ -185,22 +187,23 @@ Portless stores its state (routes, PID file, port file) in `~/.portless`. When t ### Environment variables -| Variable | Description | -| --------------------- | ------------------------------------------------------------------------------ | -| `PORTLESS_PORT` | Override the default proxy port (default: 443 with HTTPS, 80 without) | -| `PORTLESS_APP_PORT` | Use a fixed port for the app (skip auto-assignment) | -| `PORTLESS_HTTPS` | HTTPS on by default; set to `0` to disable (same as `--no-tls`) | -| `PORTLESS_LAN` | Set to `1` to always enable LAN mode (auto-detects LAN IP) | -| `PORTLESS_LAN_IP` | Pin a specific LAN IP for LAN mode | -| `PORTLESS_TLD` | Use one or more TLDs, single or multi-segment (e.g. localhost,dev.example.com) | -| `PORTLESS_WILDCARD` | Set to `1` to allow unregistered subdomains to fall back to parent | -| `PORTLESS_SYNC_HOSTS` | Set to `0` to disable auto-sync of /etc/hosts (on by default) | -| `PORTLESS_TAILSCALE` | Set to `1` to share apps on your Tailscale network (same as `--tailscale`) | -| `PORTLESS_FUNNEL` | Set to `1` to share apps publicly via Tailscale Funnel (same as `--funnel`) | -| `PORTLESS_NGROK` | Set to `1` to share apps publicly via ngrok (same as `--ngrok`) | -| `PORTLESS_CLOUDFLARE` | Set to `1` to share apps publicly via Cloudflare (same as `--cloudflare`) | -| `PORTLESS_STATE_DIR` | Override the state directory | -| `PORTLESS=0` | Bypass the proxy, run the command directly | +| Variable | Description | +| ----------------------- | ------------------------------------------------------------------------------ | +| `PORTLESS_PORT` | Override the default proxy port (default: 443 with HTTPS, 80 without) | +| `PORTLESS_APP_PORT` | Use a fixed port for the app (skip auto-assignment) | +| `PORTLESS_HTTPS` | HTTPS on by default; set to `0` to disable (same as `--no-tls`) | +| `PORTLESS_LAN` | Set to `1` to always enable LAN mode (auto-detects LAN IP) | +| `PORTLESS_LAN_IP` | Pin a specific LAN IP for LAN mode | +| `PORTLESS_TLD` | Use one or more TLDs, single or multi-segment (e.g. localhost,dev.example.com) | +| `PORTLESS_WILDCARD` | Set to `1` to allow unregistered subdomains to fall back to parent | +| `PORTLESS_UNPRIVILEGED` | Set to `1` to take a port below 1024 without sudo (same as `--unprivileged`) | +| `PORTLESS_SYNC_HOSTS` | Set to `0` to disable auto-sync of /etc/hosts (on by default) | +| `PORTLESS_TAILSCALE` | Set to `1` to share apps on your Tailscale network (same as `--tailscale`) | +| `PORTLESS_FUNNEL` | Set to `1` to share apps publicly via Tailscale Funnel (same as `--funnel`) | +| `PORTLESS_NGROK` | Set to `1` to share apps publicly via ngrok (same as `--ngrok`) | +| `PORTLESS_CLOUDFLARE` | Set to `1` to share apps publicly via Cloudflare (same as `--cloudflare`) | +| `PORTLESS_STATE_DIR` | Override the state directory | +| `PORTLESS=0` | Bypass the proxy, run the command directly | ### HTTP/2 + HTTPS @@ -317,6 +320,7 @@ The chosen service configuration is written into launchd, systemd, or Task Sched | `portless proxy start --no-tls` | Start without HTTPS (plain HTTP on port 80) | | `portless proxy start --lan` | Start in LAN mode (mDNS `.local`, auto-follows LAN IP changes) | | `portless proxy start -p ` | Start the proxy on a custom port | +| `portless proxy start --unprivileged` | Plain HTTP on port 80 without sudo, nothing installed | | `portless proxy start --tld test` | Use .test instead of .localhost | | `portless proxy start --tld localhost --tld test` | Serve both TLDs from one proxy | | `portless proxy start --tld dev.example.com` | Use a multi-segment TLD for production-parity URLs | @@ -424,6 +428,7 @@ The default ports (80 for HTTP, 443 for HTTPS) require `sudo` on macOS and Linux ```bash portless proxy start --https # Auto-elevates with sudo for port 443 portless proxy start -p 1355 --https # No sudo needed (URLs include :1355) +portless proxy start --unprivileged # Plain HTTP on port 80, no sudo, clean URLs portless proxy stop # Stop (use sudo if started with sudo) ``` diff --git a/plugins/portless/agent/skills/portless/SKILL.md b/plugins/portless/agent/skills/portless/SKILL.md index d9d35e2d..fccb3eb4 100644 --- a/plugins/portless/agent/skills/portless/SKILL.md +++ b/plugins/portless/agent/skills/portless/SKILL.md @@ -172,6 +172,8 @@ period. Outside LAN mode, the proxy and its HTTP redirect listener bind only to the IPv4 and IPv6 loopback addresses, `127.0.0.1` and `::1`. They do not accept connections through LAN, VPN, or other network interfaces. +With `--unprivileged` (or `PORTLESS_UNPRIVILEGED=1`) the proxy takes a port below 1024 without `sudo`: it binds the wildcard addresses, which macOS allows for non-root processes, and refuses every non-loopback peer itself. It serves plain HTTP on port 80 unless `--https` is given, because installing the CA would be a prompt; with `--https` the CA is generated but not installed, so run `portless trust` once yourself. It never writes the hosts file: automatic hosts sync is off, `PORTLESS_SYNC_HOSTS=1` together with it is refused, and Safari or a custom TLD need `portless hosts sync` run once by you. Linux needs `net.ipv4.ip_unprivileged_port_start` to cover the port; portless checks and prints the sysctl command instead of falling back to another port. The mode is remembered for auto-start and never triggers a sudo prompt, so it suits scripts, agents and managed machines. + When portless itself returns an error (404 for an unknown host, 421 for a misdirected request, 502 when the app is unreachable, 508 for a request loop), the body depends on the `Accept` header. Browsers (`text/html`) get an HTML page. curl, `fetch`, and other clients get JSON such as `{"error":"bad_gateway","upstream":"myapp.localhost","message":"..."}`, with `error` set to `not_found`, `misdirected_request`, `bad_gateway`, or `loop_detected`. Parse that JSON instead of scraping HTML. Responses from the app itself are forwarded unchanged. Hostnames outside the portless TLDs, for example a site a DNS blocklist points at 127.0.0.1, get 421 Misdirected Request instead of the app list. `.localhost` domains resolve to `127.0.0.1` natively in Chrome, Firefox, and Edge. Safari relies on the system DNS resolver, which may not handle `.localhost` subdomains on all configurations. Run `portless hosts sync` to add entries to `/etc/hosts` if needed. @@ -188,22 +190,23 @@ Portless stores its state (routes, PID file, port file) in `~/.portless`. When t ### Environment variables -| Variable | Description | -| --------------------- | ------------------------------------------------------------------------------ | -| `PORTLESS_PORT` | Override the default proxy port (default: 443 with HTTPS, 80 without) | -| `PORTLESS_APP_PORT` | Use a fixed port for the app (skip auto-assignment) | -| `PORTLESS_HTTPS` | HTTPS on by default; set to `0` to disable (same as `--no-tls`) | -| `PORTLESS_LAN` | Set to `1` to always enable LAN mode (auto-detects LAN IP) | -| `PORTLESS_LAN_IP` | Pin a specific LAN IP for LAN mode | -| `PORTLESS_TLD` | Use one or more TLDs, single or multi-segment (e.g. localhost,dev.example.com) | -| `PORTLESS_WILDCARD` | Set to `1` to allow unregistered subdomains to fall back to parent | -| `PORTLESS_SYNC_HOSTS` | Set to `0` to disable auto-sync of /etc/hosts (on by default) | -| `PORTLESS_TAILSCALE` | Set to `1` to share apps on your Tailscale network (same as `--tailscale`) | -| `PORTLESS_FUNNEL` | Set to `1` to share apps publicly via Tailscale Funnel (same as `--funnel`) | -| `PORTLESS_NGROK` | Set to `1` to share apps publicly via ngrok (same as `--ngrok`) | -| `PORTLESS_CLOUDFLARE` | Set to `1` to share apps publicly via Cloudflare (same as `--cloudflare`) | -| `PORTLESS_STATE_DIR` | Override the state directory | -| `PORTLESS=0` | Bypass the proxy, run the command directly | +| Variable | Description | +| ----------------------- | ------------------------------------------------------------------------------ | +| `PORTLESS_PORT` | Override the default proxy port (default: 443 with HTTPS, 80 without) | +| `PORTLESS_APP_PORT` | Use a fixed port for the app (skip auto-assignment) | +| `PORTLESS_HTTPS` | HTTPS on by default; set to `0` to disable (same as `--no-tls`) | +| `PORTLESS_LAN` | Set to `1` to always enable LAN mode (auto-detects LAN IP) | +| `PORTLESS_LAN_IP` | Pin a specific LAN IP for LAN mode | +| `PORTLESS_TLD` | Use one or more TLDs, single or multi-segment (e.g. localhost,dev.example.com) | +| `PORTLESS_WILDCARD` | Set to `1` to allow unregistered subdomains to fall back to parent | +| `PORTLESS_UNPRIVILEGED` | Set to `1` to take a port below 1024 without sudo (same as `--unprivileged`) | +| `PORTLESS_SYNC_HOSTS` | Set to `0` to disable auto-sync of /etc/hosts (on by default) | +| `PORTLESS_TAILSCALE` | Set to `1` to share apps on your Tailscale network (same as `--tailscale`) | +| `PORTLESS_FUNNEL` | Set to `1` to share apps publicly via Tailscale Funnel (same as `--funnel`) | +| `PORTLESS_NGROK` | Set to `1` to share apps publicly via ngrok (same as `--ngrok`) | +| `PORTLESS_CLOUDFLARE` | Set to `1` to share apps publicly via Cloudflare (same as `--cloudflare`) | +| `PORTLESS_STATE_DIR` | Override the state directory | +| `PORTLESS=0` | Bypass the proxy, run the command directly | ### HTTP/2 + HTTPS @@ -320,6 +323,7 @@ The chosen service configuration is written into launchd, systemd, or Task Sched | `portless proxy start --no-tls` | Start without HTTPS (plain HTTP on port 80) | | `portless proxy start --lan` | Start in LAN mode (mDNS `.local`, auto-follows LAN IP changes) | | `portless proxy start -p ` | Start the proxy on a custom port | +| `portless proxy start --unprivileged` | Plain HTTP on port 80 without sudo, nothing installed | | `portless proxy start --tld test` | Use .test instead of .localhost | | `portless proxy start --tld localhost --tld test` | Serve both TLDs from one proxy | | `portless proxy start --tld dev.example.com` | Use a multi-segment TLD for production-parity URLs | @@ -427,6 +431,7 @@ The default ports (80 for HTTP, 443 for HTTPS) require `sudo` on macOS and Linux ```bash portless proxy start --https # Auto-elevates with sudo for port 443 portless proxy start -p 1355 --https # No sudo needed (URLs include :1355) +portless proxy start --unprivileged # Plain HTTP on port 80, no sudo, clean URLs portless proxy stop # Stop (use sudo if started with sudo) ``` diff --git a/plugins/portless/skills-lock.json b/plugins/portless/skills-lock.json index 735dd0a1..30bcfbe0 100644 --- a/plugins/portless/skills-lock.json +++ b/plugins/portless/skills-lock.json @@ -5,7 +5,7 @@ "source": "vercel-labs/portless", "sourceType": "github", "skillPath": "skills/portless/SKILL.md", - "computedHash": "8229594f9f664d79159147d17bc0495df4b0bf00e2c0f693020afa4d949b24e9" + "computedHash": "b2642f023bb321fb7eceb6d5e4d24262771c90d7405dd467dbff8b9492bdc342" } } } diff --git a/plugins/react/.agents/skills/vercel-react-view-transitions/AGENTS.md b/plugins/react/.agents/skills/vercel-react-view-transitions/AGENTS.md index ad47782c..5696dbc5 100644 --- a/plugins/react/.agents/skills/vercel-react-view-transitions/AGENTS.md +++ b/plugins/react/.agents/skills/vercel-react-view-transitions/AGENTS.md @@ -44,7 +44,7 @@ Reserve directional slides for hierarchical navigation (list → detail) and ord ## Availability - **Next.js:** Do **not** install `react@canary` — the App Router already bundles React canary internally. `ViewTransition` works out of the box. `npm ls react` may show a stable-looking version; this is expected. -- **Without Next.js:** Install `react@canary react-dom@canary` (`ViewTransition` is not in stable React). +- **Without Next.js:** Use stable `react` and `react-dom` 19.3 or newer (`ViewTransition` and `addTransitionType` became stable in React 19.3). Earlier stable React versions do not include these APIs. - Browser support: Chromium 125+ (React needs the v2 object form of `startViewTransition`), Firefox 144+, Safari 18.2+. Graceful degradation on unsupported browsers. --- diff --git a/plugins/react/.agents/skills/vercel-react-view-transitions/SKILL.md b/plugins/react/.agents/skills/vercel-react-view-transitions/SKILL.md index eea9e89f..665db73f 100644 --- a/plugins/react/.agents/skills/vercel-react-view-transitions/SKILL.md +++ b/plugins/react/.agents/skills/vercel-react-view-transitions/SKILL.md @@ -43,7 +43,7 @@ Reserve directional slides for hierarchical navigation (list → detail) and ord ## Availability - **Next.js:** Do **not** install `react@canary` — the App Router already bundles React canary internally. `ViewTransition` works out of the box. `npm ls react` may show a stable-looking version; this is expected. -- **Without Next.js:** Install `react@canary react-dom@canary` (`ViewTransition` is not in stable React). +- **Without Next.js:** Use stable `react` and `react-dom` 19.3 or newer (`ViewTransition` and `addTransitionType` became stable in React 19.3). Earlier stable React versions do not include these APIs. - Browser support: Chromium 125+ (React needs the v2 object form of `startViewTransition`), Firefox 144+, Safari 18.2+. Graceful degradation on unsupported browsers. --- diff --git a/plugins/react/agent/skills/vercel-react-view-transitions/AGENTS.md b/plugins/react/agent/skills/vercel-react-view-transitions/AGENTS.md index ad47782c..5696dbc5 100644 --- a/plugins/react/agent/skills/vercel-react-view-transitions/AGENTS.md +++ b/plugins/react/agent/skills/vercel-react-view-transitions/AGENTS.md @@ -44,7 +44,7 @@ Reserve directional slides for hierarchical navigation (list → detail) and ord ## Availability - **Next.js:** Do **not** install `react@canary` — the App Router already bundles React canary internally. `ViewTransition` works out of the box. `npm ls react` may show a stable-looking version; this is expected. -- **Without Next.js:** Install `react@canary react-dom@canary` (`ViewTransition` is not in stable React). +- **Without Next.js:** Use stable `react` and `react-dom` 19.3 or newer (`ViewTransition` and `addTransitionType` became stable in React 19.3). Earlier stable React versions do not include these APIs. - Browser support: Chromium 125+ (React needs the v2 object form of `startViewTransition`), Firefox 144+, Safari 18.2+. Graceful degradation on unsupported browsers. --- diff --git a/plugins/react/agent/skills/vercel-react-view-transitions/SKILL.md b/plugins/react/agent/skills/vercel-react-view-transitions/SKILL.md index 7f686d73..34b8a2c9 100644 --- a/plugins/react/agent/skills/vercel-react-view-transitions/SKILL.md +++ b/plugins/react/agent/skills/vercel-react-view-transitions/SKILL.md @@ -51,7 +51,7 @@ Reserve directional slides for hierarchical navigation (list → detail) and ord ## Availability - **Next.js:** Do **not** install `react@canary` — the App Router already bundles React canary internally. `ViewTransition` works out of the box. `npm ls react` may show a stable-looking version; this is expected. -- **Without Next.js:** Install `react@canary react-dom@canary` (`ViewTransition` is not in stable React). +- **Without Next.js:** Use stable `react` and `react-dom` 19.3 or newer (`ViewTransition` and `addTransitionType` became stable in React 19.3). Earlier stable React versions do not include these APIs. - Browser support: Chromium 125+ (React needs the v2 object form of `startViewTransition`), Firefox 144+, Safari 18.2+. Graceful degradation on unsupported browsers. --- diff --git a/plugins/react/skills-lock.json b/plugins/react/skills-lock.json index 5e8322c9..7ee37d60 100644 --- a/plugins/react/skills-lock.json +++ b/plugins/react/skills-lock.json @@ -17,7 +17,7 @@ "source": "vercel-labs/agent-skills", "sourceType": "github", "skillPath": "skills/react-view-transitions/SKILL.md", - "computedHash": "2033ef20681c90d4f93deee719e55e019c254e496d9bf80381c27cc539292001" + "computedHash": "fb654c297f52c2771ce64b22a4a18509d0412ef07e020bc09625441df18a750d" } } } diff --git a/plugins/tsdown/.agents/skills/tsdown/references/option-platform.md b/plugins/tsdown/.agents/skills/tsdown/references/option-platform.md index 3a64af3b..5df05a6f 100644 --- a/plugins/tsdown/.agents/skills/tsdown/references/option-platform.md +++ b/plugins/tsdown/.agents/skills/tsdown/references/option-platform.md @@ -91,13 +91,23 @@ export default defineConfig({ ## CJS Format Limitation -**CJS format always uses `node` platform** and cannot be changed. +**CJS format always uses `node` platform**, and tsdown warns when `platform: 'browser'` is set. ```ts export default defineConfig({ entry: ['src/index.ts'], format: ['cjs'], - platform: 'browser', // Ignored for CJS + platform: 'browser', // Ignored for CJS, with a warning +}) +``` + +Use `platform: 'neutral'` if the code isn't browser-only. To force the browser platform for CJS, override it via `inputOptions`: + +```ts +export default defineConfig({ + format: ['cjs'], + platform: 'browser', + inputOptions: { platform: 'browser' }, }) ``` diff --git a/plugins/tsdown/.agents/skills/tsdown/references/reference-cli.md b/plugins/tsdown/.agents/skills/tsdown/references/reference-cli.md index 8213687d..e44ae8d1 100644 --- a/plugins/tsdown/.agents/skills/tsdown/references/reference-cli.md +++ b/plugins/tsdown/.agents/skills/tsdown/references/reference-cli.md @@ -222,10 +222,11 @@ Access as `import.meta.env.*` or `process.env.*`. ### `--env-file ` -Load environment variables from file: +Load environment variables from file. Repeat to load several files (later files win, missing files are skipped): ```bash tsdown --env-file .env.production +tsdown --env-file .env --env-file .env.local ``` ### `--env-prefix ` diff --git a/plugins/tsdown/agent/skills/tsdown/references/option-platform.md b/plugins/tsdown/agent/skills/tsdown/references/option-platform.md index 3a64af3b..5df05a6f 100644 --- a/plugins/tsdown/agent/skills/tsdown/references/option-platform.md +++ b/plugins/tsdown/agent/skills/tsdown/references/option-platform.md @@ -91,13 +91,23 @@ export default defineConfig({ ## CJS Format Limitation -**CJS format always uses `node` platform** and cannot be changed. +**CJS format always uses `node` platform**, and tsdown warns when `platform: 'browser'` is set. ```ts export default defineConfig({ entry: ['src/index.ts'], format: ['cjs'], - platform: 'browser', // Ignored for CJS + platform: 'browser', // Ignored for CJS, with a warning +}) +``` + +Use `platform: 'neutral'` if the code isn't browser-only. To force the browser platform for CJS, override it via `inputOptions`: + +```ts +export default defineConfig({ + format: ['cjs'], + platform: 'browser', + inputOptions: { platform: 'browser' }, }) ``` diff --git a/plugins/tsdown/agent/skills/tsdown/references/reference-cli.md b/plugins/tsdown/agent/skills/tsdown/references/reference-cli.md index 8213687d..e44ae8d1 100644 --- a/plugins/tsdown/agent/skills/tsdown/references/reference-cli.md +++ b/plugins/tsdown/agent/skills/tsdown/references/reference-cli.md @@ -222,10 +222,11 @@ Access as `import.meta.env.*` or `process.env.*`. ### `--env-file ` -Load environment variables from file: +Load environment variables from file. Repeat to load several files (later files win, missing files are skipped): ```bash tsdown --env-file .env.production +tsdown --env-file .env --env-file .env.local ``` ### `--env-prefix ` diff --git a/plugins/tsdown/skills-lock.json b/plugins/tsdown/skills-lock.json index a9baa392..9bcbff55 100644 --- a/plugins/tsdown/skills-lock.json +++ b/plugins/tsdown/skills-lock.json @@ -5,7 +5,7 @@ "source": "rolldown/tsdown", "sourceType": "github", "skillPath": "skills/tsdown/SKILL.md", - "computedHash": "5764d08af27a89c5fdaf3d49926116636ea33580b864e3aae201a90703a7ef53" + "computedHash": "77e5f80fd74dd03f3d93e9d744833add021350f05ee0c267c14e22aa9eba6d81" }, "tsdown-migrate": { "source": "rolldown/tsdown", diff --git a/plugins/vercel-sandbox/.agents/skills/sandbox/SKILL.md b/plugins/vercel-sandbox/.agents/skills/sandbox/SKILL.md index 6eee846a..4163ce42 100644 --- a/plugins/vercel-sandbox/.agents/skills/sandbox/SKILL.md +++ b/plugins/vercel-sandbox/.agents/skills/sandbox/SKILL.md @@ -1035,6 +1035,7 @@ sandbox create opencode sandbox create pi sandbox create claude sandbox create codex +sandbox create fx # Fork an existing sandbox (inherits config, incl. env; --env replaces it) sandbox fork @@ -1054,7 +1055,8 @@ sandbox run --rm -- npm build # DELETES the sandbox after running # Execute command in an existing sandbox sandbox exec -- npm install -sandbox exec --stop -- npm build +sandbox exec -- npm build +sandbox stop # Start an interactive shell sandbox connect @@ -1062,6 +1064,37 @@ sandbox connect # Copy files sandbox cp local-file.txt :/vercel/sandbox/ +# Start a command and retrieve its ID for later inspection +sandbox exec --detach -- npm run dev +sandbox commands get +sandbox commands logs +sandbox commands wait +sandbox commands kill --signal SIGTERM # Also SIGKILL, SIGINT, SIGHUP, SIGQUIT + +# Pipe local input into a command and stream its output in one invocation +printf 'hello\n' | sandbox exec --stdin -- cat + +# --stdin cannot be combined with --interactive + +# Keep stdin open when later processes need to write to a detached command +# Wait for each write to finish before another process writes to the same command +command_id=$(sandbox exec --detach --stdin -- cat) +printf 'hello\n' | sandbox commands write "$command_id" +sandbox commands close-stdin "$command_id" +# output waits for exit; use commands logs to stream while running +# CLI output is text and does not preserve arbitrary binary bytes +sandbox commands output "$command_id" --stream stdout # Also accepts stderr or both + +# Get the public URL for a published port in the running session +sandbox domain 3000 + +# Create a Linux user and shared group, then run a command as that user +sandbox users create alice +sandbox groups create devs +sandbox groups add-user devs alice +sandbox users exec alice -- id +sandbox groups remove-user devs alice + # Add time to the current running session without changing future defaults sandbox extend @@ -1101,6 +1134,12 @@ sandbox config keep-last-snapshots-for sandbox config delete-evicted-snapshots sandbox config current-snapshot sandbox config network-policy --network-policy deny-all +sandbox config network-policy --allowed-domain '*' --request-header api.example.com:x-source=ci # domain:header=value +API_AUTH="Bearer $API_TOKEN" sandbox config network-policy --allowed-domain '*' --request-header-from-env api.example.com:authorization=API_AUTH # Secret value read from $API_AUTH +sandbox config network-policy --network-policy-file policy.json # Whole policy as SDK NetworkPolicy JSON; use - for stdin +sandbox config network-policy --network-policy-file - < --tag env=prod ``` @@ -1113,6 +1152,13 @@ Agent shortcuts use the universal image and require an interactive terminal. Do not combine them with `--image`, `--runtime`, or `--snapshot`. Configure authentication for the agent separately from `sandbox login`. +For fx, choose a sign-in option on first launch or pass an exported AI Gateway +API key with `sandbox create fx --env AI_GATEWAY_API_KEY`. The shortcut preserves +fx's default permissions. fx can update itself inside the sandbox, so its version +may change between sessions. Its reconnect command uses `fx -c` to continue the +conversation. If you supplied `--env`, export the same values locally before +reconnecting; the hint includes names only. + Exiting the agent leaves the sandbox running. Unless you pass `--silent`, the CLI prints reconnect and stop commands. Follow any environment-variable reminder printed with the reconnect command. diff --git a/plugins/vercel-sandbox/agent/skills/sandbox/SKILL.md b/plugins/vercel-sandbox/agent/skills/sandbox/SKILL.md index cecdcd0d..c3367672 100644 --- a/plugins/vercel-sandbox/agent/skills/sandbox/SKILL.md +++ b/plugins/vercel-sandbox/agent/skills/sandbox/SKILL.md @@ -1037,6 +1037,7 @@ sandbox create opencode sandbox create pi sandbox create claude sandbox create codex +sandbox create fx # Fork an existing sandbox (inherits config, incl. env; --env replaces it) sandbox fork @@ -1056,7 +1057,8 @@ sandbox run --rm -- npm build # DELETES the sandbox after running # Execute command in an existing sandbox sandbox exec -- npm install -sandbox exec --stop -- npm build +sandbox exec -- npm build +sandbox stop # Start an interactive shell sandbox connect @@ -1064,6 +1066,37 @@ sandbox connect # Copy files sandbox cp local-file.txt :/vercel/sandbox/ +# Start a command and retrieve its ID for later inspection +sandbox exec --detach -- npm run dev +sandbox commands get +sandbox commands logs +sandbox commands wait +sandbox commands kill --signal SIGTERM # Also SIGKILL, SIGINT, SIGHUP, SIGQUIT + +# Pipe local input into a command and stream its output in one invocation +printf 'hello\n' | sandbox exec --stdin -- cat + +# --stdin cannot be combined with --interactive + +# Keep stdin open when later processes need to write to a detached command +# Wait for each write to finish before another process writes to the same command +command_id=$(sandbox exec --detach --stdin -- cat) +printf 'hello\n' | sandbox commands write "$command_id" +sandbox commands close-stdin "$command_id" +# output waits for exit; use commands logs to stream while running +# CLI output is text and does not preserve arbitrary binary bytes +sandbox commands output "$command_id" --stream stdout # Also accepts stderr or both + +# Get the public URL for a published port in the running session +sandbox domain 3000 + +# Create a Linux user and shared group, then run a command as that user +sandbox users create alice +sandbox groups create devs +sandbox groups add-user devs alice +sandbox users exec alice -- id +sandbox groups remove-user devs alice + # Add time to the current running session without changing future defaults sandbox extend @@ -1103,6 +1136,12 @@ sandbox config keep-last-snapshots-for sandbox config delete-evicted-snapshots sandbox config current-snapshot sandbox config network-policy --network-policy deny-all +sandbox config network-policy --allowed-domain '*' --request-header api.example.com:x-source=ci # domain:header=value +API_AUTH="Bearer $API_TOKEN" sandbox config network-policy --allowed-domain '*' --request-header-from-env api.example.com:authorization=API_AUTH # Secret value read from $API_AUTH +sandbox config network-policy --network-policy-file policy.json # Whole policy as SDK NetworkPolicy JSON; use - for stdin +sandbox config network-policy --network-policy-file - < --tag env=prod ``` @@ -1115,6 +1154,13 @@ Agent shortcuts use the universal image and require an interactive terminal. Do not combine them with `--image`, `--runtime`, or `--snapshot`. Configure authentication for the agent separately from `sandbox login`. +For fx, choose a sign-in option on first launch or pass an exported AI Gateway +API key with `sandbox create fx --env AI_GATEWAY_API_KEY`. The shortcut preserves +fx's default permissions. fx can update itself inside the sandbox, so its version +may change between sessions. Its reconnect command uses `fx -c` to continue the +conversation. If you supplied `--env`, export the same values locally before +reconnecting; the hint includes names only. + Exiting the agent leaves the sandbox running. Unless you pass `--silent`, the CLI prints reconnect and stop commands. Follow any environment-variable reminder printed with the reconnect command. diff --git a/plugins/vercel-sandbox/skills-lock.json b/plugins/vercel-sandbox/skills-lock.json index fb2e9ddc..cc259fcb 100644 --- a/plugins/vercel-sandbox/skills-lock.json +++ b/plugins/vercel-sandbox/skills-lock.json @@ -5,7 +5,7 @@ "source": "vercel/sandbox", "sourceType": "github", "skillPath": "skills/sandbox/SKILL.md", - "computedHash": "0c05d745689e8d58ebc17c1303cdda23fe9f6a9f59dc615b496db16551f27590" + "computedHash": "5956109a7ad9d8e0ce29f478c49e609d4e9284b429355c6f0c54a0ff4eddbea4" } } } diff --git a/plugins/vinext/.agents/skills/migrate-to-vinext/references/compatibility.md b/plugins/vinext/.agents/skills/migrate-to-vinext/references/compatibility.md index 7a14d128..3d876d1b 100644 --- a/plugins/vinext/.agents/skills/migrate-to-vinext/references/compatibility.md +++ b/plugins/vinext/.agents/skills/migrate-to-vinext/references/compatibility.md @@ -112,4 +112,4 @@ These features are intentionally excluded: - `next/jest` (use Vitest) - `create-next-app` scaffolding - Bug-for-bug parity with undocumented Next.js behavior -- Native Node modules in Workers (sharp, resvg, satori — auto-stubbed in production) +- Native Node modules in Workers (sharp, @resvg/resvg-js, @napi-rs/canvas — Workers cannot load Node-API addons) diff --git a/plugins/vinext/.agents/skills/migrate-to-vinext/references/troubleshooting.md b/plugins/vinext/.agents/skills/migrate-to-vinext/references/troubleshooting.md index 21ae4bb7..944188e0 100644 --- a/plugins/vinext/.agents/skills/migrate-to-vinext/references/troubleshooting.md +++ b/plugins/vinext/.agents/skills/migrate-to-vinext/references/troubleshooting.md @@ -2,15 +2,16 @@ ## Common Migration Errors -| Error | Cause | Fix | -| --------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | -| `ERR_REQUIRE_ESM` or `require() of ES Module` | Project missing `"type": "module"` | Add `"type": "module"` to package.json | -| `module.exports` syntax error in config file | CJS config loaded as ESM | Rename `.js` config to `.cjs` (e.g., `postcss.config.js` → `postcss.config.cjs`) | -| `Cannot find module '@vitejs/plugin-rsc'` | App Router project missing RSC plugin | `npm install -D @vitejs/plugin-rsc` | -| `Cannot find module 'vite'` | Vite not installed | `npm install -D vite` | -| `vinext: command not found` | vinext not installed or not in PATH | Install vinext: `npm install vinext`, then run via `npx vinext` or package.json scripts | -| RSC environment crash on dev start | Native Node module (sharp, satori) loaded in RSC env | vinext auto-stubs these in production; in dev, ensure these are only imported in server code behind dynamic `import()` | -| `ASSETS binding not found` | wrangler.jsonc missing assets config | Add `"assets": { "not_found_handling": "none" }` to wrangler.jsonc | +| Error | Cause | Fix | +| --------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ERR_REQUIRE_ESM` or `require() of ES Module` | Project missing `"type": "module"` | Add `"type": "module"` to package.json | +| `module.exports` syntax error in config file | CJS config loaded as ESM | Rename `.js` config to `.cjs` (e.g., `postcss.config.js` → `postcss.config.cjs`) | +| `Cannot find module '@vitejs/plugin-rsc'` | App Router project missing RSC plugin | `npm install -D @vitejs/plugin-rsc` | +| `Cannot find module 'vite'` | Vite not installed | `npm install -D vite` | +| `vinext: command not found` | vinext not installed or not in PATH | Install vinext: `npm install vinext`, then run via `npx vinext` or package.json scripts | +| RSC environment crash on dev start | Native Node module (sharp, @resvg/resvg-js) loaded in Worker code | Workers cannot load Node-API addons: use a Workers alternative (Cloudflare Images, `@resvg/resvg-wasm`), or `resolve.alias` the module to your own file if a dependency imports it on a path that never runs on Workers | +| `Could not load empty-stub.js` | `resolve.alias` entries written by an older `vinext init` | Delete the `empty-stub.js` aliases from `vite.config`, and its `path` import if nothing else uses it | +| `ASSETS binding not found` | wrangler.jsonc missing assets config | Add `"assets": { "not_found_handling": "none" }` to wrangler.jsonc | ## Vite 8 Migration Notes diff --git a/plugins/vinext/agent/skills/migrate-to-vinext/references/compatibility.md b/plugins/vinext/agent/skills/migrate-to-vinext/references/compatibility.md index 7a14d128..3d876d1b 100644 --- a/plugins/vinext/agent/skills/migrate-to-vinext/references/compatibility.md +++ b/plugins/vinext/agent/skills/migrate-to-vinext/references/compatibility.md @@ -112,4 +112,4 @@ These features are intentionally excluded: - `next/jest` (use Vitest) - `create-next-app` scaffolding - Bug-for-bug parity with undocumented Next.js behavior -- Native Node modules in Workers (sharp, resvg, satori — auto-stubbed in production) +- Native Node modules in Workers (sharp, @resvg/resvg-js, @napi-rs/canvas — Workers cannot load Node-API addons) diff --git a/plugins/vinext/agent/skills/migrate-to-vinext/references/troubleshooting.md b/plugins/vinext/agent/skills/migrate-to-vinext/references/troubleshooting.md index 21ae4bb7..944188e0 100644 --- a/plugins/vinext/agent/skills/migrate-to-vinext/references/troubleshooting.md +++ b/plugins/vinext/agent/skills/migrate-to-vinext/references/troubleshooting.md @@ -2,15 +2,16 @@ ## Common Migration Errors -| Error | Cause | Fix | -| --------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | -| `ERR_REQUIRE_ESM` or `require() of ES Module` | Project missing `"type": "module"` | Add `"type": "module"` to package.json | -| `module.exports` syntax error in config file | CJS config loaded as ESM | Rename `.js` config to `.cjs` (e.g., `postcss.config.js` → `postcss.config.cjs`) | -| `Cannot find module '@vitejs/plugin-rsc'` | App Router project missing RSC plugin | `npm install -D @vitejs/plugin-rsc` | -| `Cannot find module 'vite'` | Vite not installed | `npm install -D vite` | -| `vinext: command not found` | vinext not installed or not in PATH | Install vinext: `npm install vinext`, then run via `npx vinext` or package.json scripts | -| RSC environment crash on dev start | Native Node module (sharp, satori) loaded in RSC env | vinext auto-stubs these in production; in dev, ensure these are only imported in server code behind dynamic `import()` | -| `ASSETS binding not found` | wrangler.jsonc missing assets config | Add `"assets": { "not_found_handling": "none" }` to wrangler.jsonc | +| Error | Cause | Fix | +| --------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ERR_REQUIRE_ESM` or `require() of ES Module` | Project missing `"type": "module"` | Add `"type": "module"` to package.json | +| `module.exports` syntax error in config file | CJS config loaded as ESM | Rename `.js` config to `.cjs` (e.g., `postcss.config.js` → `postcss.config.cjs`) | +| `Cannot find module '@vitejs/plugin-rsc'` | App Router project missing RSC plugin | `npm install -D @vitejs/plugin-rsc` | +| `Cannot find module 'vite'` | Vite not installed | `npm install -D vite` | +| `vinext: command not found` | vinext not installed or not in PATH | Install vinext: `npm install vinext`, then run via `npx vinext` or package.json scripts | +| RSC environment crash on dev start | Native Node module (sharp, @resvg/resvg-js) loaded in Worker code | Workers cannot load Node-API addons: use a Workers alternative (Cloudflare Images, `@resvg/resvg-wasm`), or `resolve.alias` the module to your own file if a dependency imports it on a path that never runs on Workers | +| `Could not load empty-stub.js` | `resolve.alias` entries written by an older `vinext init` | Delete the `empty-stub.js` aliases from `vite.config`, and its `path` import if nothing else uses it | +| `ASSETS binding not found` | wrangler.jsonc missing assets config | Add `"assets": { "not_found_handling": "none" }` to wrangler.jsonc | ## Vite 8 Migration Notes diff --git a/plugins/vinext/skills-lock.json b/plugins/vinext/skills-lock.json index 7ae4e9cf..b9096c1a 100644 --- a/plugins/vinext/skills-lock.json +++ b/plugins/vinext/skills-lock.json @@ -5,7 +5,7 @@ "source": "cloudflare/vinext", "sourceType": "github", "skillPath": ".agents/skills/migrate-to-vinext/SKILL.md", - "computedHash": "a0356b9e9d04ad991f44132643d8d4d32b4bb9da0647e23acadc82f450c1c85b" + "computedHash": "668507ff73946e38fe94498d486a93d80c065b973018badd3e631bfccee13897" } } } diff --git a/plugins/workflow-sdk/skills-lock.json b/plugins/workflow-sdk/skills-lock.json index f85e7bb5..2861b2c1 100644 --- a/plugins/workflow-sdk/skills-lock.json +++ b/plugins/workflow-sdk/skills-lock.json @@ -11,7 +11,7 @@ "source": "vercel/workflow", "sourceType": "github", "skillPath": "skills/workflow/SKILL.md", - "computedHash": "f74fc7d0b9584f03fdfc138a977d5eb632ca4f1310a8e590ef80cf5e67ccee20" + "computedHash": "4cd5ce92d66f4ec1e57630a225a83604a5704c36c1a9bf94c49d667ade05b984" }, "workflow-init": { "source": "vercel/workflow",