{"_id":"@drigosihombinga/astro-scribe","_rev":"4-84c4fbd2b08f62d9bb0d3e90aed38920","name":"@drigosihombinga/astro-scribe","dist-tags":{"latest":"0.3.7"},"versions":{"0.1.0":{"name":"@drigosihombinga/astro-scribe","version":"0.1.0","keywords":["astro-integration","astro-component","astro","cms","content","editor","git"],"license":"MIT","_id":"@drigosihombinga/astro-scribe@0.1.0","maintainers":[{"name":"drigoalexander","email":"drigosihombinga@gmail.com"}],"homepage":"https://github.com/drigoalexander/scribe","bugs":{"url":"https://github.com/drigoalexander/scribe/issues"},"dist":{"shasum":"53e25bed944244bd5842cf52ae09a0fefdf3e09f","tarball":"https://registry.npmjs.org/@drigosihombinga/astro-scribe/-/astro-scribe-0.1.0.tgz","fileCount":142,"integrity":"sha512-q5sfJ5jJWseO3poWgL9vaueHfZAP6mwAJwnvrU8OET2TCOXMjjHvm+1uAyh6SOwhvI+Xl68K6vCuAbQSv0L4LA==","signatures":[{"sig":"MEYCIQDCfwEZCz/5+FTG+P1o3q9DWH88dXe5AE1gqcCSC3/NyAIhAMRNPBXti527/jRZDvXWRjqlvA+yHGW9pRXBMdAVPimn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":314415},"type":"module","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./client":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"./runtime":{"types":"./dist/runtime/index.d.ts","default":"./dist/runtime/index.js"},"./routes/*":"./routes/*","./bilingual":{"types":"./dist/plugins/bilingual/index.d.ts","default":"./dist/plugins/bilingual/index.js"},"./middleware":{"types":"./dist/middleware.d.ts","default":"./dist/middleware.js"},"./components/*":"./components/*","./package.json":"./package.json"},"gitHead":"a561a7793d45b60f3b41fcd1ed9e4573c971a826","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","check":"tsc -p tsconfig.json --noEmit","lint:package":"publint && attw --pack . --profile esm-only","prepublishOnly":"npm run build && npm run lint:package"},"_npmUser":{"name":"drigoalexander","email":"drigosihombinga@gmail.com"},"repository":{"url":"git+ssh://git@github.com/drigoalexander/scribe.git","type":"git","directory":"packages/astro-scribe"},"_npmVersion":"11.12.1","description":"Scribe — a git-backed CMS for Astro. Staff edit content on the live page, see it update as they type, and publish with one button.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"yaml":"^2.9.0","idiomorph":"^0.7.4","iron-webcrypto":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.4.3","astro":"^7.0.7","react":"^19.2.7","vitest":"^4.1.10","publint":"^0.3.16","react-dom":"^19.2.7","@tiptap/pm":"^3.29.0","typescript":"^6.0.3","@types/react":"^19.2.17","@tiptap/react":"^3.29.0","@astrojs/react":"^6.0.1","tiptap-markdown":"^0.9.0","@types/react-dom":"^19.2.3","@tiptap/starter-kit":"^3.29.0","@arethetypeswrong/cli":"^0.18.2","@tiptap/extension-link":"^3.29.0"},"peerDependencies":{"zod":"^4.0.0","astro":"^7.0.0","react":"^19.0.0","react-dom":"^19.0.0","@tiptap/pm":"^3.0.0","@tiptap/react":"^3.0.0","@astrojs/react":"^6.0.0","tiptap-markdown":"^0.9.0","@tiptap/starter-kit":"^3.0.0","@tiptap/extension-link":"^3.0.0"},"peerDependenciesMeta":{"@tiptap/pm":{"optional":true},"@tiptap/react":{"optional":true},"tiptap-markdown":{"optional":true},"@tiptap/starter-kit":{"optional":true},"@tiptap/extension-link":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/astro-scribe_0.1.0_1787836838824_0.36169749418431385","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"@drigosihombinga/astro-scribe","version":"0.3.6","keywords":["astro-integration","astro-component","astro","cms","content","editor","git"],"license":"MIT","_id":"@drigosihombinga/astro-scribe@0.3.6","maintainers":[{"name":"drigoalexander","email":"drigosihombinga@gmail.com"}],"homepage":"https://github.com/drigoalexander/scribe","bugs":{"url":"https://github.com/drigoalexander/scribe/issues"},"dist":{"shasum":"8fb0de125f5a0bb62155c6b881dad7e7358705f8","tarball":"https://registry.npmjs.org/@drigosihombinga/astro-scribe/-/astro-scribe-0.3.6.tgz","fileCount":284,"integrity":"sha512-5rECByFSVzj6Puwj30qMVrAAhJ8heP7SJkCCFp16jzXVSpivAYr/kfcKNwk6mVmK7OIIWWSlzEwHic8Javghtg==","signatures":[{"sig":"MEUCICIgOQo35RtK/K/zK8DraQNO/f/ckSmx97/5PsvsXvlQAiEA8srwKU/F59ZY719ML07KdoMtEBnpSk0l0e3BRFchBA4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":776762},"type":"module","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./dev":{"types":"./dist/dev/index.d.ts","default":"./dist/dev/index.js"},"./client":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"./runtime":{"types":"./dist/runtime/index.d.ts","default":"./dist/runtime/index.js"},"./routes/*":"./routes/*","./bilingual":{"types":"./dist/plugins/bilingual/index.d.ts","default":"./dist/plugins/bilingual/index.js"},"./middleware":{"types":"./dist/middleware.d.ts","default":"./dist/middleware.js"},"./components/*":"./components/*","./package.json":"./package.json"},"gitHead":"678f110fcfa4e72e60917c4e3de162efd8cf11ad","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","check":"tsc -p tsconfig.json --noEmit","lint:package":"publint && attw --pack . --profile esm-only","prepublishOnly":"npm run lint:portability && npm run build && npm run lint:package","lint:portability":"node scripts/check-portability.mjs"},"_npmUser":{"name":"drigoalexander","email":"drigosihombinga@gmail.com"},"repository":{"url":"git+ssh://git@github.com/drigoalexander/scribe.git","type":"git","directory":"packages/astro-scribe"},"_npmVersion":"11.19.0","description":"Scribe — a git-backed CMS for Astro. Staff edit content on the live page, see it update as they type, and publish with one button.","directories":{},"_nodeVersion":"26.8.1","dependencies":{"yaml":"^2.9.0","idiomorph":"^0.7.4","idb-keyval":"^6.3.0","iron-webcrypto":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.4.3","astro":"^7.0.7","jsdom":"^30.0.1","react":"^19.2.7","vitest":"^4.1.10","publint":"^0.3.16","react-dom":"^19.2.7","@tiptap/pm":"^3.29.0","typescript":"^6.0.3","@types/react":"^19.2.17","@tiptap/react":"^3.29.0","@astrojs/react":"^6.0.1","fake-indexeddb":"^6.2.5","tiptap-markdown":"^0.9.0","@types/react-dom":"^19.2.3","@tiptap/starter-kit":"^3.29.0","@arethetypeswrong/cli":"^0.18.2","@tiptap/extension-link":"^3.29.0"},"peerDependencies":{"zod":"^4.0.0","astro":"^7.0.0","react":"^19.0.0","react-dom":"^19.0.0","@tiptap/pm":"^3.0.0","@tiptap/react":"^3.0.0","@astrojs/react":"^6.0.0","tiptap-markdown":"^0.9.0","@tiptap/starter-kit":"^3.0.0","@tiptap/extension-link":"^3.0.0"},"peerDependenciesMeta":{"@tiptap/pm":{"optional":true},"@tiptap/react":{"optional":true},"tiptap-markdown":{"optional":true},"@tiptap/starter-kit":{"optional":true},"@tiptap/extension-link":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/astro-scribe_0.3.6_1788975305687_0.344379627452726","host":"s3://npm-registry-packages-npm-production"},"deprecated":"published before the copy audit; use 0.3.7"},"0.3.7":{"name":"@drigosihombinga/astro-scribe","version":"0.3.7","keywords":["astro-integration","astro-component","astro","cms","content","editor","git"],"license":"MIT","_id":"@drigosihombinga/astro-scribe@0.3.7","maintainers":[{"name":"drigoalexander","email":"drigosihombinga@gmail.com"}],"homepage":"https://github.com/drigoalexander/scribe","bugs":{"url":"https://github.com/drigoalexander/scribe/issues"},"dist":{"shasum":"0d090db5934c415fed0b3d5de4298f5cdaf61a87","tarball":"https://registry.npmjs.org/@drigosihombinga/astro-scribe/-/astro-scribe-0.3.7.tgz","fileCount":284,"integrity":"sha512-Rq+qEwIdhbTXb9R80UIEzUIw9PBUxEqFNNwanE1btQ7T+OXiKd5w2GpEfkHpkqZ01PHwzs8tXfi2v/aOUJCtOQ==","signatures":[{"sig":"MEYCIQCpwohIHhDxjUlYAUlUPnI1AWg8VxIbJXVoJR2l7efkcgIhAJS6hzKOUbMdpwGX8JPZwvOQF3RCnQiJU5Cpv7bQVp73","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":777086},"type":"module","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./dev":{"types":"./dist/dev/index.d.ts","default":"./dist/dev/index.js"},"./client":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"./runtime":{"types":"./dist/runtime/index.d.ts","default":"./dist/runtime/index.js"},"./routes/*":"./routes/*","./bilingual":{"types":"./dist/plugins/bilingual/index.d.ts","default":"./dist/plugins/bilingual/index.js"},"./middleware":{"types":"./dist/middleware.d.ts","default":"./dist/middleware.js"},"./components/*":"./components/*","./package.json":"./package.json"},"gitHead":"18beda1fc2c75ed56cc4dfc18b5caeb59f16c817","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","check":"tsc -p tsconfig.json --noEmit","lint:package":"publint && attw --pack . --profile esm-only","prepublishOnly":"npm run lint:portability && npm run build && npm run lint:package","lint:portability":"node scripts/check-portability.mjs"},"_npmUser":{"name":"drigoalexander","email":"drigosihombinga@gmail.com"},"repository":{"url":"git+ssh://git@github.com/drigoalexander/scribe.git","type":"git","directory":"packages/astro-scribe"},"_npmVersion":"11.19.0","description":"Scribe — a git-backed CMS for Astro. Staff edit content on the live page, see it update as they type, and publish with one button.","directories":{},"_nodeVersion":"26.8.1","dependencies":{"yaml":"^2.9.0","idiomorph":"^0.7.4","idb-keyval":"^6.3.0","iron-webcrypto":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.4.3","astro":"^7.0.7","jsdom":"^30.0.1","react":"^19.2.7","vitest":"^4.1.10","publint":"^0.3.16","react-dom":"^19.2.7","@tiptap/pm":"^3.29.0","typescript":"^6.0.3","@types/react":"^19.2.17","@tiptap/react":"^3.29.0","@astrojs/react":"^6.0.1","fake-indexeddb":"^6.2.5","tiptap-markdown":"^0.9.0","@types/react-dom":"^19.2.3","@tiptap/starter-kit":"^3.29.0","@arethetypeswrong/cli":"^0.18.2","@tiptap/extension-link":"^3.29.0"},"peerDependencies":{"zod":"^4.0.0","astro":"^7.0.0","react":"^19.0.0","react-dom":"^19.0.0","@tiptap/pm":"^3.0.0","@tiptap/react":"^3.0.0","@astrojs/react":"^6.0.0","tiptap-markdown":"^0.9.0","@tiptap/starter-kit":"^3.0.0","@tiptap/extension-link":"^3.0.0"},"peerDependenciesMeta":{"@tiptap/pm":{"optional":true},"@tiptap/react":{"optional":true},"tiptap-markdown":{"optional":true},"@tiptap/starter-kit":{"optional":true},"@tiptap/extension-link":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/astro-scribe_0.3.7_1788976328176_0.250322963494799","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-08-27T13:20:38.630Z","modified":"2026-09-09T17:53:33.889Z","0.1.0":"2026-08-27T13:20:38.983Z","0.3.6":"2026-09-09T17:35:05.863Z","0.3.7":"2026-09-09T17:52:08.342Z"},"bugs":{"url":"https://github.com/drigoalexander/scribe/issues"},"license":"MIT","homepage":"https://github.com/drigoalexander/scribe","keywords":["astro-integration","astro-component","astro","cms","content","editor","git"],"repository":{"url":"git+ssh://git@github.com/drigoalexander/scribe.git","type":"git","directory":"packages/astro-scribe"},"description":"Scribe — a git-backed CMS for Astro. Staff edit content on the live page, see it update as they type, and publish with one button.","maintainers":[{"name":"drigoalexander","email":"drigosihombinga@gmail.com"}],"readme":"# Scribe\n\nA git-backed CMS for Astro. Non-technical staff edit content **on the live page**, watch it\nupdate as they type, and publish with one button. The repository is the truth; the server keeps\nnothing.\n\n```bash\nnpm install @drigosihombinga/astro-scribe\n```\n\n> **Status: 0.3.0, pre-release.** The architecture runs in production on one site; the public\n> API is not yet stable.\n\n---\n\n## What it is\n\nMost CMSs give you an admin panel that renders an *approximation* of your site. Scribe has no\npreview renderer. When you type, the server re-renders the real page with your draft applied\nand morphs the result into the DOM you are looking at. Fidelity is exact because there is\nnothing to keep in sync.\n\nContent lives in your git repository. Every save is a commit on a shared draft branch\n(`scribe/draft`), merged **per field** so two teachers editing one document never see a\nconflict. Publishing squashes the draft branch onto `main` as one commit; your CI builds and\ndeploys the static site from there. The server holds no state between requests, uses only Web\nAPIs (plus `node:async_hooks`), and runs on any Astro adapter.\n\n## Requirements\n\n- Astro 7, `@astrojs/react` (the editor is a React island), Node ≥ 22.12\n- Zod 4 — Scribe reads `.meta()` through `z.toJSONSchema()` to build forms\n- A GitHub repository (other providers implement the same nine-method interface)\n\n## Two deployments from one codebase\n\nA prerendered route cannot also be rendered on demand, and previews must render the real pages\nwith drafts applied — so the same commit is built twice by the same CI:\n\n| Deployment | `output` | Serves |\n| --- | --- | --- |\n| **Public** — `example.com` | `static` | the site; carries the `scribe-build` meta |\n| **Editor** — `studio.example.com` | `server` | the site again (for preview), the Studio UI, `/studio/*` |\n\nThe public build carries no Scribe route, middleware or script. `astro dev` always runs as the\neditor, against an in-memory repository when none is configured.\n\n## Setup\n\n**1. Add the integration, switching `output` on one variable.**\n\n```js\n// astro.config.mjs\nimport { defineConfig } from 'astro/config';\nimport node from '@astrojs/node';\nimport react from '@astrojs/react';\nimport scribe from '@drigosihombinga/astro-scribe';\n\nconst editor = process.env.SCRIBE_MODE === 'editor';\n\nexport default defineConfig({\n  output: editor ? 'server' : 'static',\n  adapter: editor ? node({ mode: 'standalone' }) : undefined,\n  integrations: [react(), scribe()],\n});\n```\n\n**2. Describe your content and name your repository.**\n\n```ts\n// src/scribe.config.ts\nimport { z } from 'zod';\nimport { defineScribeConfig, editor } from '@drigosihombinga/astro-scribe';\n\nconst Article = z.object({\n  title: z.string(),\n  img: editor(z.string(), { input: 'media', label: 'Cover photo' }),\n  body: editor(z.string(), { input: 'markdown', rows: 16 }),\n});\n\nexport default defineScribeConfig({\n  collections: [\n    { name: 'articles', label: 'News', kind: 'list', schema: Article, formSource: 'schema' },\n  ],\n  pages: { '/': 'Home', '/news': 'News' },\n  repository: { provider: 'github', owner: 'acme', repo: 'site', branch: 'main', draftBranch: 'scribe/draft' },\n  media: { dir: 'public/media', maxBytes: 5_000_000 },\n});\n```\n\n**3. Put the build sha on the public site**, so the editor can tell when a publish is live:\n\n```astro\n<meta name=\"scribe-build\" content={import.meta.env.SCRIBE_BUILD_SHA ?? ''} />\n```\n\nand have CI export `SCRIBE_BUILD_SHA=$GITHUB_SHA` into both builds.\n\n**4. Set the environment on the editor host.**\n\n| Variable | Purpose |\n| --- | --- |\n| `SCRIBE_SESSION_SECRET` | 32+ chars; encrypts the session cookie |\n| `SCRIBE_PUBLIC_ORIGIN` | the editor host, `https://studio.example.com`; required behind a TLS proxy |\n| `SCRIBE_SITE_ORIGIN` | the public host, read for the `scribe-build` meta |\n| `SCRIBE_GITHUB_CLIENT_ID` / `_SECRET` | GitHub OAuth app; callback `<PUBLIC_ORIGIN>/studio/auth/github/callback` |\n| `SCRIBE_GOOGLE_CLIENT_ID` / `_SECRET` | Google OAuth client; callback `<PUBLIC_ORIGIN>/studio/auth/callback` |\n| `SCRIBE_GIT_TOKEN` | fine-grained PAT (Contents read/write) held by a dedicated editorial account; used for Google sign-ins |\n| `SCRIBE_GIT_COMMITTER_NAME` / `_EMAIL` | the editorial account's identity (default `Scribe <scribe@localhost>`) |\n| `SCRIBE_EDITORS` | comma-separated addresses that may draft |\n| `SCRIBE_PUBLISHERS` | comma-separated addresses that may draft **and** publish |\n\nEither sign-in method alone is enough. `SCRIBE_ALLOWED_EMAILS` is still read as an alias for\n`SCRIBE_EDITORS` for one release. Empty lists fail closed: nobody publishes until a publisher is\nnamed.\n\n## Sign-in and roles\n\n- **GitHub** — the teacher's own OAuth token is sealed into the httpOnly cookie and commits are\n  made as them. A token that can push to the repository makes its owner an editor even when\n  absent from the lists; publishing still requires `SCRIBE_PUBLISHERS`.\n- **Google** — identity only. Commits use the editorial token; the teacher is the author and the\n  commit carries `Co-authored-by`.\n\nTokens never reach browser JavaScript; `GET /studio/session` returns `{ email, name, role }` and\nnothing else. Roles are re-read from the environment on every request.\n\n## How it works\n\n| Concern | Approach |\n| --- | --- |\n| **Forms** | Zod schemas → JSON Schema → a form tree. `.meta({ editor })` carries labels and widgets. |\n| **Drafts** | One shared branch. Each save is a commit with a `Scribe-Fields:` trailer naming the fields it touched; the browser keeps only a typing buffer (IndexedDB). |\n| **Merging** | Three-way, per field. My changed fields win; everything else follows the branch. A field a colleague also changed is written as mine and shown as a chip — *Changed by Pak Andi · use their version* — the only surface a conflict ever has. |\n| **Preview** | `POST /studio/preview { route, values }` renders the page with those documents overlaid, then `idiomorph` morphs it in. No repository call. |\n| **Publish** | Publishers squash the draft branch onto `main` in one commit (developer fixes on `main` are folded in, chosen fields can keep their live value), then the draft branch is reset with a `Scribe-Base:` marker. Both ref updates are compare-and-swap. |\n| **Status** | `/studio/status` combines CI checks for `main` with the public site's `scribe-build` meta: *building*, *live*, or *failed*. |\n| **Media** | An upload rides inside the next save, named by its content hash, so the photo and the field that points at it land in one commit. The editor host serves draft-line photos from the branch; the public build ships them from `public/media`. |\n| **Portability** | `npm run lint:portability` forbids every `node:*` import but `async_hooks` under `src/` and `routes/`. |\n\n## The editor\n\nNothing is added to your markup. When a signed-in editor loads any page, a bar appears along the\nbottom edge and every section the CMS knows about gets a hover outline with its name; click one\nand an inspector docks on the right with that document's fields, grouped into sections. `⌘K`\nopens a browser of everything else, grouped by page, with *Write a new …* under each list\ncollection. Review is a sheet that rises from the bar: every pending field with who changed it\nand when; publishers can keep the live version of any field and publish the rest, editors see\nthe same list under *Waiting to be published*.\n\nMark a section so the editor can find it on the page:\n\n```html\n<section data-scribe=\"home/latest-news\">…</section>\n```\n\n## Widgets, labels, locations\n\nFields render through a registry (`registerWidget`), two widgets ship — `bilingual` and\n`markdown` (Tiptap, optional peers) — and every collection accepts `documentLabels`,\n`fieldLabels` and `locate` so what staff see is named in their language and a click goes\nsomewhere. See the docs in the repository for the full reference.\n\n## What changed in 0.3.5\n\nFixes from the first content pass a real editor made through the browser (see\n`docs/superpowers/specs/2026-08-30-scribe-report-fixes-design.md` in the repository):\n\n- **The draft line is what a signed-in editor sees on every page.** The middleware\n  overlays pending documents on any `GET` that carries a session; the bar's `Draft | Published`\n  switch writes the `<cookiePrefix>view` cookie and reloads. Anonymous visitors are untouched.\n- **Review opens in a blink.** `/studio/review` and the page overlay are memoised under the two\n  branch heads (`cachedByHeads`), so a review costs two head lookups instead of a tree walk.\n- **Rows diff as rows.** Deleting the fifth of eight list rows reads as *3 rows removed*, not as\n  edits to rows 5–8. Publishers keep or drop whole rows; editors put back or withdraw their own.\n- **Editors can withdraw one field:** `DELETE /studio/draft?path=…&field=…[&row=added|removed]`.\n- **The review sheet says who you are and what you can do**, groups documents by page, marks\n  changes older than a day, shows a skeleton while loading, locks while publishing, and ends on a\n  confirmation naming the commit and the branch (with a note under `astro dev` that the local\n  copy does not change).\n- **Honest save states:** *Not saved yet* while a change is typed but not sent, `⌘S` to send it\n  now, and the browser asks before you leave mid-save.\n- **`/studio` is a page**: documents by page with pending counts, the last commit on the publish\n  branch, the build state, your role and the sign-in methods.\n- **Locales.** `scribe({ locales: { default: 'id', prefixes: { en: '/en' } } })` keeps the\n  language you are reading while the editor navigates and adds an `ID | EN` switch to the\n  inspector.\n- **Input hints for data-driven forms.** A collection with `formSource: 'data'` may set\n  `fieldInputs: { 'story.img': 'media' }` so a plain string leaf renders as a photo picker.\n- Accessible names on rows, palette options and the bar's buttons; the decorative drag glyph is\n  gone (nothing reorders yet).\n- The status endpoint returns `branches` and `repoWebUrl`; publish returns `branch`.\n\nGitHub sign-in needs `SCRIBE_GITHUB_CLIENT_ID` / `_SECRET`; without them only the Google button\nrenders.\n\n## Development\n\n`apps/example` runs the whole editor against an in-memory repository seeded from its content\ndirectory: `npm run example:dev`, sign-in bypassed. `npm run verify` runs the portability lint,\ntypecheck, tests and build. The provider contract runs against GitHub when\n`SCRIBE_TEST_GITHUB_TOKEN`, `SCRIBE_TEST_REPO` and `SCRIBE_TEST_BRANCH` are set.\n\n## Licence\n\nMIT. Portions adapted from [Nuxt Studio](https://github.com/nuxt-content/nuxt-studio) (MIT);\nsee `NOTICE`.\n","readmeFilename":"README.md"}