diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 5b025e4..52759b6 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -65,10 +65,10 @@ jobs: node <<'EOF' >> "$GITHUB_OUTPUT" const { execSync } = require('child_process'); const packages = [ - { name: '@frostbase/auth', dir: 'agents/auth', prefix: 'auth-v' }, - { name: '@frostbase/db', dir: 'agents/db', prefix: 'db-v' }, - { name: '@frostbase/storage', dir: 'agents/storage', prefix: 'storage-v' }, - { name: '@frostbase/cli', dir: 'cli', prefix: 'cli-v' }, + { name: '@frostbase-dev/auth', dir: 'agents/auth', prefix: 'auth-v' }, + { name: '@frostbase-dev/db', dir: 'agents/db', prefix: 'db-v' }, + { name: '@frostbase-dev/storage', dir: 'agents/storage', prefix: 'storage-v' }, + { name: '@frostbase-dev/cli', dir: 'cli', prefix: 'cli-v' }, ]; const refType = process.env.GITHUB_REF_TYPE; const refName = process.env.GITHUB_REF_NAME; diff --git a/AGENTS.md b/AGENTS.md index e888803..4fe7f1d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -18,7 +18,7 @@ types. | `agents/auth` | `auth-agent` | `AuthAgent` | | `agents/db` | `db-agent` | `DbAgent` `DbCollection` `DbTable` `DbGateway` `DbView` | | `agents/storage` | `storage-agent` | `StorageAgent` `StorageBucket` | -| `cli` | none | `@frostbase/cli`, runs on a consumer's machine | +| `cli` | none | `@frostbase-dev/cli`, runs on a consumer's machine | **Never import runtime code or generated Worker types across those boundaries.** Shared DTOs are deliberately copied — `src/lib/agents.ts` mirrors diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d9f76ef..744f30e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -52,12 +52,12 @@ cd agents/db && npx tsc --noEmit && npm run test:unit Separate npm projects with separate Wrangler configs and separate generated `Env` types: -| Path | Worker | What it is | -| ------------- | ------------ | ---------------------------------------------- | -| `/` | web | SvelteKit dashboard and marketing site | -| `agents/auth` | `auth-agent` | `AuthAgent` DO - Better Auth per project | -| `agents/db` | `db-agent` | `DbAgent` + `DbCollection` DOs - documents | -| `cli` | none | `@frostbase/cli`, runs on a consumer's machine | +| Path | Worker | What it is | +| ------------- | ------------ | -------------------------------------------------- | +| `/` | web | SvelteKit dashboard and marketing site | +| `agents/auth` | `auth-agent` | `AuthAgent` DO - Better Auth per project | +| `agents/db` | `db-agent` | `DbAgent` + `DbCollection` DOs - documents | +| `cli` | none | `@frostbase-dev/cli`, runs on a consumer's machine | **Never import runtime code or generated Worker types across those boundaries.** Shared DTOs are deliberately copied - `src/lib/agents.ts` diff --git a/README.md b/README.md index f06295e..23832cb 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ allowlist, and an unlisted origin gets a 403. For a server credential, from the CLI: ```bash -npm install -g @frostbase/cli +npm install -g @frostbase-dev/cli frostbase login frostbase init # links this directory to a project frostbase key create server --env-file # writes a service key to .env.local @@ -178,7 +178,7 @@ if (!config.get('signupsOpen')) { Buckets of files with per-bucket access modes: ```ts -import { createStorageClient } from '@frostbase/storage/client'; +import { createStorageClient } from '@frostbase-dev/storage/client'; const storage = createStorageClient({ baseUrl: 'https://frostbase.dev/agents/storage-agent/', @@ -200,9 +200,9 @@ With no user to relay — a cron, queue consumer, or webhook — mint a page). Each agent ships an `./admin` client over it: ```ts -import { createDbAdmin } from '@frostbase/db/admin'; -import { createAuthAdmin } from '@frostbase/auth/admin'; -import { createStorageAdmin } from '@frostbase/storage/admin'; +import { createDbAdmin } from '@frostbase-dev/db/admin'; +import { createAuthAdmin } from '@frostbase-dev/auth/admin'; +import { createStorageAdmin } from '@frostbase-dev/storage/admin'; const db = createDbAdmin(); // url, project, and key from the environment const post = await db.collection('posts').get(id); diff --git a/agents/auth/AGENTS.md b/agents/auth/AGENTS.md index 4a3089b..e9c4418 100644 --- a/agents/auth/AGENTS.md +++ b/agents/auth/AGENTS.md @@ -1,4 +1,4 @@ -# @frostbase/auth +# @frostbase-dev/auth Better Auth on a Durable Object. One `AuthAgent` per project, addressed by project id, each with its own embedded SQLite and its own signing keypair. diff --git a/agents/auth/README.md b/agents/auth/README.md index ac05ccb..ebefead 100644 --- a/agents/auth/README.md +++ b/agents/auth/README.md @@ -1,4 +1,4 @@ -# @frostbase/auth +# @frostbase-dev/auth Better Auth on a Cloudflare Durable Object. One isolated instance per project, each with its own embedded SQLite database, in your account. This is the auth @@ -14,7 +14,7 @@ dashboards; and opt-in auth events into Workers Analytics Engine. The easy way is the CLI, which does all of the wiring below: ```bash -npx @frostbase/cli add auth +npx @frostbase-dev/cli add auth ``` By hand: install the package, re-export the agent from your Worker entrypoint @@ -24,11 +24,11 @@ your `wrangler.jsonc`, and regenerate types. ```ts // src/index.ts -export { AuthAgent, default } from '@frostbase/auth'; +export { AuthAgent, default } from '@frostbase-dev/auth'; ``` ```bash -npm install @frostbase/auth +npm install @frostbase-dev/auth npx wrangler types npx wrangler deploy ``` @@ -43,7 +43,7 @@ catch a missing binding at compile time instead of on the first request, add one line anywhere in your Worker: ```ts -import type { AssertAuthAgentEnv } from '@frostbase/auth'; +import type { AssertAuthAgentEnv } from '@frostbase-dev/auth'; export type _AuthAgentBindings = AssertAuthAgentEnv; ``` diff --git a/agents/auth/frostbase.agent.json b/agents/auth/frostbase.agent.json index e15df66..13623da 100644 --- a/agents/auth/frostbase.agent.json +++ b/agents/auth/frostbase.agent.json @@ -3,7 +3,7 @@ "name": "auth", "title": "Authentication", "description": "Users, sessions, and RBAC on Durable Object SQLite.", - "packageName": "@frostbase/auth", + "packageName": "@frostbase-dev/auth", "worker": "auth-agent", "durableObjects": [{ "class": "AuthAgent", "scope": "perProject" }], "entrypoint": { "assertEnvType": "AssertAuthAgentEnv" }, diff --git a/agents/auth/package-lock.json b/agents/auth/package-lock.json index 7a53ecc..d3a479a 100644 --- a/agents/auth/package-lock.json +++ b/agents/auth/package-lock.json @@ -1,11 +1,11 @@ { - "name": "@frostbase/auth", + "name": "@frostbase-dev/auth", "version": "0.7.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@frostbase/auth", + "name": "@frostbase-dev/auth", "version": "0.7.1", "license": "Apache-2.0", "dependencies": { diff --git a/agents/auth/package.json b/agents/auth/package.json index 0e98778..cfbb8a8 100644 --- a/agents/auth/package.json +++ b/agents/auth/package.json @@ -1,5 +1,5 @@ { - "name": "@frostbase/auth", + "name": "@frostbase-dev/auth", "version": "0.7.4", "description": "Better Auth on a Cloudflare Durable Object, one instance per project - the auth primitive behind Frostbase.", "license": "Apache-2.0", diff --git a/agents/auth/src/admin.ts b/agents/auth/src/admin.ts index 5f0537d..4ae36ad 100644 --- a/agents/auth/src/admin.ts +++ b/agents/auth/src/admin.ts @@ -1,8 +1,8 @@ /** - * The ADMIN client for `@frostbase/auth` - user and session management + * The ADMIN client for `@frostbase-dev/auth` - user and session management * from a server. * - * The twin of `@frostbase/db/admin`, and the same three properties hold: + * The twin of `@frostbase-dev/db/admin`, and the same three properties hold: * it targets the CONSOLE (a `cfbs_` service key is verified in the console * guard and never reaches this agent as a bearer), it is admin-grade, and it * is server-only. @@ -51,7 +51,7 @@ export class AuthAdminError extends Error { export class AuthAgentTooOldError extends Error { constructor(path: string) { super( - `the auth agent did not recognise ${path}. Deploy @frostbase/auth 0.7.0 or newer ` + + `the auth agent did not recognise ${path}. Deploy @frostbase-dev/auth 0.7.0 or newer ` + `before calling this - an older agent answers a 404 that looks like a missing user.`, ); this.name = 'AuthAgentTooOldError'; @@ -74,7 +74,7 @@ function assertServerOnly(): void { // which declare no DOM, and a Worker has no document either. if (typeof (globalThis as { document?: unknown }).document !== 'undefined') { throw new Error( - '@frostbase/auth/admin is server-only: it carries a service key, which can read and ' + + '@frostbase-dev/auth/admin is server-only: it carries a service key, which can read and ' + 'delete every account in your project. Never import it into browser code. Use ' + 'better-auth/client with the signed-in user’s own session instead.', ); @@ -98,7 +98,7 @@ function resolve( if (value) return value; } throw new Error( - `@frostbase/auth/admin needs ${label}: pass it explicitly, or set ${names.join(' or ')}. ` + + `@frostbase-dev/auth/admin needs ${label}: pass it explicitly, or set ${names.join(' or ')}. ` + `Inside a Worker, secrets live on \`env\` rather than a global process - pass \`{ env }\`.`, ); } diff --git a/agents/auth/src/bindings.ts b/agents/auth/src/bindings.ts index 8857e74..7f6bc81 100644 --- a/agents/auth/src/bindings.ts +++ b/agents/auth/src/bindings.ts @@ -1,5 +1,5 @@ /** - * The binding contract for consumers of `@frostbase/auth`. + * The binding contract for consumers of `@frostbase-dev/auth`. * * The Agents SDK constrains `Agent` against `Cloudflare.Env`, which * is an empty declaration-merge target that `wrangler types` fills in from your @@ -144,7 +144,7 @@ export interface AuthAgentBindings { * on first request. Use it once, anywhere in your Worker: * * ```ts - * import type { AssertAuthAgentEnv } from '@frostbase/auth'; + * import type { AssertAuthAgentEnv } from '@frostbase-dev/auth'; * type _AuthBindings = AssertAuthAgentEnv; * ``` */ diff --git a/agents/auth/template/worker-entry.ts b/agents/auth/template/worker-entry.ts index efb020d..c8e3b15 100644 --- a/agents/auth/template/worker-entry.ts +++ b/agents/auth/template/worker-entry.ts @@ -1,5 +1,5 @@ /** - * Worker entrypoint for a Worker that hosts `@frostbase/auth`. + * Worker entrypoint for a Worker that hosts `@frostbase-dev/auth`. * * Copy this to the file your `wrangler.jsonc` names as `main`. * @@ -8,7 +8,7 @@ * the binding resolves. The default export is the fetch handler that routes * `/agents/auth-agent//...` to the right instance. */ -export { AuthAgent, default } from '@frostbase/auth'; +export { AuthAgent, default } from '@frostbase-dev/auth'; /** * Compile-time check that your generated `Env` carries the bindings the agent @@ -17,5 +17,5 @@ export { AuthAgent, default } from '@frostbase/auth'; * * Run `npx wrangler types` after editing `wrangler.jsonc` to regenerate `Env`. */ -import type { AssertAuthAgentEnv } from '@frostbase/auth'; +import type { AssertAuthAgentEnv } from '@frostbase-dev/auth'; export type _AuthAgentBindings = AssertAuthAgentEnv; diff --git a/agents/auth/template/wrangler-fragment.jsonc b/agents/auth/template/wrangler-fragment.jsonc index f9e1ecb..53ce583 100644 --- a/agents/auth/template/wrangler-fragment.jsonc +++ b/agents/auth/template/wrangler-fragment.jsonc @@ -1,5 +1,5 @@ /** - * Wrangler configuration for a Worker that hosts `@frostbase/auth`. + * Wrangler configuration for a Worker that hosts `@frostbase-dev/auth`. * * Merge this into your own `wrangler.jsonc`, then run `npx wrangler types` so * the generated `Env` carries these bindings. The agent reads `Env` from your diff --git a/agents/auth/tsconfig.build.json b/agents/auth/tsconfig.build.json index 6ca240a..2eaee56 100644 --- a/agents/auth/tsconfig.build.json +++ b/agents/auth/tsconfig.build.json @@ -1,5 +1,5 @@ /** - * Publish build for `@frostbase/auth`. + * Publish build for `@frostbase-dev/auth`. * * Emits `dist/` from `src/` only. Two things are deliberately left out of the * published package: diff --git a/agents/auth/tsconfig.json b/agents/auth/tsconfig.json index 67b6c56..b0b9c1c 100644 --- a/agents/auth/tsconfig.json +++ b/agents/auth/tsconfig.json @@ -43,7 +43,7 @@ * `dist` is this project's own build output - with allowJs on it would be * typechecked alongside the sources it was emitted from. `template` holds * files meant to be copied into a consumer's project, so they import - * `@frostbase/auth` by package name, which does not resolve from + * `@frostbase-dev/auth` by package name, which does not resolve from * inside the package itself. */ "exclude": ["dist", "template", "node_modules"] diff --git a/agents/db/AGENTS.md b/agents/db/AGENTS.md index 0a96738..7f7ead4 100644 --- a/agents/db/AGENTS.md +++ b/agents/db/AGENTS.md @@ -1,4 +1,4 @@ -# @frostbase/db +# @frostbase-dev/db Documents with live queries and schema-first SQL tables, one Durable Object per collection or table. The largest agent in the repo and the one with the most diff --git a/agents/db/README.md b/agents/db/README.md index b6f1fb1..1d31aea 100644 --- a/agents/db/README.md +++ b/agents/db/README.md @@ -1,11 +1,11 @@ -# @frostbase/db +# @frostbase-dev/db Firestore-style JSON documents with live queries, running on Cloudflare Durable Objects - one isolated instance per collection. The database primitive behind [Frostbase](https://github.com/frostbase-dev/frostbase). ```bash -npx @frostbase/cli add db +npx @frostbase-dev/cli add db ``` The CLI installs this package, merges `template/wrangler-fragment.jsonc` into @@ -23,7 +23,7 @@ steps; both templates ship in the package. `added` / `modified` / `removed` deltas as writes happen. Subscriptions survive hibernation; you pay nothing while idle. - **Access modes per collection** - `public`, `auth`, or `owner`, verified - against `@frostbase/auth` project JWTs. `owner` scopes every read and + against `@frostbase-dev/auth` project JWTs. `owner` scopes every read and write to the token's subject. Optional permission keys additionally require that claim on the JWT (granted via auth roles; the admin role's `*` always passes). @@ -37,12 +37,12 @@ steps; both templates ship in the package. SDK), operator NDJSON import that round-trips exports exactly, and point-in-time restore of a single collection to any moment in the past 30 days (deployed stacks; local development has no durable change log). -- **A typed client** - `@frostbase/db/client` wraps REST, aggregates, +- **A typed client** - `@frostbase-dev/db/client` wraps REST, aggregates, export, and the subscribe protocol with the same zod schemas the server validates with. ```ts -import { createDbClient } from '@frostbase/db/client'; +import { createDbClient } from '@frostbase-dev/db/client'; const db = createDbClient({ baseUrl: 'https://your-worker.workers.dev/agents/db-agent/my-app', @@ -65,7 +65,7 @@ const unsubscribe = posts.subscribe( Required: the `DbAgent` and `DbCollection` Durable Object bindings and the `DB_EVENTS` Analytics Engine dataset (auto-creates on first write). Optional: an `AUTH_AGENT` service binding for multi-worker deployments - in the normal -single-worker install, having `@frostbase/auth` in the same Worker is +single-worker install, having `@frostbase-dev/auth` in the same Worker is enough for token verification. No secret is required for a working deploy. ## What your Worker serves diff --git a/agents/db/frostbase.agent.json b/agents/db/frostbase.agent.json index 5ff07c9..7c08876 100644 --- a/agents/db/frostbase.agent.json +++ b/agents/db/frostbase.agent.json @@ -3,7 +3,7 @@ "name": "db", "title": "Database", "description": "Documents with live queries and SQL tables with typed columns - one Durable Object per collection or table.", - "packageName": "@frostbase/db", + "packageName": "@frostbase-dev/db", "worker": "db-agent", "durableObjects": [ { "class": "DbAgent", "scope": "perProject" }, diff --git a/agents/db/package-lock.json b/agents/db/package-lock.json index 5dcf491..847e6f9 100644 --- a/agents/db/package-lock.json +++ b/agents/db/package-lock.json @@ -1,11 +1,11 @@ { - "name": "@frostbase/db", + "name": "@frostbase-dev/db", "version": "0.6.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@frostbase/db", + "name": "@frostbase-dev/db", "version": "0.6.1", "license": "Apache-2.0", "dependencies": { diff --git a/agents/db/package.json b/agents/db/package.json index 8e963f1..4d79595 100644 --- a/agents/db/package.json +++ b/agents/db/package.json @@ -1,5 +1,5 @@ { - "name": "@frostbase/db", + "name": "@frostbase-dev/db", "version": "0.7.0", "description": "Documents with live queries and schema-first SQL tables on Cloudflare Durable Objects, one isolated instance per collection or table - the database primitive behind Frostbase.", "license": "Apache-2.0", diff --git a/agents/db/src/admin.ts b/agents/db/src/admin.ts index 52a2bd9..5c2ec7b 100644 --- a/agents/db/src/admin.ts +++ b/agents/db/src/admin.ts @@ -68,7 +68,7 @@ function resolve( if (value) return value; } throw new Error( - `@frostbase/db/admin needs ${label}: pass it explicitly, or set ${names.join(' or ')}. ` + + `@frostbase-dev/db/admin needs ${label}: pass it explicitly, or set ${names.join(' or ')}. ` + `Inside a Worker, secrets live on \`env\` rather than a global process - pass \`{ env }\`.`, ); } @@ -96,7 +96,7 @@ export class DbAdminError extends Error { export class DbAgentTooOldError extends Error { constructor(path: string) { super( - `the db agent did not recognise ${path}. Deploy @frostbase/db 0.6.0 or newer ` + + `the db agent did not recognise ${path}. Deploy @frostbase-dev/db 0.6.0 or newer ` + `before calling this - an older agent answers a 404 that looks like a missing record.`, ); this.name = 'DbAgentTooOldError'; @@ -119,8 +119,8 @@ function assertServerOnly(): void { // test anyway, since a Worker has neither. if (typeof (globalThis as { document?: unknown }).document !== 'undefined') { throw new Error( - '@frostbase/db/admin is server-only: it carries a service key, which is admin-grade ' + - 'over your whole project. Never import it into browser code. Use @frostbase/db/client ' + + '@frostbase-dev/db/admin is server-only: it carries a service key, which is admin-grade ' + + 'over your whole project. Never import it into browser code. Use @frostbase-dev/db/client ' + 'with the signed-in user’s project JWT instead.', ); } diff --git a/agents/db/src/drizzle.ts b/agents/db/src/drizzle.ts index bb6a6a0..a08ce8b 100644 --- a/agents/db/src/drizzle.ts +++ b/agents/db/src/drizzle.ts @@ -12,7 +12,7 @@ import type { TableSqlResponse, TableSqlResult } from './schemas'; * SQL), so `getToken` is effectively mandatory outside operator tooling. * * ```ts - * import { drizzleTable } from '@frostbase/db/drizzle'; + * import { drizzleTable } from '@frostbase-dev/db/drizzle'; * import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core'; * * const todos = sqliteTable('todos', { diff --git a/agents/db/template/worker-entry.ts b/agents/db/template/worker-entry.ts index 66488e8..487ec27 100644 --- a/agents/db/template/worker-entry.ts +++ b/agents/db/template/worker-entry.ts @@ -1,5 +1,5 @@ /** - * Worker entrypoint for a Worker that hosts `@frostbase/db`. + * Worker entrypoint for a Worker that hosts `@frostbase-dev/db`. * * Copy this to the file your `wrangler.jsonc` names as `main`. * @@ -8,13 +8,13 @@ * how the bindings resolve. The default export is the fetch handler that * routes `/agents/db-agent//...` to the right instances. * - * Already have a default export (for example from `@frostbase/auth`)? + * Already have a default export (for example from `@frostbase-dev/auth`)? * Re-export only the classes - the existing agent handler routes to any * Durable Object binding by name: * - * export { DbAgent, DbCollection } from '@frostbase/db'; + * export { DbAgent, DbCollection } from '@frostbase-dev/db'; */ -export { DbAgent, DbCollection, default } from '@frostbase/db'; +export { DbAgent, DbCollection, default } from '@frostbase-dev/db'; /** * Compile-time check that your generated `Env` carries the bindings the agent @@ -23,5 +23,5 @@ export { DbAgent, DbCollection, default } from '@frostbase/db'; * * Run `npx wrangler types` after editing `wrangler.jsonc` to regenerate `Env`. */ -import type { AssertDbAgentEnv } from '@frostbase/db'; +import type { AssertDbAgentEnv } from '@frostbase-dev/db'; export type _DbAgentBindings = AssertDbAgentEnv; diff --git a/agents/db/template/wrangler-fragment.jsonc b/agents/db/template/wrangler-fragment.jsonc index 9ab0f11..14ba421 100644 --- a/agents/db/template/wrangler-fragment.jsonc +++ b/agents/db/template/wrangler-fragment.jsonc @@ -1,5 +1,5 @@ /** - * Wrangler configuration for a Worker that hosts `@frostbase/db`. + * Wrangler configuration for a Worker that hosts `@frostbase-dev/db`. * * Merge this into your own `wrangler.jsonc`, then run `npx wrangler types` so * the generated `Env` carries these bindings. The agent reads `Env` from your @@ -71,7 +71,7 @@ ], /** - * NOT included: an AUTH_AGENT service binding. If `@frostbase/auth` + * NOT included: an AUTH_AGENT service binding. If `@frostbase-dev/auth` * lives in this same Worker (the normal `frostbase add auth` setup), * the db agent finds its AuthAgent Durable Object binding automatically * and token-verified collections just work. A service binding is only for diff --git a/agents/db/tsconfig.build.json b/agents/db/tsconfig.build.json index 37122d9..412c281 100644 --- a/agents/db/tsconfig.build.json +++ b/agents/db/tsconfig.build.json @@ -1,5 +1,5 @@ /** - * Publish build for `@frostbase/db`. + * Publish build for `@frostbase-dev/db`. * * Emits `dist/` from `src/` only. Deliberately left out of the published * package: diff --git a/agents/db/tsconfig.json b/agents/db/tsconfig.json index 67b6c56..b0b9c1c 100644 --- a/agents/db/tsconfig.json +++ b/agents/db/tsconfig.json @@ -43,7 +43,7 @@ * `dist` is this project's own build output - with allowJs on it would be * typechecked alongside the sources it was emitted from. `template` holds * files meant to be copied into a consumer's project, so they import - * `@frostbase/auth` by package name, which does not resolve from + * `@frostbase-dev/auth` by package name, which does not resolve from * inside the package itself. */ "exclude": ["dist", "template", "node_modules"] diff --git a/agents/storage/AGENTS.md b/agents/storage/AGENTS.md index ca79580..8b5b51c 100644 --- a/agents/storage/AGENTS.md +++ b/agents/storage/AGENTS.md @@ -1,4 +1,4 @@ -# @frostbase/storage +# @frostbase-dev/storage Buckets of files on R2. The bytes live in R2, the *index* lives in Durable Objects, and the data plane is the **worker** — bytes never enter a DO. diff --git a/agents/storage/README.md b/agents/storage/README.md index bd73ac6..b31adc6 100644 --- a/agents/storage/README.md +++ b/agents/storage/README.md @@ -1,4 +1,4 @@ -# @frostbase/storage +# @frostbase-dev/storage Object storage on Cloudflare R2 - buckets of files with per-bucket access modes, served through your worker with a sorted, pageable index. The storage @@ -14,7 +14,7 @@ serves downloads with `Range`, conditional requests, and edge caching. ## Install ```sh -npx @frostbase/cli add storage +npx @frostbase-dev/cli add storage ``` The CLI installs this package, merges `template/wrangler-fragment.jsonc` into diff --git a/agents/storage/frostbase.agent.json b/agents/storage/frostbase.agent.json index def34a9..261508e 100644 --- a/agents/storage/frostbase.agent.json +++ b/agents/storage/frostbase.agent.json @@ -3,7 +3,7 @@ "name": "storage", "title": "Storage", "description": "Object storage on R2 - buckets of files with per-bucket access modes, served through the worker with a sorted, pageable index.", - "packageName": "@frostbase/storage", + "packageName": "@frostbase-dev/storage", "worker": "storage-agent", "durableObjects": [ { diff --git a/agents/storage/package-lock.json b/agents/storage/package-lock.json index 8801416..6ba2f99 100644 --- a/agents/storage/package-lock.json +++ b/agents/storage/package-lock.json @@ -1,11 +1,11 @@ { - "name": "@frostbase/storage", + "name": "@frostbase-dev/storage", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@frostbase/storage", + "name": "@frostbase-dev/storage", "version": "0.1.0", "license": "Apache-2.0", "dependencies": { diff --git a/agents/storage/package.json b/agents/storage/package.json index c7f0b24..fb78049 100644 --- a/agents/storage/package.json +++ b/agents/storage/package.json @@ -1,5 +1,5 @@ { - "name": "@frostbase/storage", + "name": "@frostbase-dev/storage", "version": "0.4.0", "description": "Object storage on Cloudflare R2 - buckets of files with per-bucket access modes, an object index with keyset paging, one Durable Object orchestrator per project - the storage primitive behind Frostbase.", "license": "Apache-2.0", diff --git a/agents/storage/src/admin.ts b/agents/storage/src/admin.ts index 457ec11..73cc387 100644 --- a/agents/storage/src/admin.ts +++ b/agents/storage/src/admin.ts @@ -1,5 +1,5 @@ /** - * The ADMIN client for `@frostbase/storage` - buckets and object bytes + * The ADMIN client for `@frostbase-dev/storage` - buckets and object bytes * from a server. * * The twin of the db and auth admin clients: it targets the CONSOLE (a `cfbs_` @@ -46,7 +46,7 @@ export class StorageAdminError extends Error { export class StorageAgentTooOldError extends Error { constructor(path: string) { super( - `the console did not recognise ${path}. Deploy a console (and @frostbase/storage) that ` + + `the console did not recognise ${path}. Deploy a console (and @frostbase-dev/storage) that ` + `ships the storage object proxy before calling this - an older deployment answers a 404 ` + `that looks like a missing object.`, ); @@ -70,7 +70,7 @@ export interface StorageObjectSummary { function assertServerOnly(): void { if (typeof (globalThis as { document?: unknown }).document !== 'undefined') { throw new Error( - '@frostbase/storage/admin is server-only: it carries a service key, which can read, ' + + '@frostbase-dev/storage/admin is server-only: it carries a service key, which can read, ' + 'overwrite, and delete every object in your project regardless of bucket access modes. ' + 'Never import it into browser code - upload from the browser with the signed-in user’s ' + 'project JWT against the public object path instead.', @@ -92,7 +92,7 @@ function resolve( if (value) return value; } throw new Error( - `@frostbase/storage/admin needs ${label}: pass it explicitly, or set ${names.join(' or ')}. ` + + `@frostbase-dev/storage/admin needs ${label}: pass it explicitly, or set ${names.join(' or ')}. ` + `Inside a Worker, secrets live on \`env\` rather than a global process - pass \`{ env }\`.`, ); } diff --git a/agents/storage/src/bindings.ts b/agents/storage/src/bindings.ts index f25a9c1..c5d4b78 100644 --- a/agents/storage/src/bindings.ts +++ b/agents/storage/src/bindings.ts @@ -1,5 +1,5 @@ /** - * The binding contract for a Worker hosting `@frostbase/storage`. + * The binding contract for a Worker hosting `@frostbase-dev/storage`. * * `AssertStorageAgentEnv` is an identity type whose CONSTRAINT does the * checking: the consumer's entrypoint template instantiates it with their diff --git a/agents/storage/src/client.ts b/agents/storage/src/client.ts index 7992686..bf8952b 100644 --- a/agents/storage/src/client.ts +++ b/agents/storage/src/client.ts @@ -15,7 +15,7 @@ import { SIGNED_URL_MAX_TTL_SECONDS, type SignedMethod } from './signing'; * This is the END-USER client: it speaks the public object paths with a * project JWT, so every call is subject to the bucket's access modes, owner * scoping, and permission keys. The server-side counterpart is - * `@frostbase/storage/admin`, which bypasses modes over a service key and + * `@frostbase-dev/storage/admin`, which bypasses modes over a service key and * REFUSES to construct in a browser. * * Bytes go straight to the agent, never through a JSON proxy: uploads and diff --git a/agents/storage/template/worker-entry.ts b/agents/storage/template/worker-entry.ts index a567356..b551018 100644 --- a/agents/storage/template/worker-entry.ts +++ b/agents/storage/template/worker-entry.ts @@ -6,9 +6,9 @@ * bindings in wrangler.jsonc resolve. If your project already has a default * export, drop the `default` re-export below and keep your own: * - * export { StorageAgent, StorageBucket } from '@frostbase/storage'; + * export { StorageAgent, StorageBucket } from '@frostbase-dev/storage'; */ -export { StorageAgent, StorageBucket, default } from '@frostbase/storage'; +export { StorageAgent, StorageBucket, default } from '@frostbase-dev/storage'; /** * Compile-time binding contract: if wrangler.jsonc is missing a binding the @@ -16,5 +16,5 @@ export { StorageAgent, StorageBucket, default } from '@frostbase/storage'; * field named - before anything deploys. Run `wrangler types` after changing * bindings so `Env` is current. */ -import type { AssertStorageAgentEnv } from '@frostbase/storage'; +import type { AssertStorageAgentEnv } from '@frostbase-dev/storage'; export type _StorageAgentBindings = AssertStorageAgentEnv; diff --git a/agents/storage/tsconfig.build.json b/agents/storage/tsconfig.build.json index 795f3e9..50e37d6 100644 --- a/agents/storage/tsconfig.build.json +++ b/agents/storage/tsconfig.build.json @@ -1,5 +1,5 @@ /** - * Publish build for `@frostbase/storage`. + * Publish build for `@frostbase-dev/storage`. * * Emits `dist/` from `src/` only. Deliberately left out of the published * package: diff --git a/agents/storage/tsconfig.json b/agents/storage/tsconfig.json index 8e72185..590e4b9 100644 --- a/agents/storage/tsconfig.json +++ b/agents/storage/tsconfig.json @@ -21,7 +21,7 @@ * `dist` is this project's own build output - with allowJs on it would be * typechecked alongside the sources it was emitted from. `template` holds * files meant to be copied into a consumer's project, so they import - * `@frostbase/storage` by package name, which does not resolve from + * `@frostbase-dev/storage` by package name, which does not resolve from * inside the package itself. */ "exclude": ["dist", "template", "node_modules"] diff --git a/cli/README.md b/cli/README.md index ef49bea..1def397 100644 --- a/cli/README.md +++ b/cli/README.md @@ -1,10 +1,10 @@ -# @frostbase/cli +# @frostbase-dev/cli Scaffold and deploy a [Frostbase](https://github.com/frostbase-dev/frostbase) backend on your own Cloudflare account. ```bash -npm install -g @frostbase/cli +npm install -g @frostbase-dev/cli frostbase init my-backend cd my-backend @@ -37,7 +37,7 @@ UI; cross-origin requests from unlisted origins get an explicit 403 Available agents today: `auth` and `db`. -To pin a version: `FROSTBASE_DB_SPEC=@frostbase/db@0.1.3 +To pin a version: `FROSTBASE_DB_SPEC=@frostbase-dev/db@0.1.3 frostbase add db` (and `FROSTBASE_AUTH_SPEC` for auth). ## Notes diff --git a/cli/package-lock.json b/cli/package-lock.json index 5ddbd0c..ba605b4 100644 --- a/cli/package-lock.json +++ b/cli/package-lock.json @@ -1,11 +1,11 @@ { - "name": "@frostbase/cli", + "name": "@frostbase-dev/cli", "version": "0.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@frostbase/cli", + "name": "@frostbase-dev/cli", "version": "0.4.0", "license": "Apache-2.0", "dependencies": { diff --git a/cli/package.json b/cli/package.json index ce5a763..15b775c 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,5 +1,5 @@ -{ - "name": "@frostbase/cli", +{ + "name": "@frostbase-dev/cli", "version": "0.7.0", "description": "Scaffold and deploy a Frostbase backend on your own Cloudflare account.", "license": "Apache-2.0", @@ -23,7 +23,7 @@ "access": "public" }, "bin": { - "frostbase": "./dist/index.js" + "frostbase": "dist/index.js" }, "files": [ "dist", diff --git a/cli/src/commands/add.ts b/cli/src/commands/add.ts index 4cef1f2..090570e 100644 --- a/cli/src/commands/add.ts +++ b/cli/src/commands/add.ts @@ -104,7 +104,7 @@ async function findWranglerConfig(projectDir: string): Promise { throw new UserError( 'This project uses wrangler.toml, which this CLI does not edit.', 'Convert it to wrangler.jsonc (same keys, JSONC syntax), or merge node_modules/' + - '@frostbase/auth/template/wrangler-fragment.jsonc into it by hand.' + '@frostbase-dev/auth/template/wrangler-fragment.jsonc into it by hand.' ); } catch (cause) { if (cause instanceof UserError) throw cause; diff --git a/cli/src/commands/schema.ts b/cli/src/commands/schema.ts index 40fe9c9..05ea9ee 100644 --- a/cli/src/commands/schema.ts +++ b/cli/src/commands/schema.ts @@ -169,7 +169,7 @@ async function generate(flags: Flags): Promise { `// Generated by \`frostbase schema generate\` from project ${projectId}`, `// on ${new Date().toISOString()}. DDL stays server-side: change columns with`, '// `frostbase schema apply` (or the dashboard) and re-generate. This file', - '// is for querying through @frostbase/db/drizzle.', + '// is for querying through @frostbase-dev/db/drizzle.', `import { ${[...imports].sort().join(', ')} } from 'drizzle-orm/sqlite-core';` ].join('\n'); diff --git a/cli/src/lib/agents.ts b/cli/src/lib/agents.ts index df56cd8..6282a8e 100644 --- a/cli/src/lib/agents.ts +++ b/cli/src/lib/agents.ts @@ -26,15 +26,15 @@ export interface AgentSpec { */ export const AGENTS: Record = { auth: { - packageName: '@frostbase/auth', + packageName: '@frostbase-dev/auth', description: 'Better Auth on a Durable Object - one isolated instance per project' }, db: { - packageName: '@frostbase/db', + packageName: '@frostbase-dev/db', description: 'Firestore-style documents with live queries - one Durable Object per collection' }, storage: { - packageName: '@frostbase/storage', + packageName: '@frostbase-dev/storage', description: 'Object storage on R2 - buckets of files with per-bucket access modes' } }; diff --git a/cli/src/lib/entrypoint.ts b/cli/src/lib/entrypoint.ts index 48fd4a6..8fdc1de 100644 --- a/cli/src/lib/entrypoint.ts +++ b/cli/src/lib/entrypoint.ts @@ -49,7 +49,7 @@ export async function patchEntrypoint( */ let exportLine = lines.full; if (/export\s+default|export\s*\{[^}]*\bdefault\b/.test(source)) { - if (!source.includes('@frostbase/')) { + if (!source.includes('@frostbase-dev/')) { throw new UserError( `${entrypointPath} already has a default export.`, `Export the agent classes yourself and route to them from your fetch handler:\n` + diff --git a/cli/src/lib/manifest.ts b/cli/src/lib/manifest.ts index a1bde23..78f5175 100644 --- a/cli/src/lib/manifest.ts +++ b/cli/src/lib/manifest.ts @@ -120,7 +120,7 @@ export async function readManifest( if (version !== 1) { throw new UserError( `${packageName} declares agent manifest version ${String(version)}, which this CLI does not understand.`, - 'Upgrade @frostbase/cli and try again.' + 'Upgrade @frostbase-dev/cli and try again.' ); } diff --git a/e2e/admin-sdk.api.spec.ts b/e2e/admin-sdk.api.spec.ts index dc29a9c..50cbc85 100644 --- a/e2e/admin-sdk.api.spec.ts +++ b/e2e/admin-sdk.api.spec.ts @@ -46,7 +46,7 @@ test.describe('admin clients', () => { } }); - test('db: collections and tables through @frostbase/db/admin', async () => { + test('db: collections and tables through @frostbase-dev/db/admin', async () => { const db = createDbAdmin({ url, projectId: SDK_PROJECT, key }); const posts = db.collection<{ title: string; votes: number }>(`posts-${run}`); @@ -90,7 +90,7 @@ test.describe('admin clients', () => { await expect(posts.get('one')).rejects.toThrow(/no such/i); }); - test('auth: user lifecycle through @frostbase/auth/admin', async () => { + test('auth: user lifecycle through @frostbase-dev/auth/admin', async () => { const auth = createAuthAdmin({ url, projectId: SDK_PROJECT, key }); const email = `sdk-${run}@example.com`; @@ -129,7 +129,7 @@ test.describe('admin clients', () => { await expect(auth.getUser(created.id)).rejects.toThrow(/not found/i); }); - test('storage: bucket and object bytes through @frostbase/storage/admin', async () => { + test('storage: bucket and object bytes through @frostbase-dev/storage/admin', async () => { const storage = createStorageAdmin({ url, projectId: SDK_PROJECT, key }); const bucket = storage.bucket('sdk-files'); await bucket.configure({}); diff --git a/e2e/db.ui.spec.ts b/e2e/db.ui.spec.ts index c8b0e9d..61d05b3 100644 --- a/e2e/db.ui.spec.ts +++ b/e2e/db.ui.spec.ts @@ -403,7 +403,7 @@ test.describe('database page (frontend)', () => { const integration = page.getByTestId('db-integration'); await expect(integration).toContainText(`/api/projects/${DB_UI_PROJECT}/db`); await integration.getByRole('tab', { name: 'Client SDK' }).click(); - await expect(integration).toContainText('@frostbase/db/client'); + await expect(integration).toContainText('@frostbase-dev/db/client'); await integration.getByRole('tab', { name: 'Raw WebSocket' }).click(); await expect(integration).toContainText(`/agents/db-agent/${DB_UI_PROJECT}/collections`); }); diff --git a/e2e/remote-config-client.api.spec.ts b/e2e/remote-config-client.api.spec.ts index 371e77f..cfdc0ef 100644 --- a/e2e/remote-config-client.api.spec.ts +++ b/e2e/remote-config-client.api.spec.ts @@ -3,7 +3,7 @@ import { createDbClient } from '../agents/db/src/client'; import { ensureProject } from './helpers'; /** - * The END-USER Remote Config client (`@frostbase/db/client`), driven as an + * The END-USER Remote Config client (`@frostbase-dev/db/client`), driven as an * app would drive it. * * Same rule as the storage-client and admin-sdk specs: exercise the REAL diff --git a/e2e/storage-client.api.spec.ts b/e2e/storage-client.api.spec.ts index 2696fbf..c1decca 100644 --- a/e2e/storage-client.api.spec.ts +++ b/e2e/storage-client.api.spec.ts @@ -3,7 +3,7 @@ import { createStorageClient, StorageError } from '../agents/storage/src/client' import { authPath, ensureProject, storageBucketPath, uniqueEmail } from './helpers'; /** - * The END-USER storage client (`@frostbase/storage/client`). + * The END-USER storage client (`@frostbase-dev/storage/client`). * * Drives the REAL exported client rather than a hand-rolled fetch at the same * URLs - the point is to prove the published surface works, including its URL diff --git a/e2e/storage.ui.spec.ts b/e2e/storage.ui.spec.ts index d4b98bc..8dea2e4 100644 --- a/e2e/storage.ui.spec.ts +++ b/e2e/storage.ui.spec.ts @@ -234,7 +234,7 @@ test.describe('storage console', () => { test('the Integration page shows the client snippet', async ({ page }) => { await page.goto(`/dashboard/${UI_PROJECT}/storage/integration`); const panel = page.getByTestId('storage-integration'); - await expect(panel).toContainText('@frostbase/storage/client'); + await expect(panel).toContainText('@frostbase-dev/storage/client'); await expect(panel).toContainText('createSignedUrl'); // The shared code-sample component, so the snippets get the same tabs, // copy button, and syntax highlighting every other Integration tab has. @@ -242,7 +242,7 @@ test.describe('storage console', () => { // One name for the server credential across all three agents' Integration // tabs - it was 'Server' here and 'Service key' on auth and db. await panel.getByRole('tab', { name: 'Admin service key' }).click(); - await expect(panel).toContainText('@frostbase/storage/admin'); + await expect(panel).toContainText('@frostbase-dev/storage/admin'); // And the page shape matches auth and db: base URL, samples, caveat. await expect(panel).toContainText('Storage base URL'); }); diff --git a/src/lib/integration-examples.ts b/src/lib/integration-examples.ts index f14e829..4ee0fbc 100644 --- a/src/lib/integration-examples.ts +++ b/src/lib/integration-examples.ts @@ -132,7 +132,7 @@ curl ${url}/get-session \\ id: 'service-key', label: 'Admin service key', lang: 'typescript', - code: `import { createAuthAdmin } from '@frostbase/auth/admin'; + code: `import { createAuthAdmin } from '@frostbase-dev/auth/admin'; // SERVER ONLY. An admin service key can read, create, re-role, and delete // every account in this project. Mint one under Settings - it is shown once @@ -205,7 +205,7 @@ const { docs } = await (await fetch('${url}/collections/posts/query', { id: 'db-sdk', label: 'Client SDK', lang: 'typescript', - code: `import { createDbClient } from '@frostbase/db/client'; + code: `import { createDbClient } from '@frostbase-dev/db/client'; const db = createDbClient({ baseUrl: '${url}', @@ -227,7 +227,7 @@ const unsubscribe = posts.subscribe( id: 'db-tables', label: 'SQL tables', lang: 'typescript', - code: `import { createDbClient } from '@frostbase/db/client'; + code: `import { createDbClient } from '@frostbase-dev/db/client'; const db = createDbClient({ baseUrl: '${url}', getToken }); @@ -245,7 +245,7 @@ todos.subscribe( id: 'db-drizzle', label: 'Drizzle', lang: 'typescript', - code: `import { drizzleTable } from '@frostbase/db/drizzle'; + code: `import { drizzleTable } from '@frostbase-dev/db/drizzle'; import { desc } from 'drizzle-orm'; import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core'; @@ -292,7 +292,7 @@ export function buildRemoteConfigIntegrationExamples(url: string): CodeExample[] id: 'config-sdk', label: 'Client SDK', lang: 'typescript', - code: `import { createDbClient } from '@frostbase/db/client'; + code: `import { createDbClient } from '@frostbase-dev/db/client'; // getToken is optional - a signed-in user's project JWT is what enables // role and permission targeting. Anonymous callers just omit it. @@ -376,7 +376,7 @@ export function buildStorageIntegrationExamples( id: 'storage-sdk', label: 'Client SDK', lang: 'typescript', - code: `import { createStorageClient } from '@frostbase/storage/client'; + code: `import { createStorageClient } from '@frostbase-dev/storage/client'; const storage = createStorageClient({ baseUrl: '${agentBase}',${ @@ -462,7 +462,7 @@ const blob = await response.blob();` id: 'storage-server', label: 'Admin service key', lang: 'typescript', - code: `import { createStorageAdmin } from '@frostbase/storage/admin'; + code: `import { createStorageAdmin } from '@frostbase-dev/storage/admin'; // SERVER ONLY. An admin service key is admin-grade over this project's // storage: it bypasses bucket access modes, exactly like the operator session diff --git a/src/lib/openapi/db.ts b/src/lib/openapi/db.ts index 55c572f..842ca97 100644 --- a/src/lib/openapi/db.ts +++ b/src/lib/openapi/db.ts @@ -331,7 +331,7 @@ export const dbOpenApi: AgentOpenApiModule = { tags: [DB_TAG], summary: 'Run single-table SQL (ORM-grade, D1-shaped)', description: - 'One SELECT/INSERT/UPDATE/DELETE (or an atomic `batch`) over this table alone - what `@frostbase/db/drizzle` drives. DML gains automatic RETURNING and feeds the change log and live queries. ALWAYS requires a project JWT (public modes never open raw SQL); owner-scoped tables refuse it. Results carry objects plus `raw` value arrays with `columns` order for drivers. SELECTs serve from region replicas when replication is on.', + 'One SELECT/INSERT/UPDATE/DELETE (or an atomic `batch`) over this table alone - what `@frostbase-dev/db/drizzle` drives. DML gains automatic RETURNING and feeds the change log and live queries. ALWAYS requires a project JWT (public modes never open raw SQL); owner-scoped tables refuse it. Results carry objects plus `raw` value arrays with `columns` order for drivers. SELECTs serve from region replicas when replication is on.', parameters: [tableParam], security: PUBLIC_SECURITY, requestBody: { diff --git a/src/routes/(app)/dashboard/[projectId]/db/[[tool=dbtool]]/+page.svelte b/src/routes/(app)/dashboard/[projectId]/db/[[tool=dbtool]]/+page.svelte index 964ec17..fade7bf 100644 --- a/src/routes/(app)/dashboard/[projectId]/db/[[tool=dbtool]]/+page.svelte +++ b/src/routes/(app)/dashboard/[projectId]/db/[[tool=dbtool]]/+page.svelte @@ -897,7 +897,7 @@ curl -X POST ${dbBase}/collections/posts/documents \\ id: 'sdk', label: 'Client SDK', lang: 'typescript', - code: `import { createDbClient } from '@frostbase/db/client'; + code: `import { createDbClient } from '@frostbase-dev/db/client'; // IN THE BROWSER. This fetch sends no Authorization header - it works // because the browser attaches the signed-in user's session cookie, so the @@ -931,7 +931,7 @@ const unsubscribe = posts.subscribe( id: 'ssr', label: 'Server (SSR)', lang: 'typescript', - code: `import { createDbClient } from '@frostbase/db/client'; + code: `import { createDbClient } from '@frostbase-dev/db/client'; // ON A SERVER there is no ambient session, so you RELAY the identity the // user already sent you: /auth/token accepts the session cookie or a bearer @@ -960,7 +960,7 @@ export async function load({ request }) { id: 'service-key', label: 'Admin service key', lang: 'typescript', - code: `import { createDbAdmin } from '@frostbase/db/admin'; + code: `import { createDbAdmin } from '@frostbase-dev/db/admin'; // SERVER ONLY. An admin service key is admin-grade over this project's whole // data plane: it bypasses access modes, validators, and permission keys, exactly @@ -995,7 +995,7 @@ await db.table('orders').sql('SELECT * FROM orders WHERE id = ?', [id]); id: 'tables', label: 'SQL tables', lang: 'typescript', - code: `import { createDbClient } from '@frostbase/db/client'; + code: `import { createDbClient } from '@frostbase-dev/db/client'; const db = createDbClient({ baseUrl: '${dbBase}', @@ -1019,7 +1019,7 @@ todos.subscribe( id: 'drizzle', label: 'Drizzle', lang: 'typescript', - code: `import { drizzleTable } from '@frostbase/db/drizzle'; + code: `import { drizzleTable } from '@frostbase-dev/db/drizzle'; import { desc } from 'drizzle-orm'; import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core'; diff --git a/src/routes/(marketing)/+page.svelte b/src/routes/(marketing)/+page.svelte index f66851b..564a891 100644 --- a/src/routes/(marketing)/+page.svelte +++ b/src/routes/(marketing)/+page.svelte @@ -875,7 +875,8 @@

Point fetch at your project's endpoint and you're integrated - this is the exact API the demo dashboard uses. When you want types, the - Better Auth client and @frostbase/db/client wrap the same routes. + Better Auth client and @frostbase-dev/db/client wrap the same + routes.

  • diff --git a/static/brand/github-header.png b/static/brand/github-header.png index aa14c63..b6ef156 100644 Binary files a/static/brand/github-header.png and b/static/brand/github-header.png differ diff --git a/static/brand/github-header.svg b/static/brand/github-header.svg index 2397d82..f856540 100644 --- a/static/brand/github-header.svg +++ b/static/brand/github-header.svg @@ -1,22 +1,22 @@ - - - + + + - Frostbase - The open-source backend built for Cloudflare - - - Auth - - Database - - Durable Objects - - Workers AI - - Self-hostable + Frostbase + The open-source backend built for Cloudflare + + + Auth + + Database + + Durable Objects + + Workers AI + + Self-hostable diff --git a/static/brand/social-preview.png b/static/brand/social-preview.png index b6ef156..aa14c63 100644 Binary files a/static/brand/social-preview.png and b/static/brand/social-preview.png differ diff --git a/static/brand/social-preview.svg b/static/brand/social-preview.svg index f856540..2397d82 100644 --- a/static/brand/social-preview.svg +++ b/static/brand/social-preview.svg @@ -1,22 +1,22 @@ - - - + + + - Frostbase - The open-source backend built for Cloudflare - - - Auth - - Database - - Durable Objects - - Workers AI - - Self-hostable + Frostbase + The open-source backend built for Cloudflare + + + Auth + + Database + + Durable Objects + + Workers AI + + Self-hostable diff --git a/static/llms.txt b/static/llms.txt index 7e1e897..f73b205 100644 --- a/static/llms.txt +++ b/static/llms.txt @@ -13,9 +13,9 @@ Frostbase is agent-first: every backend primitive ships as a versioned npm packa ## Source - [GitHub](https://github.com/frostbase-dev/frostbase): the whole repository, including both agents and the CLI. -- [@frostbase/auth](https://www.npmjs.com/package/@frostbase/auth): Better Auth in a per-project Durable Object. -- [@frostbase/db](https://www.npmjs.com/package/@frostbase/db): documents and typed SQL tables, both with live queries. -- [@frostbase/cli](https://www.npmjs.com/package/@frostbase/cli): `init`, `add `, `deploy`, `schema`. +- [@frostbase-dev/auth](https://www.npmjs.com/package/@frostbase-dev/auth): Better Auth in a per-project Durable Object. +- [@frostbase-dev/db](https://www.npmjs.com/package/@frostbase-dev/db): documents and typed SQL tables, both with live queries. +- [@frostbase-dev/cli](https://www.npmjs.com/package/@frostbase-dev/cli): `init`, `add `, `deploy`, `schema`. ## Optional