From 5528f937ee812d834cad56352f95e9516fe73f86 Mon Sep 17 00:00:00 2001 From: AHMET BAYHAN BAYRAMOGLU <49499275+ABB65@users.noreply.github.com> Date: Fri, 17 Jul 2026 20:06:02 +0300 Subject: [PATCH 1/2] docs: align ai.contentrain.io with shipped behavior across all packages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Full audit of the VitePress docs site against package source (mcp 2.0.1, cli 0.7.10, query 7.0.1, types 0.9.0, rules/skills 0.6.0) and the Studio source/docs. Every factual claim was verified with file:line evidence; this commit fixes everything that diverged. Highlights: - dry_run is contentrain_apply-only; other writes are guarded by cr/* isolation, the content_save validation gate, and confirm:true on destructive tools. The docs claimed a universal dry-run pattern that the schemas do not accept. - relation example used a non-existent 'relation' key (schema wants 'model' and is strict) — the example would fail as written. - Trust table now covers all 24 tools with accurate read-only/local semantics (scan is read-only; merge is a local git op). - serve security notes had the enforcement inverted: the hard-error on non-localhost binds protects the web UI; MCP HTTP only warns on 0.0.0.0 and enforces Bearer per-request when a token is set. - Field constraint tables now match enforcement reality: options is select-only, unique is collection+document (rejected on singleton), pattern/min-max apply to all string values (no date-range semantics), relations supports count min/max, maxSize is provider-enforced, accept is a warning-only extension check. - Meta path for i18n:false documents corrected to {slug}/{default-locale}.json; entry deletes have no cascade guard — broken relations surface as errors on the next validate. - Canonical serialization: entry fields sort alphabetically (schema order applies only to model files); defaults are not stripped. - Studio alignment: real CDN endpoint pattern instead of the invented cdn.contentrain.io; managed plans are Starter/Pro/Enterprise. - Structural: demo.md added to the sidebar, og-image.png now exists (1200x630), frontmatter order collisions resolved, missing exports (root, tools/availability, testing/conformance) and runtime function surface of @contentrain/types documented. Verification: vitepress build clean (no dead links). --- CLAUDE.md | 2 +- README.md | 2 +- docs/.vitepress/config.ts | 1 + docs/concepts.md | 8 ++-- docs/ecosystem.md | 2 +- docs/getting-started.md | 2 +- docs/guides/embedding-mcp.md | 12 ++++-- docs/guides/http-transport.md | 10 ++--- docs/guides/providers.md | 2 +- docs/guides/serve-ui.md | 13 ++++--- docs/index.md | 2 +- docs/packages/cli.md | 16 ++++---- docs/packages/mcp.md | 38 ++++++++++++------- docs/packages/rules.md | 4 +- docs/packages/sdk.md | 14 ++++++- docs/packages/types.md | 40 ++++++++++++++++++-- docs/public/og-image.png | Bin 0 -> 151738 bytes docs/reference/config.md | 17 ++++++--- docs/reference/field-types.md | 67 +++++++++++++++++++++------------- docs/reference/model-kinds.md | 9 ++--- docs/studio.md | 4 +- 21 files changed, 174 insertions(+), 91 deletions(-) create mode 100644 docs/public/og-image.png diff --git a/CLAUDE.md b/CLAUDE.md index 46d5da2..ae6c503 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -36,7 +36,7 @@ Use these references instead: When working with Contentrain content operations (models, content, normalize, validate), you MUST follow the rules and skills in this repo: -### Essential Rules (always-loaded, ~86 lines) +### Essential Rules (always-loaded) - `packages/rules/essential/contentrain-essentials.md` — compact guardrails for every conversation ### Skills (Agent Skills standard, on-demand) diff --git a/README.md b/README.md index 8fc985f..83dd534 100644 --- a/README.md +++ b/README.md @@ -222,7 +222,7 @@ npx contentrain studio connect # connect repo to Studio project - **[Getting Started](https://ai.contentrain.io/getting-started)** — install, connect an agent, and run the first workflow - **[Normalize Guide](https://ai.contentrain.io/guides/normalize)** — the main hardcoded-string rescue flow - **[Ecosystem Map](https://ai.contentrain.io/ecosystem)** — package-to-product bridges across AI and Studio -- **[Contentrain Studio](https://ai.contentrain.io/studio)** — open-core team operations for Git-native structured content, self-hostable or available as a managed Pro/Enterprise offering +- **[Contentrain Studio](https://ai.contentrain.io/studio)** — open-core team operations for Git-native structured content, self-hostable or available as managed plans (Starter/Pro/Enterprise) - **[Full Docs](https://ai.contentrain.io)** — guides, package reference, and framework integration ## Development diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 571f8e4..c5503ba 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -70,6 +70,7 @@ export default defineConfig({ text: 'Introduction', items: [ { text: 'What is Contentrain AI?', link: '/getting-started' }, + { text: '2-Minute Demo', link: '/demo' }, { text: 'Ecosystem Map', link: '/ecosystem' }, { text: 'Core Concepts', link: '/concepts' }, { text: 'Contentrain Studio', link: '/studio' }, diff --git a/docs/concepts.md b/docs/concepts.md index 137771b..dccc467 100644 --- a/docs/concepts.md +++ b/docs/concepts.md @@ -1,7 +1,7 @@ --- title: Core Concepts description: "Understand the architecture: models, content kinds, domains, locales, and the agent-driven workflow" -order: 2 +order: 4 category: getting-started slug: concepts --- @@ -49,7 +49,7 @@ Contentrain AI inverts the traditional CMS workflow: - **Project setup:** `contentrain_init`, `contentrain_scaffold` - **Content and schema writes:** `contentrain_model_save`, `contentrain_model_delete`, `contentrain_content_save`, `contentrain_content_delete` - **Normalize:** `contentrain_scan`, `contentrain_apply` -- **Workflow and operations:** `contentrain_validate`, `contentrain_submit`, `contentrain_merge`, `contentrain_bulk` +- **Workflow and operations:** `contentrain_validate`, `contentrain_submit`, `contentrain_merge`, `contentrain_branch_list`, `contentrain_branch_delete`, `contentrain_bulk` MCP is **deterministic infrastructure** — it doesn't make content decisions. The agent decides what to create; MCP executes it. @@ -207,7 +207,7 @@ Contentrain stores everything as plain JSON and Markdown files in your Git repo. Web projects deploy content with `git push` — no extra infrastructure needed. But non-web platforms (iOS, Android, React Native, Flutter, desktop apps, game engines, IoT) can't read from a git repo at runtime. -For these use cases, Contentrain publishes merged content to a CDN (`cdn.contentrain.io`), delivering the same structured JSON your SDK queries — just over HTTP instead of the filesystem. +For these use cases, [Contentrain Studio](/studio)'s managed CDN publishes merged content over HTTP (`GET /api/cdn/v1/{projectId}/{path}` on the Studio host), delivering the same structured JSON your SDK queries — just over HTTP instead of the filesystem. The CDN is a Studio delivery feature (Cloudflare R2-backed), not part of the MIT core; the SDK's CDN client points at it via `cdn.url` in `config.json`. ``` Git repo → merge → CDN publish → iOS/Android/Flutter fetch → typed response @@ -217,7 +217,7 @@ This means one content source powers your website, mobile app, and any other pla ## Contentrain Studio -[Contentrain Studio](/studio) is the open-core team operations panel for Git-native structured content. Teams can self-host the AGPL core or use a managed Pro/Enterprise offering on top of the same model. +[Contentrain Studio](/studio) is the open-core team operations panel for Git-native structured content. Teams can self-host the AGPL core or use the managed plans (Starter/Pro/Enterprise) on top of the same model. The local open-source stack gives you: diff --git a/docs/ecosystem.md b/docs/ecosystem.md index 3c794ad..f10cfa7 100644 --- a/docs/ecosystem.md +++ b/docs/ecosystem.md @@ -1,7 +1,7 @@ --- title: Ecosystem Map description: "How Contentrain AI packages and Contentrain Studio fit together across discovery, governance, collaboration, and delivery." -order: 2 +order: 3 category: getting-started slug: ecosystem --- diff --git a/docs/getting-started.md b/docs/getting-started.md index 000b9d2..2f1b1b6 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -282,5 +282,5 @@ Want to skip setup? Start from a production-ready template with content models, - [Framework Integration](/guides/frameworks) — Platform-specific setup patterns ::: info Contentrain Studio -[Contentrain Studio](/studio) is the open-core team operations surface for Git-native structured content. Teams can self-host the AGPL core or use a managed Pro/Enterprise offering when they want web-based collaboration, review, media, and CDN delivery on top of the same content model. +[Contentrain Studio](/studio) is the open-core team operations surface for Git-native structured content. Teams can self-host the AGPL core or use the managed plans (Starter/Pro/Enterprise) when they want web-based collaboration, review, media, and CDN delivery on top of the same content model. ::: diff --git a/docs/guides/embedding-mcp.md b/docs/guides/embedding-mcp.md index 5fd9e4a..4b5bc49 100644 --- a/docs/guides/embedding-mcp.md +++ b/docs/guides/embedding-mcp.md @@ -51,6 +51,8 @@ const transport = new StdioServerTransport() await server.connect(transport) ``` +`createServer` also accepts an options object — `createServer({ provider, projectRoot?, instructions? })` — where `instructions` overrides the MCP server instructions string advertised to clients. + This is what `contentrain serve --stdio` does internally. Every IDE that speaks MCP (Claude Code, Cursor, Windsurf) talks to this shape. ### 2. HTTP + LocalProvider (local CI, Studio-like hosting pointed at a working tree) @@ -63,6 +65,7 @@ const handle = await startHttpMcpServer({ port: 3333, host: '0.0.0.0', authToken: process.env.MCP_BEARER_TOKEN, + // path: '/mcp' — custom mount path, default '/mcp' }) // handle.url — "http://0.0.0.0:3333/mcp" @@ -153,7 +156,7 @@ const handle = await startHttpMcpServerWith({ For **multi-tenant** deployments where each request targets a different project, see the **per-request resolver** section below. -Swap in `createGitLabProvider({ auth, project })` for GitLab. Self-hosted GitLab instances pass `project.host`. +Swap in `createGitLabProvider({ auth, project })` for GitLab — `project.projectId` (numeric ID or `group/name` path) is required; self-hosted GitLab instances also pass `project.host`. Both remote providers accept an optional `contentRoot` on the repo/project ref for monorepos whose `.contentrain/` lives under a prefix. ### 3a. HTTP + per-request provider resolver (multi-tenant) @@ -193,8 +196,9 @@ import { buildContextChange } from '@contentrain/mcp/core/context' import { validateProject } from '@contentrain/mcp/core/validator' import { CONTENTRAIN_BRANCH } from '@contentrain/types' +// Throws on invalid input; soft signals come back as per-entry advisories const plan = await planContentSave(provider, { model, entries, config, vocabulary }) -if (plan.result.some(r => r.error)) throw new Error('plan invalid') +const advisories = plan.result.flatMap(r => r.advisories ?? []) const overlay = new OverlayReader(provider, plan.changes) const contextChange = await buildContextChange(overlay, { @@ -245,7 +249,7 @@ Tools whose requirements can never be met by the session's provider are not regi { "error": "contentrain_validate requires local filesystem access.", "capability_required": "localWorktree", - "hint": "This tool is unavailable when MCP is driven by a remote provider. Use a LocalProvider or the stdio transport." + "hint": "This tool is unavailable when MCP is driven by a remote provider (e.g. GitHubProvider). Use a LocalProvider or the stdio transport." } ``` @@ -366,7 +370,7 @@ No HTTP, no MCP JSON-RPC — just the core primitives. ## Troubleshooting -**`ERR_PACKAGE_PATH_NOT_EXPORTED`** — you're reaching into a subpath that isn't in `package.json#exports`. Known good subpaths: `/server`, `/server/http`, `/core/config`, `/core/context`, `/core/contracts`, `/core/model-manager`, `/core/content-manager`, `/core/validator`, `/core/ops`, `/core/overlay-reader`, `/core/scanner`, `/core/graph-builder`, `/core/apply-manager`, `/core/scan-config`, `/providers/local`, `/providers/github`, `/providers/gitlab`, `/util/detect`, `/util/fs`, `/git/transaction`, `/git/branch-lifecycle`, `/templates`. +**`ERR_PACKAGE_PATH_NOT_EXPORTED`** — you're reaching into a subpath that isn't in `package.json#exports`. Known good subpaths: `/server`, `/server/http`, `/core/config`, `/core/context`, `/core/contracts`, `/core/model-manager`, `/core/content-manager`, `/core/validator`, `/core/doctor`, `/core/ops`, `/core/overlay-reader`, `/core/scanner`, `/core/graph-builder`, `/core/apply-manager`, `/core/scan-config`, `/providers/local`, `/providers/github`, `/providers/gitlab`, `/tools/annotations`, `/tools/availability`, `/testing/conformance`, `/util/detect`, `/util/fs`, `/git/transaction`, `/git/branch-lifecycle`, `/templates`. **Stale context.json stats after a remote commit** — you forgot `OverlayReader`. `buildContextChange(provider, op)` reads the pre-change branch; wrap with `new OverlayReader(provider, plan.changes)`. diff --git a/docs/guides/http-transport.md b/docs/guides/http-transport.md index 6dfce39..28ed238 100644 --- a/docs/guides/http-transport.md +++ b/docs/guides/http-transport.md @@ -71,7 +71,7 @@ const handle = await startHttpMcpServerWith({ // handle.close() stops the server ``` -The same pattern works for `createGitLabProvider` with a `GitLabProvider`. Both require their respective optional peers (`@octokit/rest`, `@gitbeaker/rest`). +The same pattern works for `createGitLabProvider({ auth, project })` — `project.projectId` (numeric ID or `group/name` path) is required, and self-hosted instances pass `project.host`. Both providers require their respective optional peers (`@octokit/rest`, `@gitbeaker/rest`). Multi-tenant deployments (`{ resolveProvider }`) should also set `sessionFingerprint` to bind each MCP session to the tenant it was created for — follow-up requests whose fingerprint doesn't match the session's get `404` and the client re-initializes. See the [embedding guide](/guides/embedding-mcp#3a-http--per-request-provider-resolver-multi-tenant) for the full pattern. @@ -117,13 +117,13 @@ An agent running on a laptop can drive a Contentrain project that lives on a ser ## Capability gates over HTTP -Not every tool works on every provider. A tool driven by an HTTP client against a remote provider returns a structured capability error when the required capability is missing: +Not every tool works on every provider. Most gating happens at registration time: tools whose requirements a remote provider cannot meet (e.g. `contentrain_scan`, which needs `astScan` + a local project root) are filtered out of `tools/list` entirely. Two cases depend on the *input*, so they surface as structured call-time errors instead — `contentrain_validate` with `fix: true` and `contentrain_apply` in reuse mode: ```json { - "error": "contentrain_scan requires local filesystem access.", - "capability_required": "astScan", - "hint": "This tool is unavailable when MCP is driven by a remote provider. Use a LocalProvider or the stdio transport." + "error": "contentrain_validate requires local filesystem access.", + "capability_required": "localWorktree", + "hint": "This tool is unavailable when MCP is driven by a remote provider (e.g. GitHubProvider). Use a LocalProvider or the stdio transport." } ``` diff --git a/docs/guides/providers.md b/docs/guides/providers.md index 9f19653..0049260 100644 --- a/docs/guides/providers.md +++ b/docs/guides/providers.md @@ -51,7 +51,7 @@ Read-only tools (`status`, `describe`, `describe_format`, `content_list`, `valid - **`LocalProvider`** — Day-to-day development from an IDE. Offline-capable, zero API keys, full source-tree access for normalize. - **`GitHubProvider`** — CI-driven content operations, Studio's hosted agent, or any automation that should push directly to a GitHub repository without a clone. Requires `@octokit/rest` (optional peer dependency) and a personal access token or GitHub App installation. -- **`GitLabProvider`** — Same as above for GitLab (SaaS or self-hosted). Requires `@gitbeaker/rest` (optional peer dependency) and a PAT / OAuth / job token. +- **`GitLabProvider`** — Same as above for GitLab (SaaS or self-hosted). Requires `@gitbeaker/rest` (optional peer dependency) and an auth token: `{ type: 'pat', token }`, `{ type: 'oauth', oauthToken }`, or `{ type: 'job', jobToken }` (CI job token). The project ref needs `projectId` (numeric ID or `group/name` path); self-hosted instances add `host`. The choice is operational, not commercial. All three providers live in MIT; enterprise features are on top of Contentrain Studio, not behind provider gates. See [Ecosystem Map](/ecosystem) for the full package-to-product relationship. diff --git a/docs/guides/serve-ui.md b/docs/guides/serve-ui.md index 6467955..870b9f8 100644 --- a/docs/guides/serve-ui.md +++ b/docs/guides/serve-ui.md @@ -37,11 +37,11 @@ The server starts on `http://localhost:3333` by default. |---|---|---| | `--port` | `3333` | Port number | | `--host` | `localhost` | Host address | -| `--open=false` | `true` | Prevent auto-opening browser | +| `--open=false` | `true` | Prevent auto-opening browser (or set `CONTENTRAIN_NO_OPEN=true`) | | `--demo` | disabled | Temporary demo project (no setup required) | | `--stdio` | disabled | MCP stdio transport for IDE integration (no web UI) | -| `--mcpHttp` | disabled | MCP HTTP transport at `POST /mcp` (secure-by-default Bearer auth) | -| `--authToken` | — | Bearer token required on non-localhost HTTP binds | +| `--mcpHttp` | disabled | MCP HTTP transport at `POST /mcp` (Bearer auth enforced when a token is set) | +| `--authToken` | — | Bearer token; the web UI refuses to start on non-localhost binds without it | ### Check if already running @@ -213,7 +213,8 @@ The serve backend exposes REST endpoints at `http://localhost:3333/api/*`. Key r | `/api/preview/merge?branch=cr/...` | GET | Side-effect-free merge preview (FF / conflicts / already-merged) | | `/api/history` | GET | Recent contentrain-related commits | | `/api/context` | GET | `.contentrain/context.json` | -| `/api/normalize/*` | various | Scan / plan / approve / reject / apply / approve-branch | +| `/api/normalize/*` | various | Scan / results / plan / approve / reject / apply / approve-branch / sources / file-context | +| `/api/tree` | GET | Project source-file tree (`?ext=` filter) | Every write route validates its body through Zod schemas (`parseOrThrow`) before reaching the MCP tool layer. @@ -267,7 +268,9 @@ For Studio, CI, or remote agents, serve can expose MCP over Streamable HTTP: npx contentrain serve --mcpHttp --authToken $(openssl rand -hex 32) ``` -**Secure-by-default:** binding to a non-localhost address (`0.0.0.0` / specific IPs) without `--authToken` (or `CONTENTRAIN_AUTH_TOKEN` env var) is a hard error — the HTTP MCP endpoint exposes full project write access. +When a token is supplied, every request must send `Authorization: Bearer `. Binding to `0.0.0.0` without a token logs a warning but the server still starts — the endpoint exposes full project write access, so always pass a token on non-localhost binds. + +**The web UI is stricter:** the default (non-MCP) serve mode **hard-errors** on any non-localhost bind without `--authToken` / `CONTENTRAIN_AUTH_TOKEN` and refuses to start (OWASP Secure-by-Default). The UI has no per-request auth today; the token requirement is a start-up gate for exposing it beyond localhost. See the [HTTP Transport guide](/guides/http-transport) for deployment patterns. diff --git a/docs/index.md b/docs/index.md index b9bfdfb..e82be01 100644 --- a/docs/index.md +++ b/docs/index.md @@ -194,5 +194,5 @@ Agent decides what to extract → MCP validates and writes → Human reviews → No AI markup in your code. No proprietary syntax. No vendor lock-in. If you stop using Contentrain, your content files are still plain JSON in your Git repo. ::: info Contentrain Studio -[Contentrain Studio](/studio) is the open-core team web layer for Contentrain: chat-first operations, role-based collaboration, branch review, media management, and CDN delivery on top of the same Git-native content model. Teams can self-host the AGPL core or use a managed Pro/Enterprise offering. +[Contentrain Studio](/studio) is the open-core team web layer for Contentrain: chat-first operations, role-based collaboration, branch review, media management, and CDN delivery on top of the same Git-native content model. Teams can self-host the AGPL core or use the managed plans (Starter/Pro/Enterprise). ::: diff --git a/docs/packages/cli.md b/docs/packages/cli.md index ad9ec47..8e3e1cf 100644 --- a/docs/packages/cli.md +++ b/docs/packages/cli.md @@ -15,7 +15,7 @@ The `contentrain` CLI is the human-facing companion to `@contentrain/mcp`. While You might wonder: if the AI agent handles everything through MCP, why do you need a CLI? -- **Bootstrapping** — `contentrain init` sets up `.contentrain/`, git hooks, and IDE rules before the agent is even connected +- **Bootstrapping** — `contentrain init` sets up `.contentrain/`, runs `git init` with an initial commit, and installs IDE rules and MCP config before the agent is even connected - **Visibility** — `contentrain status` and `contentrain doctor` give you instant project health without asking an agent - **SDK generation** — `contentrain generate` creates the typed client your application code imports - **Review workflow** — `contentrain diff` and `contentrain serve` let you review agent-created content in a proper UI @@ -102,7 +102,7 @@ contentrain init --root /path # Different project root | `--yes` | Skip prompts, use defaults | | `--root ` | Project root path | -Creates `.contentrain/config.json`, `.contentrain/models/`, `.contentrain/content/`, plus IDE rules and Agent Skills. Runs `git init` if not already a repo. +Creates `.contentrain/config.json`, the `models/`, `content/`, and `meta/` directories, `vocabulary.json`, and `context.json`, appends `.contentrain/.cache/` and `.contentrain/client/` to `.gitignore`, installs IDE rules, Agent Skills, and the MCP config (`.mcp.json` or IDE equivalent). Runs `git init` plus an initial commit if not already a repo. --- @@ -153,7 +153,7 @@ contentrain validate --json # CI-friendly JSON |------|-------------| | `--fix` | Auto-fix and create a `cr/fix/*` review branch | | `--interactive` | Choose which issues to fix interactively | -| `--watch` | Re-run when `.contentrain/` changes (read-only polling mode) | +| `--watch` | Re-run when `.contentrain/` content, models, or `config.json` change (read-only) | | `--model ` | Validate one model instead of all | | `--json` | CI-friendly JSON | @@ -291,7 +291,7 @@ contentrain serve --port 8080 --host 0.0.0.0 contentrain serve --demo # Temporary demo project, no setup required ``` -Serves REST endpoints (`/api/status`, `/api/content`, `/api/branches`, `/api/doctor`, `/api/describe-format`, `/api/preview/merge`, `/api/normalize/*`, `/api/capabilities`, `/api/branches/:name/sync-status`), a WebSocket stream (`meta:changed`, `file-watch:error`, `sync:warning`, `branch:*` events), and the bundled Vue UI. +Serves REST endpoints (`/api/status`, `/api/content`, `/api/branches`, `/api/doctor`, `/api/describe-format`, `/api/preview/merge`, `/api/normalize/*`, `/api/capabilities`, `/api/branches/:name/sync-status`, `/api/tree`), a WebSocket stream (`meta:changed`, `file-watch:error`, `sync:warning`, `branch:*` events), and the bundled Vue UI. #### MCP stdio @@ -313,9 +313,11 @@ contentrain serve --mcpHttp --port 3334 --host 0.0.0.0 --authToken $TOKEN | `--mcpHttp` | `CONTENTRAIN_MCP_HTTP=true` | Enable HTTP MCP at `POST /mcp` | | `--port ` | `CONTENTRAIN_PORT` | Port (default 3333) | | `--host ` | `CONTENTRAIN_HOST` | Bind address (default `localhost`) | -| `--authToken ` | `CONTENTRAIN_AUTH_TOKEN` | Required Bearer token | +| `--authToken ` | `CONTENTRAIN_AUTH_TOKEN` | Bearer token, enforced per-request when set | -**Secure-by-default:** non-localhost binds (`0.0.0.0` or specific IPs) **hard-error** without `--authToken` / `CONTENTRAIN_AUTH_TOKEN`. This is deliberate (OWASP Secure-by-Default) — the HTTP MCP endpoint exposes full project write access. +**Auth:** when a token is supplied, every request must send `Authorization: Bearer `. Binding MCP HTTP to `0.0.0.0` without a token logs a warning but the server still starts — the endpoint exposes full project write access, so always pass a token on non-localhost binds. + +**Web UI is stricter:** the default serve UI **hard-errors** on any non-localhost bind without `--authToken` / `CONTENTRAIN_AUTH_TOKEN` (OWASP Secure-by-Default) — it refuses to start. Note the UI has no per-request auth today; the token requirement is a start-up gate for exposing it beyond localhost. ## Studio Integration @@ -374,7 +376,7 @@ contentrain studio submissions --form contact-form contentrain studio submissions --form contact-form --status pending ``` -Each Studio command accepts `--workspace `, `--project `, and `--json` for scripting. +The monitoring and management commands (`status`, `activity`, `usage`, `branches`, `webhooks`, `submissions`, `cdn-build`, `cdn-init`) accept `--workspace `, `--project `, and `--json` for scripting. The auth commands differ: `login` takes `--url`/`--provider`, `whoami` only `--json`, `logout` none, and `connect` takes `--workspace`/`--json`. --- diff --git a/docs/packages/mcp.md b/docs/packages/mcp.md index c375ea2..4c0438f 100644 --- a/docs/packages/mcp.md +++ b/docs/packages/mcp.md @@ -98,14 +98,14 @@ The MCP server exposes **24 tools** — 19 core + 5 media — organized by funct | `contentrain_describe` | Model deep-dive | Full schema, sample data, field types for any model | | `contentrain_describe_format` | Format reference | File structure, JSON formats, markdown conventions, locale strategies | | `contentrain_doctor` | Health diagnostics | Setup validation, SDK freshness, orphan content, local branch limits, remote `cr/*` count, unused keys, missing translations | -| `contentrain_content_list` | Read content | List and filter content entries with optional relation resolution | +| `contentrain_content_list` | Read content | List entries with `filter`, optional relation resolution (`resolve`), and `limit`/`offset` pagination | ### Write Tools (Git-Backed, Branch-Isolated) | Tool | Purpose | Description | |------|---------|-------------| | `contentrain_init` | Bootstrap project | Creates `.contentrain/` structure, config, and git setup | -| `contentrain_scaffold` | Apply templates | Blog, docs, landing page, or SaaS starter templates | +| `contentrain_scaffold` | Apply templates | Starter templates: `blog`, `landing`, `docs`, `ecommerce`, `saas`, `i18n`, `mobile` | | `contentrain_model_save` | Define schemas | Create or update model definitions with field types and constraints | | `contentrain_model_delete` | Remove models | Delete a model definition and its content | | `contentrain_content_save` | Write content | Save entries for any model kind (collection, singleton, dictionary, document) | @@ -126,6 +126,9 @@ The MCP server exposes **24 tools** — 19 core + 5 media — organized by funct ### Field constraints +Fields draw from a **27-type catalog** — see [Field Types](/reference/field-types) +for the full list and per-type constraint enforcement. + `contentrain_content_save` **validates before it writes**. A `severity: error` issue on any entry in the call means nothing is committed — no branch, nothing to clean up. Fix the values and call again. Warnings pass and come back in the response. @@ -171,6 +174,9 @@ delivery: a collection entry is served only when its status is `published`. - **`contentrain_validate` flags publish-state drift** — drafts sitting beside published entries in one collection — as a notice. It never auto-fixes it: publishing is a content decision, and MCP does not make those. +- **Scheduled publishing lives in meta too.** `contentrain_content_save` accepts + optional `publish_at` / `expire_at` (ISO 8601) per entry; `expire_at` must be + after `publish_at`. ::: tip Non-i18n models A model with `i18n: false` keeps all content in one `data.json`, so it has @@ -212,16 +218,18 @@ MCP is infrastructure, not intelligence. It does not decide what content to writ - **Atomic git transactions** — every write is committed to a branch - **Schema enforcement** — content is validated against model definitions -### 2. Dry-Run First +### 2. Preview Where It Counts -Every write operation supports `dry_run: true`. The pattern is always: +`dry_run` belongs to `contentrain_apply` — the one tool that can modify your source files. The normalize pattern is always: -1. Run with `dry_run: true` to preview changes +1. Run `contentrain_apply` with `dry_run: true` (the default) to preview the plan 2. Review the output 3. Run with `dry_run: false` to commit -::: warning Never Skip Preview -Always call write tools with `dry_run: true` first. This is not optional — it prevents accidental schema changes, content overwrites, and branch pollution. +The other write tools do not take a `dry_run` parameter. They are made safe by different guarantees: every write lands on an isolated `cr/*` branch, `contentrain_content_save` validates before committing (an error means nothing is written), and destructive tools (`content_delete`, `model_delete`, `branch_delete`, `merge`, `bulk delete_entries`) require an explicit `confirm: true`. + +::: warning Never Skip the Apply Preview +Always call `contentrain_apply` with `dry_run: true` first and review the plan. It is the only tool that can touch source code — skipping the preview risks unreviewed source patches. ::: ### 3. Git-Native Workflow @@ -308,7 +316,7 @@ Ask your agent: *"Is my Contentrain setup healthy?"* — triggers `contentrain_d ### Create a Model ```ts -// Agent calls contentrain_model_save with dry_run: true first +// Agent calls contentrain_model_save { "id": "blog-post", "name": "Blog Posts", @@ -318,7 +326,7 @@ Ask your agent: *"Is my Contentrain setup healthy?"* — triggers `contentrain_d "fields": { "title": { "type": "string", "required": true }, "excerpt": { "type": "text" }, - "author": { "type": "relation", "relation": "team-members" }, + "author": { "type": "relation", "model": "team-members" }, "published": { "type": "boolean" } } } @@ -470,10 +478,11 @@ claude mcp add --transport http contentrain \ | Trust Level | Tools | Risk | Notes | |-------------|-------|------|-------| -| **HIGH** (read-only) | `status`, `describe`, `describe_format`, `doctor`, `content_list` | None | Safe to call anytime, no side effects | -| **MEDIUM** (git-isolated writes) | `model_save`, `content_save`, `content_delete`, `model_delete`, `validate`, `scaffold`, `bulk` | Low | Changes isolated to `cr/*` branches, reviewable | -| **LOW** (source modification) | `scan`, `apply` | Medium | Normalize touches source files — always use dry_run first | -| **MEDIUM** (remote push) | `submit`, `merge` | Medium | Pushes branches to remote or merges — requires network access and review | +| **HIGH** (read-only) | `status`, `describe`, `describe_format`, `doctor`, `content_list`, `branch_list`, `scan`, `media_list`, `media_get` | None | Safe to call anytime, no side effects — `scan` reads source but never writes | +| **MEDIUM** (git-isolated writes) | `init`, `scaffold`, `model_save`, `model_delete`, `content_save`, `content_delete`, `validate`, `bulk` | Low | Writes go through git transactions on isolated `cr/*` branches; destructive tools require `confirm: true` | +| **MEDIUM** (branch lifecycle) | `submit`, `merge`, `branch_delete` | Medium | `submit` pushes to the remote (requires network); `merge` and `branch_delete` are local git operations — network is used only for best-effort remote-copy cleanup | +| **MEDIUM** (provider media) | `media_ingest`, `media_update`, `media_delete` | Medium | Provider-side media stack; `media_delete` is destructive and does not rewrite content references | +| **LOW** (source modification) | `apply` | Medium | `mode: "reuse"` patches source files — always run `dry_run: true` first | ::: danger Source Modifications The `contentrain_apply` tool with `mode: "reuse"` modifies your source code files. Always run with `dry_run: true` first, review the patches carefully, and use the review workflow before merging. @@ -507,6 +516,7 @@ await server.connect(transport) Available subpath exports: +- `@contentrain/mcp` (root) — stdio server entrypoint (what the `contentrain-mcp` bin runs) - `@contentrain/mcp/server` — MCP server factory and stdio setup - `@contentrain/mcp/server/http` — HTTP transport server factory - `@contentrain/mcp/core/config` — Config manager @@ -526,6 +536,8 @@ Available subpath exports: - `@contentrain/mcp/git/branch-lifecycle` — Branch health tracking - `@contentrain/mcp/templates` — Scaffold templates - `@contentrain/mcp/tools/annotations` — Tool metadata (TOOL_NAMES, TOOL_ANNOTATIONS) +- `@contentrain/mcp/tools/availability` — Per-tool capability requirements (TOOL_REQUIREMENTS) +- `@contentrain/mcp/testing/conformance` — Provider conformance test harness - `@contentrain/mcp/util/detect` — Framework detection - `@contentrain/mcp/util/fs` — File system utilities - `@contentrain/mcp/providers/local` — LocalProvider implementation diff --git a/docs/packages/rules.md b/docs/packages/rules.md index 17c3b77..9c5bd8e 100644 --- a/docs/packages/rules.md +++ b/docs/packages/rules.md @@ -187,7 +187,7 @@ Works with Claude Code, Cursor, Windsurf, GitHub Copilot, OpenAI Codex, Gemini C ## IDE Integration -`contentrain init` installs a compact essential guardrails file (~86 lines, always-loaded) plus Agent Skills directories (on-demand) for detected IDEs: +`contentrain init` installs a compact essential guardrails file (always-loaded) plus Agent Skills directories (on-demand) for detected IDEs: | IDE | Rules Dir | Skills Dir | Format | |-----|-----------|------------|--------| @@ -206,7 +206,7 @@ Here is a real example of the agent workflow when a user says "Extract the hardc ### 1. Essential Rules Load First -The agent's essential guardrails (~86 lines) are always loaded from `.claude/rules/contentrain-essentials.md` (or equivalent IDE path). These cover MCP tool catalog, mandatory protocols, and security basics. +The agent's essential guardrails are always loaded from `.claude/rules/contentrain-essentials.md` (or equivalent IDE path). These cover MCP tool catalog, mandatory protocols, and security basics. ### 2. Skill Guides the Workflow diff --git a/docs/packages/sdk.md b/docs/packages/sdk.md index 0e77199..9431a57 100644 --- a/docs/packages/sdk.md +++ b/docs/packages/sdk.md @@ -56,7 +56,9 @@ This writes: index.cjs — CJS entry (NestJS, Express, legacy tooling) index.d.ts — Generated TypeScript types from model schemas data/ - {model}.{locale}.mjs — Static data modules per model/locale + {model}.{locale}.mjs — Static data modules per model/locale + {model}--{slug}.{locale}.mjs — Document entries (one module per slug) + {model}.mjs — Non-i18n models (no locale suffix) ``` It also updates your `package.json` with subpath imports: @@ -69,6 +71,12 @@ It also updates your `package.json` with subpath imports: "import": "./.contentrain/client/index.mjs", "require": "./.contentrain/client/index.cjs", "default": "./.contentrain/client/index.mjs" + }, + "#contentrain/*": { + "types": "./.contentrain/client/*.d.ts", + "import": "./.contentrain/client/*.mjs", + "require": "./.contentrain/client/*.cjs", + "default": "./.contentrain/client/*.mjs" } } } @@ -234,6 +242,7 @@ const latest = document('blog-article') | `locale` | `locale(lang: string)` | `this` | Set the content locale | | `where` | `where(field, value)` | `this` | Equality filter (shorthand) | | `where` | `where(field, op, value)` | `this` | Operator filter (same operators as QueryBuilder) | +| `sort` | `sort(field, order?)` | `this` | Sort by frontmatter field (`asc` default) | | `include` | `include(...fields)` | `this` | Resolve relation fields | | `bySlug` | `bySlug(slug)` | `T \| undefined` | Find document by slug | | `count` | `count()` | `number` | Return count of matching documents | @@ -349,7 +358,8 @@ For all bundler setups, also add a `paths` entry to `tsconfig.json` so the TypeS { "compilerOptions": { "paths": { - "#contentrain": ["./.contentrain/client/index.d.ts"] + "#contentrain": ["./.contentrain/client/index.d.ts"], + "#contentrain/*": ["./.contentrain/client/*.d.ts"] } } } diff --git a/docs/packages/types.md b/docs/packages/types.md index 5132920..37c2692 100644 --- a/docs/packages/types.md +++ b/docs/packages/types.md @@ -92,7 +92,7 @@ const result: ValidationResult = { | `ContentStatus` | `draft`, `in_review`, `published`, `rejected`, `archived` | | | `ContentSource` | `agent`, `human`, `import` | | | `WorkflowMode` | `auto-merge`, `review` | [Configuration](/reference/config) | -| `StackType` | `nuxt`, `next`, `astro`, `sveltekit`, `remix`, + 20 more | [Configuration](/reference/config) | +| `StackType` | `nuxt`, `next`, `astro`, `sveltekit`, `remix`, + 25 more | [Configuration](/reference/config) | | `Platform` | `web`, `mobile`, `api`, `desktop`, `static`, `other` | | | `ContextSource` | `mcp-local`, `mcp-studio`, `studio-ui` | | | `CollectionRuntimeFormat` | `map`, `array` | | @@ -109,7 +109,7 @@ const result: ValidationResult = { | `Vocabulary` | Shared terms for content consistency | | `EntryMeta` | Per-entry metadata (status, source, timestamps) | | `AssetEntry` | Asset registry entry (path, type, size, alt) | -| `ValidationError` | Structured validation error with severity and context | +| `ValidationError` | Structured validation issue — `severity` is `error`, `warning`, or `notice` (notices flag drift like drafts beside published entries) | | `ValidationResult` | Validation outcome (valid flag + error list) | | `ContextJson` | Last operation context written by MCP | | `ModelSummary` | Lightweight model info for listing operations | @@ -146,7 +146,7 @@ Media facet types (implemented by providers exposing a media stack — drives th Pre-built capability set: -- `LOCAL_CAPABILITIES` — Full capability set for LocalProvider (all seven capabilities enabled). Exported from `@contentrain/types` for custom providers that back onto the local filesystem. +- `LOCAL_CAPABILITIES` — Capability set for LocalProvider: `localWorktree`, `sourceRead`, `sourceWrite`, `pushRemote`, and `astScan` enabled; `branchProtection` and `pullRequestFallback` are `false` (a local worktree has no remote protection or PR flow). Exported from `@contentrain/types` for custom providers that back onto the local filesystem. See [RepoProvider Reference](/reference/providers) for the complete interface definitions and a minimum-viable provider recipe. @@ -195,10 +195,14 @@ Used by the normalize flow (scan, extract, reuse): | `ScanSummaryResult` | High-level scan summary (directory breakdown, top repeated) | | `StringContext` | Where a string appears (`jsx_text`, `template_attribute`, ...) | | `FileCategory` | File classification (`page`, `component`, `layout`, `other`) | +| `NormalizePlan` | Normalize plan exchanged between scan and apply | +| `NormalizePlanModel` | Model proposal inside a normalize plan | +| `NormalizePlanExtraction` | One extraction target (content entry to create) | +| `NormalizePlanPatch` | One source patch inside a normalize plan | ### Runtime Constants -These are the only non-type exports — used at runtime for path resolution and validation: +Beyond types, the package ships a small runtime surface: constants plus pure, dependency-free validate/serialize functions (browser-compatible — Studio shares the same validation contract through them). Constants first: ```ts import { @@ -221,6 +225,34 @@ import { | `ENTRY_ID_PATTERN` | RegExp | Validates entry IDs | | `LOCALE_PATTERN` | RegExp | Validates ISO locale codes | | `CANONICAL_JSON` | Object | Deterministic serialization rules | +| `SECRET_PATTERNS` | `ReadonlyArray` | Patterns behind `detectSecrets` — extend for custom secret detection | + +### Runtime Functions + +Validate functions (pure, dependency-free): + +| Function | Purpose | +|----------|---------| +| `validateSlug(slug)` | Kebab-case slug validation | +| `validateEntryId(id)` | Entry ID format validation | +| `validateLocale(locale, config)` | Locale format + config support check | +| `detectSecrets(value)` | Detect potential secrets in field values | +| `validateFieldValue(value, fieldDef)` | Full field schema validation (type, required, min/max, pattern, select) | +| `validateSemanticType(value, type)` | Semantic checks for typed values (integer, date, email, url, ...) | +| `validateAccept(value, accept)` | Extension-based `accept` constraint check for media paths | +| `isMediaType(type)` | Whether a field type is media-backed | + +Serialize functions (pure, dependency-free): + +| Function | Purpose | +|----------|---------| +| `sortKeys(obj, fieldOrder?)` | Recursive key sorting for canonical output | +| `canonicalStringify(data, fieldOrder?)` | Deterministic JSON serialization | +| `generateEntryId()` | 12-char hex entry ID generation | +| `parseMarkdownFrontmatter(content)` | Parse YAML frontmatter + body from markdown | +| `serializeMarkdownFrontmatter(data, body)` | Serialize data + body into markdown frontmatter | + +Unique constraints and relation references need external state (all entries / target existence), so they stay in MCP's validator — `validateFieldValue` covers everything schema-level. ### Git Transaction Types diff --git a/docs/public/og-image.png b/docs/public/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..d7f04e5b20abebf6fbc09bcd72409a026f03ac1b GIT binary patch literal 151738 zcmeFZbyQ?ck_QSj?(XhR;VzB4OX2SBg-hewH13T< zWEOJLzp=R43X%gAlu5-LUCc?jm;uZHav^w9Qc?jIGYdXdamjzcKkfv{t=!z4_*hsx zJw2H{*_j<(ELm82d3jj?Y%FYSOdlLfu3ipq#vmpKSBk$2`7b%*=B}nL)=qBLjt-=M z$u%}{baxXZC;zLV|Ni{FpKjI`|7^*@^&i9f7$D1EH7u;m0G9s*GY47!zrg;g`8(`y zaYItDO-cg?X<z_tZaV`?4Qtosrq-Qn4_Je zi<*IuQyqwE}lfr)_0h<{cG zfuFR)B@y*!?-9r`dsg~Qbp!$_@laDnLXx&FYkJhCsqtuY0DwF-y zbRBXhi5ZCdsllPLkUmtul_%!F>h$pQ)=B<9nd{2_jyvI{D;M`uLySHXg2hu{0gV z5LMN_bCDWvIl6>T@D$&*@i2T~XCiuM#O=mWRYwzgFe%D5W~o7_^FRWlSPfi6;bbtj zYDy7^e@{+-AZd+=c-eDU&EXg?Fb;#F3zZk>jV-!*js#&fls?yaQ{-;cegcvjoHh+L zHa5!FmhKJK3Q5@1>ESy^DO z5p&qXqMHyvR;a}Q_KUwIqm1mf#qNt7SN0D6M*R=M0TLe;%^-&wvm@pNPnR9bp;o^^ zGX8U@THZN^)Z9sj-LxN1Jpj&%D)Rej(jC9CH+&wR$5VLD8Gj*c3#QW~o5#|DJTy=-&f5t)o-$2v8st6wb$IYunU*gVZpo{OS9C4I6JKX9LRsnb}h* zLv9|htPH%e4?KwNQf7?aH9A|C&WgvhTg{pOOKKowu>d$cQ0)zyG*Aq!RQzq%Ny(j0 z6UDb)-8*0=uV*_=v4o$`h1XpL6^0?7wu31VZrst@+8Xz;&BbeG09aZQ!x0S)zx|TX z<3#eGrb8eqW(^4EYgZ{G_5)iAcfaZhGQ_1EWV94g)TfK&IlRFi2!_=jg>@qI?X$3t z$tF|pn0K)^6%vv^q>8@ct6^4)<5t1L!><1OGx+gHZi+xqxc@*w?A@RQP{DC|0`yY#S?%fHW`t!8u$Zy-;rTzE3a@>9e4ay90yrc+9{f36|35VFm8~&fjnVDps5B@H zS)INNS{_U28{rY%M(3X0k>6EX7;HrY~`Tagp^KQtoO zeUdUyrvqVcswE25P5tKbs;seq4fy(vX9!*EFk1EJah zhUPP6y1e9`OUtJiBMY)s3w?Ud4Do!H^)LDD?Q3RrOR#?U*DD)u9_Md@yW<}3#Hud> z=n$q}-tm+|VU_Fg=fgCCO*x}09xb|kP{G;J?{3_Y2;BgUu66I z^yD2*RPL`}QC#U(|MDD)fb({G|MnCh5NOL47$5yWh&LpTDK@7Pq&iTh190y(<4DZGlE z@&i217YLZ@`^i3N#E$Oo@})rR+Ujj9j1WnY$U2#6KWD-{Qc&3NO#7}&)gQcSMqe~d zdV^XZX3?F8%FiBb`UYb<5>8Hme_hO-Vjwjub<8E;;if)!yxy%$Ukk*3RvUC*$zES~ z;7%-Syqp?WI--S7CTg4K6UjswH>7A@=ik-Fnrh| zLv5PVyK|`8iF$uAe6xL0a&!Q3=_jlzQ#ocxddy4d zHoNYv04iBn46<0{uAW&0tT;@G!jj9fD>=gGd*^@~vC&{oT}S8Fr(3c!?I`VD2YP?1pk->n%{uVbUSKbPP7{gB zgUCWXKIQD}jFYFa?djdhc%Us{?Bc7fxX<&IVD<18%#RHmmi2pVJ@?J2&c0d|wNdE1 zpyr2<{m%Ce*u}Rls#LvvgMfC}Jo<}_jGh>}^q31W-hLH`PfLdYMEt4ZiTt^g0YmuH z)(~YCQ8+16Mzw;aNa}ictYt5&QVE{8JcW9aQ_@0oG@V4?*b1`)riAJ*V?vk&Hu~Th z#F$WmQsPM|C&aaA=>cW&Lfvmw-z4py;sQ<7n% z$z7WOw<^@jV?i|tNk&*ox{zKJh7_Y9XIO?bGJuJQ4?jN-s_I|di*imgwQhJIfS-Fd(nia9_7A^^4AM81HPxnnuB$d_Zo znb{vEFHi{^b=WlOE?@6weRRwo4gthc=ui zN*YVP+04)^*rCu1C(4xj*Vji`i4#RiQGSiS6t#Mn-QhgKZ5(cNTyi5v9tX9Mu1_ce z-z~>7c0W5iE_bw-uxCqqrbO*wE}&iSDCbc6CVQCb${0sbRux{5fA&+yB8dX|U|t-R zi4?%9uq3O{X?z#^oP-LZi-cd-qPjs9W$*`H!fRlM;HYy=%GJn)LZ6$dJEQj4DTGy* ziYil)74~$Z+Fn>wp*?f;b$Zm1fZmMe4R=aj99MtA)z5$&Z5Mi zgCt?JgI_#|r~|)+yInzClYB85HsqPF970qP0~5}CN67Q11knsq^4SqJuTSo`JX-pz z3ANf0SMjHEWYNb+^xg$j=d+rsh`RY~!=C@aH?#{4>S=t;Cbx}@sL zQpv@;;2#D+<4&Uu8{RnM|90S$(_bx>u^b*PnzUKfnZi9XUZBpg9^c4hOtV^p__5 ztwEi#UuH)*zQwc0k8c~r0vu*j&6CMZZ=#{Q!QP@t9J6+z(A93} zs)GrYTw#u};N8`qMi*a%i!Oamv2Qw7sPjJ8furo8-h@a0k#uKav zlh%X|=xjoE@uCXK_+d3J6D(ut?%aO5%&+zDxACPs?r48 z5F@CaJ?#(D!v%XOSVrhj2a~+dvrV11b1GUnqgqt3yIPIB)f#%usp)82jgS`WjHspX zQ)#Q$GDiv8>7cdB_dQ&i9OK~cLsRfd^w4slH}CGOmIm z3Lr!gzmpjTGh&j0jTR${Gid~ghGPFnwkMqczDnzUp{9iJnG~1TGY ztW7E%7|pu>sx$wb9fCknfb7PVmJ$m7#5CAQ#&4B6QuyjQn>H!+b3lp9OGSOC&tnZ+J-Zq%#$nF9j4UlYif^`~S)d6=CDWbC(Rt?g6L60M1F@>`2?#J$ z$TF~L{ZxCV5Gc@CF7*SD=?l2pK4;Ju$x;~jwqBqgcc15wB0eieirAsGCQ*29$2K4Y z_kv}l;j)$~g7<;Jo&*@9+W@4==+mh7_(0ak4tLq+8>*V9wE=e$P5Z7+!bhaAs<_47 ztfP|RX{CJAo9gDi1S6a0-47=tn4Bw{VJsjxl-Ge8-)9Cf{ptA*>XinXAhTm?(N$|k5wq+MzH z8fpM^OklF&oa&HJV&ahO<96~vm;5ypIuRtXurU>nEgd_anC!-DyOpxpRHGk>NpY3as zBD>6b1EfUwnROQoh}CpQp9%6CW$H#)b)L*0psl?j)uFi{R$RpKiBZvx{Q^2(J{xBAOeCDYnwK2cjjf08NH8mO5M+c4t&diEW#y)| zL10yAddF_TwTO%-sdnODs(&y~8tSnKt)?!j{tX1Rog4>>iLRlBXT5CqCLAQaU3nwO z?*|h!(4OOJ3G26xp=17y3dug2@AS16bzxPPGcFCQ%-71tBdVPf*zXkI-HJzMETMav z76VevK2dMXCDV=Eb}pk~{EIeh!tpPPq2_~zzliZ!jMpk7 zN+D`AmR$aPs_27zrc(Z~wiB$u+b7NL1;CSkFOPLq%*lSy4y* zK6a+Ax4@2sRAmlzOh>~i;P>I1n0!ECOb2jIe%=ii(s3`3@`*s_9GMJz!=R*c+Z1(l zq}qMPbsczUSp(Qo(kAx+vd2%%CucEN=rSD)H;e?c!^W_ON0Hq6FHLZ`EYe6L@(5O{ zztHb}7yjDw3dJhNvBeTvR$~9Pb~ynV(KOBaA!p##0tp(w;*|Jj1A&PRa(@eveP~lc zjIe}C&5-l-IfZ`9?Qtu7xn?bjGShdumkBh%KD9J8eG8)Guf7jkmTWntqk&ULbaCJ0 zRCx6dS`1)x)|oU%13@)Jj-aGBSokxGt%@HJRb5Ua-zcPDaLev`*4Y%pi zp~&mp&RZ}Yb8pK3e37YS=-SWnwi58nl8Mb?;QJkG0eot1W8z2pQ@)()ZrD%DD1Wg( zVKQ!)$`q2?>bVLBO5;+4P8}YriZ^$BQ(Jaw%hnBIvZ&CWJ#4-(^|c#$3-!CvteTi}#O+%DUHmXm9Qfi6B z8pV(sjpKzwgpS5+)Inc1cY{9TJoj?7l?O!3z6~(oief=B7D9BN7yu6L zaQVgU1`nK9{lgE;dr`8rkWBAU&Ik}K`)_Ro=B%7yAu^C$n~_vAHI{!&IK2&R9KTXLLD(2O zbqG64(iB9S?YQ{04cT%I9wIK~#fkRTcN`rl6a)UuAbX6QRg}D=^Bz~N5UX!r_Vaze zzxtNd*EucddoIx#_!4^s#HNGA(0#k`gleMe=U6Q?XDvlym9tXk$=!0DmLf$w$8WYjvBBm=}{ z2kCp`Vr0VP*@eIP2^Yb!%iV*}cm2A8mKHvmhV4q$j1R+6Y$$})eDA0f8*5kMz| zfb;`7X8I)XYXcV1t`;Et&Af>`=Lq51qW~h)EqLP(i~C-UCTxX{`Rv4csMNYDa}i-R zR--V&;nh&tCfq05ZIXhjRi zRE3wqhqKvGi+CO`0SsPN{Mm@%g8&*>4}p4V1+8=KJYe5Ic|^%B!Z0j%{EoMKhVNnJ zMo;5`*yt9_SW2<&vP-1a>O-nkZ0u1Rb4yDb>*^YiDb-YzdR;`!tOJ*qBNSmbu1p}K zey1@E>0bJ9;WS$q(c@{!>&eV&jrQvB+$K8}d$>V#`fo18QqkxY3i|O9A1N7U^ohc1 z%o}dOJiO{rRkQ`mo?sQdFqH`~mTNLk>_D-KE|}cd%7;=Mj@EC055I=4Hl7nPcZxyG z-vhF*GW*|7SqRD7!Vj|!c@)KRRh$C?5Gf9sJSd}AP=itp{g>A2tx4DZM9T*#XGKT8 z$q}+RPv(B%Cb<5L+aKT4-ji77do(7eWngof?S*p9OdiCFUehy&LEz1n zMmULFqF%DI)}V}Ui7a581)pHU^#k#E1^JF03n=N;y4B%M6Ou@r_OR1>_NC@44q1xM zSEr6B^T-o(d(JOIAoGU}{$RQZw9#t7#OMArDXr`!!2!ZqNx-q>g2SXC=`2ui!U5*k zX|mAC&PuXr$r1`m#mSH#al{xgC%%a5u8-A?@C#vDW%Ir-f1 z)98Q+Jh6R~KZU=LI^Q;P3f^!$qun2)FY%hWyQ9=KQro|7Ic@OFmE}$MlJfb|tYCRa zoa7d_=1^1R0;f|`2CDTjM5)8gYiP^HomF#9t}ojQV$@1CTat3k%rgBsBU z90cU)z#cqjhy_Kf0PjOV@o-<2v^ww+6nG$d_+2o~o#dbqkHCTEV zdSF$^I{cWR`Q%yTvP*>q#eyvwF!FRefjEh`p0_2|<&7Wp`x9!-+ubA?RLWg;2PV7n z8#abn2Nbw1Btk`Rf7cEL8tCb;B->XgSK+s~4{c9q4J0p2_HHz*O()p(!AOk;@KbbX zu3Wk|SL({VnCo@|tqTbpA_dsiQIGJ6eDAkTeMxV+6Bp*-4k!Gh=*05;WcOei`COM5 zPb2Ufe?5AKFOane?91N1TX!Z;G9>fDgR?9pw26nL^mk#AF6_kp*>ll|9Fn!I1dX~< zKNWJBf3}N4?Pj~rQ(N=%r1pA*?&h%Wl}Lmnud{~P3q54?-iaTsg-4cH0}n1=@im?( z1wI#~gZt>T7Rt^0ON~XGJ1LPSIz1nEXZ^qwoeTyXJ;7BIO49Kl-I3`OZ6+;pt7Huv zcqe{4)Rf0cCx%XzIIx=t1t)!3hvauMZHIn6Mwyh!mBsu*G~wIE#G*MxGW?K2X%)kC7Zzh53edEZoXAb%FI76tEixW1bU3#G08xe~O<^|uG8<9VNl>5AzTti>@ zdEieg2J-lnF+LwmZkJ$#%w~>{frsVzYFL@|dgZ~_)tH2lnXN1q7@7dvEz?Uf#3-Tg zITPWwD_NmcQ>JdW;%gbijCZ>jY~UA&6t)0O!o|x~V0E{XDK#mX#bbYtNv1q6iB$MA zI;c)B=;N?iaN`~G_})e+9-k!ZN8&8Im6p!7nM7{%=c;wfxT$j%k8)NuO;aDDJT-o2 zi5Kgwa??%buII`|kTKFAJTu=j^iz2%&l~Ir+X>?jQhE;eusQ>rsf^vU9m#GZ*)?8_ zRPB0AO}G}{Smm|TV-4OW=|)Q~hE^+)U$f^p`cqNX6f~wTTP9ST#loSMJ;O){L8Zj< zVlUas>yEX1gL0tAd*{kIq}fcp zTyS1}x^iD&V*2@$@8@=K;O)m6gqtE5;MdF!!&Ec6VS+yz5Eytny47?2Fon^)pW{P1 zKb{p^`@*ofaw<7m&Px#IIr+#{-fMEB{A)-z98ID%3GmmuHPo8%C5F1x2K6WtG&{p8 zN&O3%i0e}JO&{sB``WuT1c0L#-doffqydaK86 z03*C;#YeDZ#kdak9@Py@4uIYlTn&=jHEI)%f!F|)1q&>%D3VL1c4@gHmlx|K#Qv4r zBPfJ`y>p(obj47?bUmr-*nUA~i5H7;fgc+Np&5%k3QRPAg|gr1INpi#5JKrJ0O%#vlX(6h(mrSHz>ZT^Y~Dv>a_=l)`W=Pd_ege65A7x zrE>VXW?;jdEvjmeJjl{?mhIDqG{Mx+<0tGy5b)pv>AK{^$94g^5>x9u-QtOcD(JdZ zo^7)GP&HW?{P0$?Y*oUl4_XqErKfu0byxMJXUx*vW14%ukkQ}b2o=&O`&(a>!-$df zEfh~iD{i9(|72c(p2SmXndH5D#j@V58YqGm6aje@*Y)v!P>j81^pY1q+zkC%9SzXH zUW0g?F;fkAe>$$-2=hC@cFK(Th}@WSF4K7z*$uj~?s0xYC`L5E>5XHH%BR^9za^ ziTcB(gQB?hZ2Dt&b-d@`cqI3eZBjt|{ucQIq&ExplyFF%_t7}N-6=Jvq*rEW+T1>PClnw0=Yh`Gx|7QIRX{SO6Cmi?fnmINn|P$AR0>COO*pc% za-ft%G7i+{n%a37Nkdtwh&(VLm>AK8;(y_mPqtJC$t>0pq_KQ~nC6aJedY)|Biwm6 zZu?B5qM43`&O;gWeD-{(r*vHI{Jw$gOo0`;7ruNQ(Bc2OT!~qW99hMTf?Qdkmuj8+ zGqQ1H=k7jrU*qL!p)vwC2EzSO(PP27aBHt&no7t?N> z-54r?-WZl32FGR>Io_}3#(uZlwE#z-;TC+&NJFgzotXX5^Onp0u|=D#uI(y!14qwy z^a|pKebg$4ewRa;2u-CP$@^AW-un(vK<_!7!5oN;%`2Sh;^lQH)*;DDKK@ zU8hw3P6eZRCr(!gcDqN(IQ?1w25NX&!&5@#Vo4%;+*+o|wD?Yt+7ZnYnf9m}zLWChwQVe)*TcTDsOqgx~_YV@4 zCwM6uDD`#p+39R|GGr)8nsvTpJ1oEey}j+l0_9$%()ivetPuy8vvhs2*6Lp>gRs@1 z8msmsAriy7goW>biMjIY!4~_RxIC|5^IG=~BW5`zBOx+seWSls(19&i!TINz;R=Os z#A_UbzYos#_O@ww2zF?L<`1kfYi#O`BxO^GoUI*mYk|C1wxuWLTDNKxyLIXy#csT zOl4&ld`;GNy_gVyUa{QP16sC_DXaCZDo|6huv&L4OeWWqng@>t0coJK?DJ_7<;rB7 z8TJlHgJzZnZOXCu{AORnIsE0zPIb(qqkjFh0wnQRM+jU3I6@eR`&HNYa_C{Lo~cv& znvN(_GXErbZ>4}}1|(vbr#5jx)aJwDOb>>VE7Xv++W)9mV-xwDknbdQWna!e0^<(F)5)h{INIWCxTcsvNR#7y0~D z*-_ky5F#2e!3}%#?I2+gzXQV5%`XWplgtVGI(-DjwX9afE}2~m_mO8+6WzmaR96gM zUkjsgD;y7g0_>FXLg?#DcAjI6$BRBf&7v_)hd3G`-w2M`AMWS8S5?gF1*emur-4DR zyppy&22Z5E*Xl)O5N`P~V?S+hM*Jz>9T{V{otI{;9gl@PN)06X{kAkgoJjP|T#C(`05Dbyu`>gfcFyMrilVr+p`)C#kSbOnYubKt6NJAYJqk?M-ltU^_YwBuSM3z@-} zs}sR@gIH59IBs~AqHB+FN$eO9H4rTk7#uNc7%vXJV>O?ATKsxJ6bBbh{sc*l&Wzy< z25$SEpDp=Yq^uXl4m3G*C2$D2P)IU@t^N2G*|#HM|%Z3YfaCuOqGM@XX( zI@?Q$ud?@E|G7mo`br_awZ+~fWTDrc)L#3wBSHsB`c=B@k$J+gpYwhFGz^d9PTs_> z3VNwMM7dVAqSdKERUr?GW|-r5ebijYblsT=-{OI^b)7(*M^rk^>4jwD))E3>&!K|RG--D%s!F@SIvI(Ryc$k_T> z1bE1l26$H~x|v#u+qm+_9MoNt_17}Aenu`FiPE083HBcY+p^+{0P-?|F2q}ak6Fi* z%%VY+;ydS9eG*gmR)JSp8B|7<)m%qCC9LKbvU&MGBYO?;4`0mIj^gyjs59Uwg5W4f z6^gps@}9qt^uX7u!SC~FL02=Kv2Ex#Wz0ulgk_^C(SqChHF)1nD18ZUV&*VnwX%7W zaEx83Wf#g@#PjmQ=rWyotVmc12$R|)=+S7(_CA_MNuc8K+1H%-Ya{siu=|NVVFZf1 zoBTkp6pyMI+wgU(xH$Eg^spgK9H`q+$eu1MN@FqcjapEb24ARnEv#S1(t`i6#kF1B zvMw>}&}+y#;ZA200#Hz&*mHC(Bfv6Dl$3OLAUmgI+wI;(T`A1?f@ELw6j|WHhU|LC zb8;LpEa;$omSWt}+L`6^-uu0|LAdJ1KC0)fDN}Z41F%&!mMm*relGR6)@s?q;Y(Bk zc53VencMmPdft@dI_`zib7h|}d-Nnvew|3hP$38ff~;kwg`1@gLi)wAlDMZxp@F~s zII`^Q|M22RhwLT@~UbM1YY)F-?gFP@+z4rV4mg)WS*Y<-!Xl+8*A9ADYU+)itC>0+1`!fff zl}>BZ?5KVuc^A4HyYk@W$ivk@L>v>DgXGfspU#-VhRl(0LX=QcPtG)6kMT&&jlfK@Dw5@0+O0FC=@}- z`@G##=obpHj;2JyFR!V5gay*ptXP#nb4Bp-0R$9(-+I_l_qb!mU|)z^aUrJ}h1_N3 zouR6tKYxo@7b4;2RovTAG}-eSDo&hmVna|=v`{*}VWW9e%x8xS&`fYamu~7~2k(aO zZKyHBUGOCxuxa~pxl&rR^DqXXhS6XRM9uu36uYD6O8&mJDm#-uL;r~&x<80pxb&v8 zftm5PJ!|Lyry;IU^!Lx$^Gk)*=Dqqxa^2RuB~M}JJ1?cK>Ln;;wCd>C7ZT|$f`(+- z;xNd#xGoVN>#&%y$_u~b0TXnksG5gOekHTR`=bM=s|p#(&81w>@pucxQ%7We5iVp~ z8F2KKP}|q$n|b0=`X9&~&^8>)*KIbYT|8sVPQ<~}iB+fGvHH>6KfB{6u_!_2BPpT6 zuZKz`C=kvBPvAI*&F^Mzzc*Dw=9_oK9v%io!H*x+3m^<+_V529w|lHtq9* zX*NSL_RdZ77MIc$?^+dh0k?3SwXb%qsLHKfE(D%H{R$G@D%k zSSErwR+Z8g)s|4~9F;_dbP1TtwwnHTvyG)*snUpcR&=+OxrRqRe$KV$4gJQvoy?i; zIV94&nSFPs^HB#NY7pbBEptpmkN3k?c&=N>JJzHQZAbuTO{HnShO0zBBoP$&t|U$` z%eFNrJ*hUP&yS_*Y|#UA>H-rztq`&>l75eF_fM|4#>%er{`{_I=le+p$vBI`G$Olh z;#U#oR9ox;?I12wT7?%;F|oSaK=bml-<)7G%`x%cDF~T%Z z>*^DoS7-II51V;r*gVapu3z{k>~gNtGfBJrKKoq15nVM3B->;%_dy(6B6#h2&_b|V zjDiTZ=Mb=2+YST zP=T#FcX()Tu+dQWa%lP)4DLpxUkKo4VZizQ08xJqalbz_M~+Gjvv#)MOv_n^8j|!6 zs?Wm)?T)0TUXlua*)Jo|?^Lo`o7AC@F=dMj{s_@72=r)E4BCxwN!E)fI$tgT(9@p^ ztl}j(CGIY#xUR$fYK5ItpnHyC<_ELyjs4^O}V5%ZD z$hMlYsgD7&jxgKc%CrvW-SMNRr(EM_?ys^|-WIk_*k$>>Rt|;DbnJrc4HYdAM#R-H z_^N{^uB>=!N%nfdOW&a9d!T@ToNpr=2IkuN5}&`7m=x_B6>Tb2>zD&AiO)qhZ{wo6nmS+YD@L~TFf)0uMnGS1 zK=bi5O=9Q(bR_Hg+wixOYlru+bN)Y%0z6Bwi%W7rm+SpRwUP|339#2R+RmV#yRJX} zgsZ{YHWyZZcsx5j7rLzD_M1a}x0Ld?EB0@?(GU<>zT*wqHL|Vz4r6GS-NhThq)H}#xGF=aOMRl1QqgO4>_!b>x5(0vr)I|!Vfgh} zxY$M4pO~tTy=eNZ@;8(pd5mV#aQ|<)W+JS44i1~~&o$gqAAFR`IFN;HsMm3ppJUG9 zBrZaL6uk6?I8cM)#EuY7t2zApT<)FUj=W>;eXkOlpx=!n zeG;;z;Pr;{1_94VSwcK9`B()Dn|WsjH0qyxgG(!%%*rMr&u!fL6?lX2kf{CZHtD6( z4yx1(TSMp~)@8AUw;0)ahG|sty()RjJgwWj8*UFjb2If`DE_F9Q(MOyeA=j~m_JQW zwyZK}UykZN;hr<5Q|tP%CCcE)%pH}K6+U--A;~#$WY*FYmgtlJt(X8GAHQ~Za!Hia zFwuec`iI+d|LNg;^mOD&Fl0!s@jXaTMvG#LW0HmFkjfI|J#ahh$m4GDKEF}F=P4vy zzWTm5M7JxXL)+{KSKH5Au6LeJ1lPrS+IqJD4rf*tLW?q5su;GJb_H*DsV0O{{Q zH`Pe-Hq-&})|%y$y7>yLA9c0m=TTlgm*jaQ+AAygG^_H{vFv#_Kl9D-LuILVWLrKz zz$5KLjM|w=LMvB@=auRawXm&eaU`o2s*|B%KbddfJtF-|(tTPIXLf4DDp0kof$f<; znwwS(-{g{kt^WF@~T?(Cin!@2}RfU^=_*fp1M?8W19ms0JLy3BKBX|#18DU=M ztdjZ$&3hSo{@*MgrR(;o6USy45?sr251NIR-0r4}m-LAa8(m{v@V|)__e$Ygj)ga= zkt8efl@%Ao9edKV@cPKSHxBAVw^vWdjAS3oaaEk2pEsH8CprE>WRX|byex=+JEBVa zY8bu`&+t{1D-*u*PbB#TPyzLWC-I|`N+Xpy_4tpdiKFY z(u#N)oBoJ;q9P5pwY5dhgAIPjAvNMd3G30h^`McpGY@K&qB#JrAher44(oXZRvT3o zdO1RsG0UH#m#7L;w}{z3VfO^P41SHktjK35w!JkGh;Y<02XUrrmClKGR!mCk;Nreb zQJg1xJ8l*{+7V(|4|e@YaVC$QXhAb; zoTw*@(aLmh;|492|7P2(M~^gVNa%cE(hnuvIhuyU&`*^pN%C!#s@`h2`%QYF%ojDn z+vKPIz13fH(b@}Vp?U#^dY%Kw7x6pYzH1g+;W<}P|(VY@K8zotGMYs!!&ICz?B{lmtC+@i>-;yheoWnQdmSEuH z%pMm=QkI@@#W!UXuz^4*uun)-)hcQh9M2M@!8V^eW)I*y8bqBO`oZm}mACBSi_u-4 z(3ODZWVRSWw)8D!TZ8e;Op7FgJTqb6^Ok#Lr?ph(zy1rLqc27zB^3`V2i)gJ;-;)= zoXQWPwT;XX#YC~D5ez)JcnVDEDENo-T!_uOx9#Jg})R^hFAWRHSOx&Z5 z$wh_;@Km6=T@-19}PrOlM$n=Bdvs$SDi{tD>Y$q0)Axk^^{K?z0&-t%UMdU<*I z=VO~rmD@JL;r#WuLwbOg+OJaqtun~H5Q$R5;xmhKXMUTH^Vd;vi$1ac7{TJz@6+8E z{;Kn)_nOYmXTeFl_>7J!GMdDp(yt7iSOZfg1q}^d+maCOQbv#TdDo6V(p4GoV7431 ztoe(5UzI&We?#V?LKw)Y$^5y>482o~3yvb{+x*zbDTp92)ePHFA>Z8(TSKiM7OI%mfw@pXh zf;e7h0GMF`-HlG9D^$PY3N<(lOv1gCIzu$aa&<2=hok3!U!o5HU54-DZQ6b#%MwFX zeEB*%j;!QEH*sG$io;cD*y$hje3YI_iy4(FLvvf?wgN?BEBGjvu0FD4T_hlnx2iTY ztGJXMk%Xw(TXKMa{opr00ZX4rQc z$*j;BhJqUEWn>u)6s!gJM3f)w&(na-{^9N)zfl=$akU_KeX<8e?6RlJTk=E5Tg!bM z98D>b9!rCHTlhHK)_Hn}`t%!=L^Pt7c(CgV0PrSstqCR_u(q9xX+8L)q`E?-(s_+} z`cO;sIp&pkwxrtf5O6WFU}wmLWOL(K44OcOT$v^&!?$|ZZiST=K zZSYH}mUEZ2p7fP;vgzz*>+`8rDzsWG8Y^QtPF6L}yw+)&vvP)?nRgdDyf-v9Ha68_ zdXHn8OjIs?Sg8aO4zcLG@i>C#rN)myE-qxzf}R;im0l&wx$%pcF_FOJCU9Qz%nDW@ z?6J9o1;vcbux6axIcDzaoq!{SV`8(t-t#d+`sLE4t5Q9pa(da3x2RbCIiAW}AX?3b zP^4`;wpO=l+DvSPtVS#ld5KZZx4bC+O2+LwW9f=5e5cfE!R<{~raLyWCyt{`TU(A= z$X+h>^M!?0qh+;r`dXL_t8BSkj+3D~DMww#fLUD^O= zj!rFCY-7mRaS37>X`O+HwZdSjGyv z9C@$7B4U!pK)_EYlW5vcgFWSTWs>xNH3nu3LIRe+z4waHDBWxO#;5|?n=5&CHhF8* zG=U(FeXP_o*#sQx3*ZhEZ9eJ!sr04yUY;H&x4ivgF$-$&`?~8Iz#;DzOPBOTL&75}0@b zcDa+FAOB#oebgpm3Rn}*oL4v&0*=wPy|(LE;;5x_moH!CEMEMdJ9A}mmCnxjPfn`y zGg9isNF!Wa*eA38wyKY;IE15jb1N)7|175mE?aVU?^K`hP_qSTr{lu=Ayy%beQZ#w8p-p087n39FrKcZEuCe{Ok#l(MW zm4GX>jKuC*P2Q2D%ZgVUx0Dz7Qs3Y-&s^a)Ej(ZOO;}01{;LhUpp=xV3655;KrNW@ zimGX8SID=b|pLLu>r)T1tY5(q@+Iskf#(|$X#cQ5> zTRJRvUp-KI?A2`6`w?E;lV((Jti_;IDUS{eX6QP!KpiVIhN~$8O1M~oRjWvvf|uNN zqLyabkIC}8H~Mj@vwcA14@!@6gmEG`HG%zX8S}UBDnD$4F}B2`Xo?kI_}@Qo{DgF6R*!f(K!20n#b{fz+*`QnTA_vY$;7dpSaoDGAKYKcm)`S&hU#X+T5z$v1 z<$5BH_D@r!0_a!e81Aznf4~9#;RGy4l)Yf*HQy9}^Tc=2$mDhm1dPn3zrN6qGk3JQ z({1Mp{#s&8)CsjM1+1b~{TC~L;TnThbm({uHRy2^;Za=G`WFfng#T*cLCn(Fx&OJa zqL3JSvuQ<88&=9nlousG_Yn4dU=P&77APllu!JY_n|7mU%1)=Rg|c884o@Ibj)sI) z_l=g*PygRqjTyLICfo1yT9;0D8&0;04**OK@oG;=TGt);A6156%dz8{q=$;Qib~0(C(EE7Zyjg^X?YO9ep)@_sF(8_8&lmAnmUX@hVvEKT;DPoqHKn3c2eDbdu)|)&{nNSun2~2J`O)@r79}S#j5B zIp*`2ZK1I8h>#H;uBr0ElfM7Kd?CF%Gt)oSl$~~Y*3Ma|j%L(oIn`UT3_2}XbVE1J zywNQWymv`l8CVJbg?~L2rxMm%*)hE&Uvl}Bhd&2 zqeP+41%Ygh20*dgAvfoo>NWY$oMxD0s_FB)x;ENrfuZgN_B;@0>5A~juG4k$S z8aw3`=XaHV{M>5MJNYv{KKLd&7Sw@d7#rgzY@FyzG5!f4P`59{31CrEQ6`Mhv6Oxc z8^=t>88(_-Q^_3X#I&a!C%)N9&s)?o_x1+uG$i(PddB%eQ#v~92tUzqs&1Tp6IKv^ zcV)TvPtOC$llVLO9?g^{%FL6%@guPLj9I$5J4)Fr!uBc_wdGkOwmv{?!baPw$45Ij zw7)8HS;?!SIKAsItj2WMgc8ezi-gXIplUfarn8PYke%ilqrO2mZuA@Cn6Gl=5yY+= zDNMda&jn(uGhBr`^2m4w2~02n%*=IVcpM+xam-Iw*8}>EH~zRdj-s!q?EFQEY3D-6 z%HRrYWTb% zKL<6O!YP`x&TDm-8^kq~D~mAt-r<_#(MYO*yP8B_l5>O|oF0ITuIgr=BFm}me zrP8`-_AT0PJneD}iCrngVmtR^ifrh&C{y=NQKv{@F`L5(1WnW7b{nf4VS@{8<0euy zW!*9?sr*_a1Rx`wFa;^Vlts*RJzQmVTuEt}vJTuajS$TYr>X@X*X#3QByc1I;5rbl zJFzH2oo!2(-s8%?w^v9fd8605B;{sLsFT-O!Y~T|R09}p94hW1PomC$uXw&THcGsSVKTH>q z)zzSe2Hx=@XlSC%+{B3IkA5KK$GwnCSREXG9QWjB+MPN zG|35MU7;!g>IVCm!vf0-vlOrMSGs`u=K;Qo$Ww^WqM- z<*Z5WwEfVW2dCCY4bpLM55m?z!Z_h2G|Fr0y?E#xOunOd{g<&MPE>H|#JwI%_kbR4 zJ!WBYrnyjXRMN96SfHC-cjGQcRwiw2ZRuh$xIEc(W_zY{Io9TOwK2ioNZ@E(gt-r5 zyk?3p!`<(NUtIxwZ^%P`fzpn(_9`%5(D<@nG>1NM%tv7kVMkf4UBrl+HJli}+FvzT zgm%fk#Nb9^=8tbFGkid`zOc_xSu_Ro`;8Q2sg-T8n z(#>F>y`cuDcHr8oVfxj2V9Vo6a^26}3@fa6gjhGJEt9Y)f=CIcgfY#1H`$2g#hoNj zdjv`Yy-I1n>Kn?yY*mQOwUh&hB}Is_0@OD(C9;N28j@NN+3`Uv z<5^Q_JKiP4>(v1PESU+PxTCZyYcu^zS3H^=cq@OYPIN4B+dht|gH3o1>}%@QW~wJP zRd#S%D)&6$#GhGk?K`icu}xoC6N~)Nv1?ILv5CyUp@Z>gZ4#h>Rh#7^8X9~NRLWQ+ zJ&r0B>+)pMZn9X6=EuUls$u%46K-+_rpCm3^BY(CMX>AjAlUuJmN+V6DA@`?`xHH? zecL)7!-jLP=#Ys+TZ35N7vtY(#h5PI=`KcE@LUZOrK+iec7=HqLU}N!+aqvcpV7PF z-**4B!1V4=8%ELX!Wo%3j(xNTG-g70##9{WSWOVCT16bDVa5gVQ~D5T99Uu{RHEH? zGV_Jod^&`zjv;F-h*;=XI9{uho$={pq37jKr_);=%IC%Fhq`{fAIm5hamTSWYutAu z)qAFx{wYHs3ZOdcp%tkh^lLXewR;6qrsR($qZsHIK6Y{}Q615_R=_Ib%KKMwM-;_` z1g@YCw4*q&9nj(PGa-x_>39*a1C3D>)>V6DVB=eJknCH%riB?NJsZtloBUdP4~$m{ zjWr&;YE0zgWxS%LZPs7otoO%yCc}+C0nAE4U(kf9q|Z8F{P9kBj1;gY9P!azAc`XU zwzon^sC8wppmTJw)$my}W+cPj+$D+3+(nu8^Al3I5M>4pfZ||4RJvabgWf-FFy-$1 zqpE12-u4IF6Ie!s4pch#)DWD20*bnKCN3!kyau zsMI$-E_P>4(35gomqN^%4IRur{?+%k%(h?b_9SP{Dd*n3QHTX^3-Qk0bRLFk-5m}? zAIf1cY4cZi1;PX$5dkY;x&9uf+!_z?{;!WCij0A$2!TC=CdWU!kzIxGz(JbhpN##k zsFVl4%7L{9iKLz?t3262i66;<emK>3Cp3R zlbo(#iH4vs<4R6bna<0S<=lo(r&4{7VwT-2W6N!QhO(0`_ZC8ZW`U`mq68Y@akNsM zs%!!5vsRs=IGF7*5Wv*-6ZpEbRc@_y((E7^>>z{)qo_FHZGtfr5rdGxs03hvWumBR z!Zd1_S~^hbT|XVGvuf#IOX)k&X~Fy0fjg9&E_%D~U;a&q-V>dksd{}C zV06XR;n8)%rYg1C$u|Y8+9`|uQW69Kgew<~&R98-UstBX`(@A|*pS|}0kL$SaMW>vyebE8-DmI8zp+rfxWK&jglU(9ZNnRpXS+eBFvEvk{ zymyiBzVF@Ke7V>8EZcE(Wm_(CW85TH$&wK@s*x%rL{fxEkOTpO=)l&~=KW@uAPEv> z0qg>2ff;FuEpul6^P6*K{`0T6f)abEm1Mj3bb4O$yQW$D(7t{DFix)cofG%qvtM`b zzN)4x37}Fx%{>A+HKQmOWyO!UO<%g42jXwjDmOt#if9&IfssDu z9_rbnz@=L(VP1v~pP0Q)RZr(4U^C*tI2h~y;JII`_ho{B5@7juqTn9qxlBe*vSE$o zTQX-rSS+?QX4}d4LQ7*rYTjnUk`wzhqMW<1zUtm>k!=6NhS~6~efz#}Rwgrp{ubV) zISsRDZqE4_Ne%)T2F3pMEB^X`HE^Jg1*$*9%&Q`l!SD^Z8m4{9FxC?!cl2{`L+@DGRJZ zCsNf@2uy;&>eag=RMXz8#a37Av6T>BDf#e)kYUMTv;zD1cJSoCmy+}g>!@!^jexGZ zHjbSLiCgNPRQshsKnbu)foc)jWDbN@Tu#rtTi4`a3jPk%_LNxyUh>` z+6z`)AyR!WZXzUjbA5gNn_XQ}JKZL;^(ijo42J5BLck{o$PA?Ov|#5$)Ig~3XRQdj zom|g{x2~g^Oh3(L8xYfQctU(NtxK3@L<9nrg6!T+b`u#;zge!8e%rVw97m}j#sMt{ z1!DO43J)Au5QZja*J2?bg4)|kbpxn&i-v%_Tg##7dZvMDbvNl18xi{|sI0HXn>0am z?N6l}@%(Ce7Ma8O1zhPzW5}R~h*4Df zo@S{BMk+{*ST(_j%#=s$I@k5yNsMq+xax{tL^DTLJtT%hY9M#;Ajauh+l zg!`D?3{_wGQsCrMFT3f^jar~qlekkJpy8^^NRJ?4oWI^XFzg--MhE*mvZOmJ2Kz}O zhzaUWqQUZC>}CG+dGv6NImznF1%N=gxRp$ODj=Ja7P-NxUpbvCn%Kq_x7WApn=74O zZkWu_kj+&yypZO>zxsk0uZ}CYhu9fT)J;Q!o6T}Z+wdM|otLt!t1mmcYu6XCR{E*T zg`iVrAcU_TmRcB+`%cG=6ok?O3tl|B@^A9ft*U6b0D-)PNI3*?Z(_npUdn^fWk?hR z;g#+F^9Sc;4Xu& zvhvSD7^tXNRUf34*JZWjD$5&Kf`xl2px>nFl~$zY8V|xcNKhcH^RmQAAoLaGKW%M& zkF@+zr347H@479$Va;b=vic9ckH;>mpn3?sAnICZg|6w*6q0jX63`=`5AxbmL8J0$ z)*9?eM^7E>7wP9nBGHS=WxMFxc0lOx96|Q<`6C`K!9Ajy^eX~`a5&KNLS)K`8|?SR zee8KMTds6RE>fX_BYT}(m`Yw68(Tt|WPFDaSiIgej1Zu_JVZe&SGE~UU-B*E8hytUF;`_7fIx4vV@>R57k zpgEp(hr%+mie}XG24WY5Mb1MFso^sH#Pc!<&rUvvsVOC6DUr?j5R|x|ncQKZaXZv* z-Jr8YhMg^H;n7uloWTPF!r5LywGg~F;k9a15$$D(xeszw}~2YQqd)h7$4IrHmu~~#ay^q92qUFyFzM_MhmY_ zH-z08ONaqoiw-k5ifk((&mBJMddcp+Tgle_a47VV0%pu1Oaw`hev@~De7VKDEs8)H z7!RqxV2ICSyPjQ2KBEZKswNgX0x|}=)Mon~hkzXpi=eh$k6(nR-uL9rDV!1?xG~FM z$BlDJ$O7)1!Cnx8L|^bv3wRo)J#;0&nl^N^a3LP6xnetuG&&v%Rd1;=H{G?d^1aut zjo(n8aR+qUO^`PS5m_8+P&2YRMOnDcbK#jrb>e2bW$^k|&l?;n5)J1y(`ZDa15wVs zi0kIuQ;?pR51VEp+27wkjLJS>X4gXKmyT$f2wT?c6+&t2K?7IQe)az~eNmRfU3D^*Wu0K5VkkfsVcxe<$%PbZEY+SDsY+ z3PMH9+#nDUoe*Hhd=_H~=M~BVc|Y*-;sv*E?FbBZk;}Bm3X_^uSOayqzCgAy)dJZa z3)EmAW7|w~O%<$WeI&qg=6J>Pm%BE1Y*-2kj>)n$Q!k1_XsWl1s;>|z6ag7cq|mx^ zSp1nQwJA2fk?KFjf{llS6GMzudE5Idw*l~A4X&PBHfcm9E@XG>?*w>c=6z|^ed(r zg&b)l%`ScwP6F9w>4{{ruE;{9rNPLMeKouWKJHPm6{?TrAO)wCoc(ADM6@E_?Bjtz z!+&HlCy(K`IZz+141^QbTM_r=PB^VJ3J-C@m;i2AUn#Yi5Z4mdc`2OIewHMSPt4S< zu(_E!7hUw1ynDX2ru(uN#U408n9hJbGjHjM3zOa&~zGTj2eq>yJc19 zGxzT%XDf_URDTr$3W1U#5UtL7$+V1)oih@`+8}w~xi1{@ZwTFS(30+r)3Y6hr9p15 zqw;zR-E@(6fw55P@66ONPOswO282bDaa-hBaT@1ETt|&K^Z?0SB zQo8G3`0c{|M#jK`zdUX?&!Mm`Ubsl8k(UDkE`r9E1D&3my4(m|l-Fyjr>ejy6EWKy zZa`%vz$y^2VpY?H4qJvY_6&U=Hoes(fD*;&z@2ak@ciY-fxj01&g`A5a zqqz&6-3nIz{LEGo;wukVkYZHpbnQN9papI>@Ey$Hfyi1O>`P`LJB^&%s5E%i zh)x!TFAfIG+U>%$x5;1%8+ZIyOUurp z$1W^zSm#u0gc0o_5I1*42yc24%~FvJ4??5>lQaq2HfOYlmWo8xu0mi00T_uOXG9@B z%_CRL)n9iD4=usTWlooyxf=X5`t>B+9W-4k1y~2C(SW*S1_*ds7RMTCBcP0MX8_}z zU8)3Fa|Zq79ZP}1X@&IUmHk#D5UA5>_#JEF*JoYfj>;q@$F(%FO=sQTu(dz~gh!_r zkDNX}NBWZC?#Y z5i^ew0AK1a0q~euW6dW2&k7!rvKUngLIBGTRw08sB3@8^RjH^5I8MORxvMsTqM|x` zjVS@v>|s5no-{=87Oo@ND{8ayb0IWYU^86K>Jj)G=aKVGGzE#9OO1e8cZz9&MZ$rs zL>8o4p?Dz<*70HnG|XgDb(*f-0x%1(44{pgX1{}w`aOhnCG&)p{@*}guo|4Sv<@3( z^)yz`vJOro?+%4(9!;fsI>)M0=yz0P`#ozADdF?y8>Ez_x>=){ku_Xqh99fQm{^Av-v9@m&I&k$p;dE?P=;rB2hLnc>B^-E~D ztCsXn-7N$(nI!#ZwOOP7@}Njt%a`B%{IO&I-hW|Vg?|I9=9vzx@Xp4p>A&+ggjaZQ zWYWwzmhFv+m-sL2-*L&p95e{G138noz$ws8^*pqT0eQ{sNSB z7UDJ0Ehph7vPN3<{{v5ABh-=qa=Z*~$LS(79m+OXuqj~qDhZDiY+W9te5e7Y5(*c3M`2bqfsEsY)>rk4hX91ao{A4yJUnN+ zC3S+EZN#V0UykDhdo?|Oj45m!#zvUPT&%lpj>L|H;+ zjv^KzG-SsT1;a=^68F5Uj5#%Hg?m(LU;>492>jw2;;a{1f4q7y`UcM-{lN3*8#xDz zhcrD<7a-$UV2!keniWk=)3vr3X=V2RT9ys(Bnk=fn78Ka6Qp`n2uvFRc@HlvLr5vS z;-2;%EmD848C!iXi&Wmt9DeJnRd>{H-Fm0=4J)_=sa-*twvn3^&=<)|XC~*7f^in8 zg9VlW?UQyBXsTWNm>bv!djdvO~Tdy-JH@t&r@q2Au5Q*co>gUm<=4rR23R~Fx^bF3>s*eEQ^8i5 zJO-wD?DYYu#z`cwJUWQqOU*_?7?q%mOUrq67E>5vQMI52`+U_MkCggcm$NrZ@)R-3rhzj;Jva-8eK(bNWAS&7NDMN(M} zPYpL!+dl|k{md_{aQR(G@~f3AKU%?v`CcBbyBh+YZ7fiw^P$6aPU6TGI^4Nh@s7RukR5#OS|hC6;jk^dtxOB9pb%gcr@+=1E;Q7L5@rS84rRzE(?RQ% zb<2;vPMkZ3^veDrxI4=H@@Ht1Lbu_rkJNci@OmDs`nVonce!4BMO+InA}rj%s2;i` z+xzN0u06yyZ20uf0|&k`MN6zESa1Bv`F{Mx8E%2CjHk#d@bc1B%PH67b2P`Yz0!>1a%_x;~K(6ZYJOq>g z>pVdG^f4Dt7U^?sK8Y~FPeg;3%F4>HWs^8E+>Psk2ZJAGXi=OR&hYUi8--!ePI$xZ zfuq|s=wxD5FeNFlv@a%-Cx=T$&=?JiV77~7^;Z$O_$pvBiA)a>jtO}o5%PLSv79a8 zzBy9lj1)90RO6Y|kU#Doxw1U|T9$=4_$JKGl>10|%$TC`d;~lkxv@VXxM^>649iCjD^Z%6p!vZF{|^ znKYjk+%&P3E87e$6OB@n*C4*+#kLu|lu~UgH!9;iSPycGbB3Uh=^Is>WFYsIh%b0I zb&~r%*V-?*{f0=^y|8x49VZ;!NmN%G$<9uq_jP$|H9hiv9;m&=sM>s~UcJTOK?FiZ zU=A&`oUl3*3;?}2+xPn2ZmM4(_Sg4YTOX49Q$fqL92lI$Eot?v%DD*0ZB$`$E+Xo^ zPZ1E*WVv{4KBW(2fv3Wzq||~_ogtis9F4MZ&q`BmPt~6q0&vHe?7%g(2374@LqG|z zW)148b>zXckxHSw-;(zfFpNwl7{fj$<0DO28v><~GuVXnX8PmcAn%GqyoX@xwF16! zi_zXV{Zb3ckX;@pPod7NT41GnqrKs9_6O*99Z;*p-|;wWNL^?zf{gu|oH{w9z`p3? zoN{)q*4~~g0GPE-RYwYeA|P-GZO8>8S8}rKkq`6sFI}_d_FC%j z_aUU>r}WxwTXMoHUAj(E!h*F#*CQIFJuBV8H|kijV~yh`*0!&0{KeY7CC524g%<0t z%($U7B!b}TM)(rWBI}VY@FFc(AETjqcug-w{Hw8J{!JBCfkY&F^(BOdmue7TE%wqU zYu$9$HqRdJ^z38{)$D_Yo7vyr@9qzoP9>$GKVpIEo6PDhi!nCN5RWUr{9{dq77M~T zV${Et3uazyOG~V@=v`a&r;oPwJv3A(Z60&ySkLUYGXmHXnnh%R^4-GWNNx33A)pW_9s>ELGjCN>Zac)3 zP@u@dS3xa%2M^WW0k^@;X3gcu5i%0@D?fIs1&L9yiFkp!5KDDj;|w2J$`kFYGu7eW z3hH`-g}3Qi=yIk<*YHryG8SH}bF+pqqZ+~6rDwTZ%8G@fG%uFnV5EUDj-A%9?pgi1 zmmQ3FsrEH)ws$~SL&vyl9m8)?7OK6v0e5=_3o*0q8U|PR&Dm4W zeKt!ycRl;~?+*5SqaaIR1S6R7UNNOvyP)y}yubx@OaFx?Y&hRC%=nlrNa+bsJtzdG zfPmwPfMlqraLKG!rJmj|oV2fLoOMtp?NIJJh~UU=89qdnSw_G@6k+7BLek(_?pSqK z6a?0!hI`xt%Ijt5CllIdjg^?nJwzqx^Df3kp5yh=AG%kkT*j^ zYmbCN2fqTzo&&!6GGNhw1F8({E=7URwu_TQu;+;Dd^efuJXuJalhvUtSV^2DLj>c= zs$TFr6Ea4dDhdIGz^o%M5(6tIgD;Nd(5#Q4fDRG!Dh@%;f94O7$MG7nG*z708 zTG!MhSX0y37FyH9Tx7HDhlpAGe;^!uUQllxu&rT~W?a`hMKr!gBg1g(7#^Hv`$f2{ z*-53y%i(a{mti2b8DLxnYb)tbg6IdL1E2TVj{Ryj+w(>dI?FXdd7#c?Nn<(;2Ykm< zIG2rg;wl!2svU)ZLSQ@uAa{15KpgMqa{eBcSCyLQ-pGvbJ$lupjYi!zI%3r{{1=rDm16j_xEo3>|)zbad36(C8omtYL+YxEJaKIdA zUmp8LI`7-_KAy!X-)hc_D0d{FP-4m0iueY4sk8Nb@J`188<|sNGK8EFvJXg7Bq#*N zLjWrW@({Xm(eiC+Yir7`-|+WC!s@M}P$W#gp80ktvqxB7*B`>(uzt(!C!c%mI}OT} zaQ4twJ(W2EN`U3(353lsct7Si_wW-?(|U4i_f7Aj9q9BJRD)T-p93{Ujzz8}_Nswe~$0<(ueYbzX# z5#$>M`HQeQj4M%?J(`N#(@JC;bNdpv8(k&45!7?mQ6KE@}AWm`+R%Q)v(Wn->-s*kX%Q`26Tk3Cr{I#y{ zjC=So3_WeRnZXmO{SYeIL}NM-k$iS7MCh zCpKqV#t|-#+Q?B0D<{iM5*MElEZCz@aRm$u7ZM+hTs~7dX0qHif(`^guRWS|5*yC4!lQA8X&KFC`?#+Pw(1RUs`o2sBACjsJ?IZ#r~ASQKa=M(s8e!@4o!JjaK4ueEsb zollPEPRN+kml1=H985d|QIiV?9}^-p7(hdc1q(Hvc9UBO=WEUQdU>Ea0~KO!;p8ko zpL3r{0UQKW=YEG^_1Mq{Izw93i?)~69g$@jJHafHW%vvib#m-XqrP~9LrZQ*Mc0w} zVswg#`Go*tv+B(E@+&M0p8KMkJoYX^wqXL)vo+aWDEB1@PYl8MHI%X2A2~Su8m{q+ zGJP`g%l>zmOkf*RXP9!G$g`YExsG6-(ybv2A#z{K)r}a_;c@2{7Z_HFmu+|GQmhVA z3^#^!M39WrZ`Cn2j6o zO4sr75M$Fb1kK#R%=)$A*fp?RI~!w6O1R)=ccvZrMj(tN@uX(utWe7u=pk0$tNR0i ziZ4?uqgkHK9fCMh%witp9L`TNd8TiQ5KxoB)cfoRd_$TdL?Lh?0s@gy&w1W1tl*Dt zIM-fqlO51c+gLQ@x}nzW$!11c1yiZHC)&;MwfN8N+r@92n`w!Z_mfexz<$q3um}l- zLh42>!>LySEWb{g1qM+D>Mhg53G(Sa>3G?XSza=Y#W`}m>xR@kq^wRaJA8--3oeV}JgICnst0&|4<1YhEI<>PXd=hzk13ITYac7huI_$f;Rdv!N8CD z-<90AadG5wI0%k5Czb-N{`6r+hW5h=`9pG>!y+PxhJd!V7Fd$*s8j;18PCGR4S0cu zT1LDWM{F5-o-TUg6&+Vm`>+vmj!oQy`c)yI5GXAIkP(3QEo~pO(RveO?upIZjD1Rr zufN`Gc&o`n%djOV;nl?G<7gYILvE6*BE%YcXQprOKwDdzbVC`q@VcGS8v25=w0*VL zwcJbQt*yWkN_TQEe@l&hV_o>IRBGfm>=ui(wvg8IdVv7#yl>|CqvU*Z2NyXOAI1=v zV|Y~e{z3rkSy`ObLad|L@#EPs*E;z4 z5Mp3pnHYVm!Gzx%${dMU11&nNd7v#uOjWohFlc~@9$TpeiOR!U;yHISCzs(Ki!gam zJjctELz>7>A7IWWL5586gqN{7+4Il8jE`|hI{ymwSs|bhC?*1CWGxba!a6rs=7;vM zv9U!%ERYYdV8gqO`nQBQvh?M*Kc$48{NAC2hZ=}hu|CRqXsPF&Yhg9{)l#&?2v6t5 zpul@l$Yq7|U-FxCf@e+Mtq*D_;iwNLL6J}Z0(jaWA1()-?skiK?(giuBgpHJ!pO?+ z=u*IRl%z_|ONG)pFxVd+4x}4NQ`6`}Q%QPV*o_*}Iz;ApQKc*qP!EVtr_FJs(8|Lp zrECu<)^O(3FODT&`1PsG{&sA>R$jv^|79fQ^rb8}6|gcLaXWJ=DYG)=RuZ!UR#??_ zZg8=>H%okPX45B@Q?7@(OnH1xrYYzoWKfixP;nFqkf%aj;o8*RpU~XLaM7ekol)2O z~&n@44DJZU60Csib_5JX@!>}UZ!sV3v%l;_Q0{B=YHl1=QT(_1{l%OuCVN5L(ke68g;ULMy7vnmeTzG zEQMQIY)!Oc#Z7AQF6qSKxM(FWhQdCUKQNx|ObV%l7&KjSj8V;jO*2@1DY#-DwDeh< ziFTKHKTHL^=SoUm2^&Yk00yJKsH;-vmJnstv_hb81e%+h5mlT2*h`#v#U6UY6S*vR zg< zg)8h`y_wbn2M2!Hi{TA<_JEV@dk);Mhxi=QjnE}Lx|)lcjn{1ds0jFabY)E3(xrD) zg1NX@uhjypH19_b{;aZW z-3JW=>EjtSkRnTMTxEO@FKE(7?pHTBV!o3sD` zKmbWZK~!$W2-Mf#9M0JLZuWweje6Banf)Y(`)T|KJW797>FEzz#QuuM*ndEX^>v4e zuQ}ZLw=^>z_}51(j?9>dxo$w6TjqKORR1$VU?ey$V$w;kgLzPzNt2^9^Jn(Z(VtqU zUPya3BCF2X&?KaI<@$%HBQNLx=rAeBTPu0F@8s{N>&*TXz;)0XB$=*fgfo2XO^unb zz8X7F`((5+&z+eC7I9!Sa9$>m$vU0G-(lgGpE#B2YYt~YbzL|DLMs>PaBJ(kEuqmT z-RwY%Gtg4_5LL}H2uRB{Xj$J)iTQ_(J49I@0M87{hi@{7SdbTjs3`6}oSsQZDvQh( zla68@R`5KRaoAu<-q_B?!z%AVHa&mQ5Js>YFS!p#LZMKYu~-GN6TZtzy!rWL_p>6t z?1OOihrN$X;Z6Bl;8b|WRj;LwJx>T?XsJ>J1ZYjo`yvT)d|Obfxl60uw2B82H2<_P z2NrQKwDR^F8h`Y^KVcsJ!j1jk&t}b#%PBVv&+4&)Lk~VdRm!F!OoVDeAutmJr1(lM zq_BFy4l#eq{-gJIUbOO)U(fdK+ss4t*XniG@O-$s*^)R*ICFhjaGTEJT^53Ui#jP8 z>NSg>@J6a^X&5yFuwLbugn&TUK=~IJ&(b+lZj%{e^}I}+zP&E!eDUCso@rTM$-4(i zihjq`pnRS!_`vb%A02Uz@A{cNaJbQ^9Sl%2 zj%9U3=`wqum2*#6)9V1*?GYpKTa4rNavqCcY1gzYLr`D8lBejJ1OX+$ngpP^`dNzH zC6_D@C@zBy%={_RRbeodNM+f^EZjz}N_0PQV|4L*EXp*bUqlt*85s2Yy@2=n z+UtJxt-%BTlJ4%7`L3JKb#=&{H0BR9B^wFdy7f-&`0+QZ9MW;EF8J-?y6dhERbOEc z8OuB;FvNjKcnJP0er~p#ZSvM5zavsDp;Qwkn-d2r}?re}SX zy9;IrFMl`=#?39$S+ zX^7&ESm%hLJ;T@(ejVRwy0Y0*N12HHFxmg=nrz~Yb-`Gp0gh5Km-vrX3D5hu8IHIj zQu}5lJ=x}EHzzm`*p{Bn(p0ZY>2kqq!Y&=qg|64Q!QgSXtt}VC_B_UP#{@_;o>zB* zs$>4tQlf*3OmIGvvXxa;)dgv&BiefO)dqyjzmd_vdx8}gUm0I?OF#?a%moRlEQsQZ zAnk68CiI^+H_Hr!swe~$0{%omDr1-BNyABe{>7qhatwFJZ!$^k64v#?Jxq^9cvy~i zhRgJrlPLul@YnFfkRVnkaqPXw%(@2_SM9E2w`ZOHPFlIP&!7p9Cp?jeSRUzy331S1 zPK42{)ngdh!9|u4snsZ7COiS3Y!;@Ks%fz=R0oZqx~D`0Yn3vb^a4%^d$F z)~SnmWVucaD}PuCe{ z{imbV+fJn1U7fBG8N!imP`4AO99;}DgW4p+(!|Jk7Vk(Ulh#nUqH&1WgDx>5h#q!2 z`>=6PI9zw&qj(ljBo3FBM$9>IVG8j;wlLIjfYjW;xIXIH)A7r4#&p8NVwo<$6kI2{ zER@#f^JqAyo6~P84M3O7v8j!GfxzUT$@7w$=VnZ9idD89-NLxDPSa|)1#7k~jV*eo zW=7YXW+o)>4(f>LLPI;B-SE#x&g)ctR0t>pe2RcHOq!3U@0RwReQOtg_y^YD!5f%a zwKWie{5@waTCCB^Z2&6noYkp&*mV*wAP&?swv#xhWda8?m8;X6G~({unL98{(rHug z_U&(H?ZNFl9_g${K9WWlV6B7j>TOIImkY`lp)5hC@Z1G*|_%9KcdCgE~Ay3v0j~Jzl+(|d~FLZI8wv1QE+$1H7!H?cM;MzU&lHZ<6_jM zuHfpXoD1-a(5Dh$6#>LjG(jCi=H+_Mz8zW9O3{UH+Dwo{cbH~>p6L4BTO!q0UKOak z462%u4I8|g@>ajk)r<7E0hw?8EuO9r2{5R}!U!pmw}DCIfvBo!It zM3Tl_96UMPZD7fUPjEpz%b*JrhDNwf=z)Gnea>0La42xnXtoeTB!*hNYCJGC4PJVu z&lc!|6PJz7tcXJyrRP0{3^Fc?^Nu!}XJOnt-3@Hhn0ycM9@8AW&r*(NF#;|Rc~pb9 zODg2KmQHzSk>;jWBQkzYQ_}%XO0pc=KV|#v0C~3@AVBne_?C5Z4OkOD8?g zdY-x2pS!7}uVmYQcc`W1zhOVgyOk9lez?hNZq98ia>F%`z!7%RTKgWfl?qK9IbLM%k=EBdS0vNkrhTh7FH>`nxAb7xvfwZ^aQ(6 zQ2p1~TOJ+RpXTR?XLnT0L^5(jkeq?uW_Afyy^TWPyp!{&-_(b>L_miNp(ibN;P^EU zg1AoxWin|W5cH*o2T%UGP7f{Fzyo!Ng$0=u4lGjh9*A$CMq~wbtUklDhYaD_6|gYE zxh9PmAo4Yg>hJ`?cL;k=JX?k`fgH!fc?2&U84!Edwq?`*T5x&(&Wf@xxex{ zD}lEKF}E^!ZDiE-=X_wus3`55@TnO>Uc}LF)OJP_a87Kk(VD?|kwIi>!Yg`}hu`Mc;}= zeHnBmkerOH>*rrv;AiAO)Iv)M4>S+pMx7$ z{`pVr!2?$tLygO5^(8REDw}0uj<6m**?Frqwwf{f16yu4pMLE-Wb}Duj;Ndu-P*Q| zL)OgQ=jQ_!DRhy-86&uakl@nO4doYlSYJU<1uwvyM@atfna@&SC4<5PO9;JSwj|%5z7AS_ zc`ZH%Wrec^ygV{I$@WI-p8ajCcjM1b&N6D$CFgBUu(px{tF!&cw(y;_q&lbMHZdx# zuJV0R2&VFk0Ia%jyhEPATx}T}MSf4E1=olXTkaQJC-KRRNq!-PR~*>^_%XcyS~Ao2 zTCSS zli#+peUI(^<(9)UXmQd@cmMWnojZ2?=#jR})h9$iKL)GdKgPN&H!$#Cr>AhzR>rD; zYmx87s9Z;!;Wv>9(cQ)j=TEq2JiBqloo@<9x11oeL&F1ZpI&oT+KHy%UQTP=G<9pD zxy>k>J%qUQ+Gxw*vAUe(J5g3AQ_1?u_;IQz1pJM_qD70ibR`4B=5IpBq0ZLm6U4Qe zv)wQK5n^GPNX#)#P4zX_P?@_6d^v@RLb`=898#zY*9zf!Vyo#SRsyBMje`}W6CxmE zVBz#6v_NPkoAHEws2@v*fD&Mp4%->E?0Ff8g>{Ipat>iLYO7o>&Sc0@*M0eifsTi( zU@7$eV9nLF(7@w_HnO%rlm~I%g#}`m5i2GweER3HHv6%@yRfy~H&duOP7C?3$0B#a z3r2pN?85VYKaI=Cw|PO;sB_Cm!}-6`1&N9i9&sPcFz44TKWMx#4%p}`)F*|2Lcj+I z1S&TPGB~1yl?&C#Q||-fibO(dtR-ghn)mV8YN|)qN;9*WwJe2Kge4H~{Bh4se%H<( zd3^6Luj`*#qlI0)bLVYRYx3gd?`!GjT5XaTfj@=i>qS_y&nRdLYw5gN(h93$1EKAY zLw=R15rTaZYx>o;Ag>TD+v{ZAo|F+7FxkL4l0O`Up%zQ%++@R9sX2i_%Y-(BTr&3F zdS0Isd<3sjHvA;iJ}|S!OYWOgT5YSM5b!4g*Is)qZP|O!pTreFRcq^g-RswX;am3b z(QE9!eQS-y*GcQg0?Nl#UFjawG86;h4x(8Hrbo#cCi0Fq;)fI?sr1iug>7vEH+V7Y%iM)JZqZdS61IEck5M+1`XEY(VNdq_7nj^br}m6 z;XHl=YqjTG&eBLZmGN|KfRSucxSGRhD3OlJfRL&b3jv+#)M7JKjund-)y|X=$T2We zzDiwCas(WQQ8OnN7Q~Sjr3ipE}(j5u^!4~UupV$CAPGP+abGK<9EHRd{*`pEb3kYzjAymic z(>Hllv#h-ec$zx$8WLv_N_4&Z!e$4Vm2_vN`!?7 zp$OS;EyI2+%%bivBBP{wTAj-xYn`3QYfGBWU&m*Iu=(AG<2am+?1J-qsPl4kN`U3l zX_a=Ou#myCC7-SZXEmA`96azS@Az$u@#sh5%RabG3p50vO)eV-*{8Ra)Hf&LJMomm zov+4DRP4i>mTxD_PMXoEK@HW3kCF^2dk zm)^EO9#4v&IPi{v+zDLI&mWBXtPoHLloWxswzk|6JLm6P(w<7&c!XW^>af=PGpBFg zXY|TVIuA8KSgzKZJnC|aZ3m%0PQCJA? z+{^+cs*6zwILra}sX@9RT?`ha+-BJ6e(~pnT0o=R2uJI#-(*BqneZl@S=^9OC@-WB zxmziLplVMFD!v>$5qqh*nJU}ag>(z3vCb0&c0(J#A(x{RTLTS|P&tnan_CmzL0ahH zt(B~^ljz79dll1yje6wYg+B$FarlyI2peiZgC7X>Y4aAqe2sfyotu zLJo80{THqb?WM^-{XKNAf-g!XQ>)lGMNuQnGQwBm*48O!tkI|&idAbaVFJqD&JXlElh)83qlpg|0 zfaT{oJFO#}k$-`o$5$9_J-w%%-RZi0Dc7|>7H_!u5;MLr!gyG&IN;jV<~J^kGQtO; zE`(Rz2;7SR#@d&|oq=6Scr`9!>Ia2D86a?u1y&hQD@okGy-DlrJQmclZQ~uw2F%u)nHjRZ5I={_IVlMrXN1_>Jv{Aa;fh& zist6)ovk0(`$ORc-%qu`Hlz|Pli8dPWFkq9WFJ&f2>2Xcgyqa-W4)BisNP6^yq{evrELn>&+1e)1$V5vYmJ(!1C$T zF_%#nF|hJH7UHrl?9x5Zd*ER~ei9VUP%`4YYcsMF)@o*zMj2cRl?G>wy94Yw)l;z0 zIF5`|j}az*@Zv+kXU3?gzETJ%1j-BnO1-k;_zxXwZwLpfu5?3{OHIRABm`YbiB=cj zS_RzbDygQ|A|6yF(*lUY6d^piY6ilq+++&ZvyM3F{+;dZf9YGT_N@aKAAO|y#19z> zY=&3c46U%r>?WRba^=ZI#ekgiX;1`Ah(MggNopR+HP)|ZM_XUFcRGWIHoA$nh!$Ii zwSFNB?-9V=$w1xG+wZtqV#1q2{a9=SxC;4LY)EIXJte@JJ*=nHQ!ewMC!}zg%6M2) zx_Ew8?sIzg|8&r@+g&?xgI%@t=3wRJ^=5Qk1?AA?=kkA-)tRnDvn1~ryo5Ih)zP$!18w`F&l;7D zHAFMxSfnbUd^W-wiyv1}v-OSr;Pz4m)9(U3o)CTqoInFtVt=Pu=&khk&L*73dHa4o4Q^%{O~M zm#8Ntz$y{2Gi_GdT)_wnYr1-_MzBm0a*_J9idS&0JQC9P`9V7OJ~auf8})IpCo1ipjkoxRQsLoT+hs zNclZ)Cc~5MSqUdI{Nt9ECabiwJLA@c5m#i~98Q*By9P#b?JMi_ZGOd8(KQ-@swio!t600{-g}#3_+>!~ zD3JZsWU#PeS`>+7@z^m$c03*X1VVN&@?au!e`V12nFz1)*u%o+FlX^sM$d#lKkeE{ zGO!nWN_g3HPN?TkGUpXl;H~f+=Gk9Z{LTD^n^)+l!Auo_d+uopCzIyociiz8^?8NG zR9hIozNS^oyFH_|^)p#5SpTG#9em9hK8!fp(!^}u4RicSmA_!P!buYA)Cn|-0&5mPo?aKy1}m?R)x`o2<9;E49@G@=WZ=Nh zJiGt6oj%!~O&quiE`>`XHP=P4F@_Q3okK<;BVW$zT@iPPfNCy_z{h=z(*JT@_eoQD zPlq~V2bxu;!3*!4)8D|#199zz65x-Ekouum2nbETHtRX-M9O~h&;R^yp6u!h_3Yf~ zd&{6=4L{e8=dmExD2|wXSh0#Dq#Bn%c`)$oUArGyk{Y*;uYRCdj1C|59R4OVqMM~4 zPnB6hKterF;$zPeVyc@95ukQDy~PY@pK)#aT6MK}_Rc&1_T|NkgTqZtO*4L&BN0M| zhvpv}%NsTy@!Fqx*zP~DRf}Duu|PEz?gb=E##p^n7jXvP#34m=u*x;97v5Uxn^Gb` zk(M1f2yt{OWiP7jQX!xYaHT?artM16BAzO#DRfl~tnttsNG7|UP7kzvEqU^>ul67L z-Y@!&eCyC~=kMCB;no4i>a{(A|IcXj=ff(MAA_JwGDaB)uR3v~JO^RS1JucUDUeD% z^z6pS>q>Yv-Ys+X`x$eVXPZ**6awQSfJ__)Qr+C9G4>aZ<=t5mAKv`&kN-_HCwm_E zs`>Q;Fn|xtYzd69Dhl_hazapKj`n(P_BDzaV5-a>0t@K4JbR!nu%348*uj|Qy#=bo zTfwv6?Yi{yjEP%Lo*Y>I(T_IGFqj`90|NuObJ~1!uxn}Fk>rFw0Sl~CUi#$15?;w? z1d0kb+k-z@BrXYd?|u6J8dzYD&YTYy&lJbmNo@mjJ`>X;Kv`f-54VzE1xp&LaWJ#6 zuTf<}1hU!e@FBd~!>;|BhhbL(4ZB!KI6};F6#gsNqbHA!MHn7Ob6? z0?BpD?`s!G%~6Yg)5ix@|Ig<#$Wn1?=o_uYT@xa;0|{QmpzpGP5j#|Bm~p$Qkkh)bUG z2f{1Qwq0xR)v+n@=eL9V_YTK5uidKzShF)f+{3P_oz~xGW~Wcp%lt$D0xa_Qqc8Ns za`F@u6-&UTy%T)ySlsEx~CfhF`LzB2w?-~pJ9J5OH3``AUq6VG#SuXKUA_y53m?BFY3d{M8izS-Tqdu+aC`}QVn z|Nftth*hi)41{oAS%+6M2I{{8K{JCRhBCnN-_#UDkrH4P1k>zSk`9Ej_cfg zN|;ix#@b7g{7uVweo4A__i8h|>}oBvWD7DCt}#NZ>W%R7upV9#(DWJ|39tm^I@?^a8%}!DLn_g;^jWMUT5Z zE2OJV{DHu2x83I5dFMYiBURvX+)TG1zUEp8vo6P-wZSqzs# ze~h{~RJ62wu7BOSe|XI4KX9E_v#pAU7gAVK_^#<8$U2dRP}s+dgJ`K*X<`)>Ka06f z9B$~zIt_ip2b1;nHy`D^H&I!6D}+-mq`&{LHawgRzPkU>MV<(*_xS2)?b6DVf#}Ni zp$_LnW#!s*+mUZ(amJbJgVq_4U^>Y>$1N#Ka;7u&rsxPL0ano=EoOuAxq=U&Bup zoZ5(r#3jyoftKWJOKMq)u5z;~|H-|PZZEFq*_0rV0<5dx`N&f6k{{$+@C0Rg8!TPh znQ&i2y@SGx9eUy0;ogE_Q56*e3m5?$9N1hP9=`F7e;K~(uD|^zIMpGKia)>srx9z* zdKlM!1Xdum0m>gn%#`QuzyE&@ð|t{saj7{!vVsS-W8mU=_F?Ub8`FyxtTiX*3Y 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 | -| `accept` | image, video, file | Comma-separated MIME types | -| `maxSize` | image, video, file | Maximum file size in bytes | | `description` | All | Human-readable description of the field | +## How Constraints Are Enforced + +Two distinct gates apply, at different moments: + +**At `model_save` (authoring time).** The schema itself is validated and a misplaced constraint is a blocking error, not a silent no-op: `options` on a non-select, `items` on a non-array, `fields` on a non-object, `accept`/`maxSize` on a non-media field, `unique` on a singleton, `min > max`, an uncompilable `pattern`, a `select` without non-empty `options`, a `relation`/`relations` without `model`, a `default` incoherent with the type. Model IDs must be kebab-case, field names snake_case (`^[a-z][a-z0-9_]*$`), and unknown keys are rejected — a typo'd `requird: true` is an error. + +**At `contentrain_content_save` (write time).** Values are validated *before* anything is committed — a `severity: error` on any entry in the call means nothing is written. Severities split by intent: + +- **Errors** (block the write): wrong type, `required` missing, `min`/`max` violations, `pattern` mismatch, `options` membership, and definitional semantic checks — an invalid `slug`, an unparseable `date`/`datetime`, a non-integer `integer`, an out-of-range `percent`. +- **Warnings** (pass through, reported in the response): heuristic semantic checks — `email`, `url`, `color`, `phone` formats — and the extension-based `accept` check. `rating` has no range enforcement by design. + ::: info Shared Across Contentrain AI and Studio -These 27 field types define content schemas used identically in both local workflows (`@contentrain/mcp`, CLI) and [Contentrain Studio](/studio). Content modeled locally works seamlessly in team workflows without changes. +These 27 field types define content schemas used identically in both local workflows (`@contentrain/mcp`, CLI) and [Contentrain Studio](/studio). The pure validators live in `@contentrain/types` (`validateFieldValue`, `validateSemanticType`), so Studio forms and MCP enforce the same contract. Content modeled locally works seamlessly in team workflows without changes. ::: diff --git a/docs/reference/model-kinds.md b/docs/reference/model-kinds.md index 16357a8..baa1c60 100644 --- a/docs/reference/model-kinds.md +++ b/docs/reference/model-kinds.md @@ -52,7 +52,7 @@ Collections store **multiple typed entries** as a JSON object-map keyed by auto- ### Key Characteristics - **Object-map storage** — entries keyed by ID, not an array -- **Auto-generated hex IDs** — alphanumeric, 1-40 characters, hyphens/underscores allowed +- **Auto-generated hex IDs** — 12 lowercase hex characters when generated; hand-written IDs may be any 1-40 alphanumeric characters with hyphens/underscores - **Typed fields** — each field has a defined `FieldType` with validation - **Sorted keys** — canonical serialization sorts entry IDs alphabetically - **Per-locale files** — each locale gets its own JSON file @@ -369,10 +369,10 @@ The `frontmatter` object contains all fields defined in the model schema. The `b | i18n: true | `.contentrain/content/{domain}/{slug}/{locale}.md` | | i18n: false | `.contentrain/content/{domain}/{slug}.md` | | Meta (i18n: true) | `.contentrain/meta/{model-id}/{slug}/{locale}.json` | -| Meta (i18n: false) | `.contentrain/meta/{model-id}/{slug}.json` | +| Meta (i18n: false) | `.contentrain/meta/{model-id}/{slug}/{default-locale}.json` | ::: warning -Document meta files have a **different path structure** than other kinds. They include the `{slug}` segment: `.contentrain/meta/{model-id}/{slug}/{locale}.json`. Other kinds use `.contentrain/meta/{model-id}/{locale}.json` directly. +Document meta files have a **different path structure** than other kinds. They include the `{slug}` segment: `.contentrain/meta/{model-id}/{slug}/{locale}.json`. Other kinds use `.contentrain/meta/{model-id}/{locale}.json` directly. On `i18n: false` models (any kind) the single meta record is pinned to the **default locale** — the filename is still `{default-locale}.json`, never `data.json` or a flat `{slug}.json`. ::: ### MCP content_save Call @@ -480,7 +480,6 @@ Every model has corresponding meta files in `.contentrain/meta/{model-id}/` that "status": "published", "source": "agent", "updated_by": "contentrain-mcp", - "approved_by": null, "version": "1.0.0", "publish_at": "2026-01-15T00:00:00Z", "expire_at": "2026-12-31T23:59:59Z" @@ -583,7 +582,7 @@ A model can reference itself for tree structures: |---|---| | **Referential integrity** | Referenced ID/slug must exist in the target model | | **Locale-agnostic** | IDs and slugs are the same across all locales | -| **Cascade warning** | Deleting a referenced entry triggers a validation warning | +| **No delete-time guard** | Deleting a referenced *entry* is not blocked and emits nothing at delete time; the broken reference surfaces as an **error** on the next `contentrain_validate`. (Deleting a whole *model* that others reference is blocked.) | | **Array ordering** | `relations` array order is preserved | | **Min/max** | `relations` supports `min` and `max` element count | diff --git a/docs/studio.md b/docs/studio.md index a1c7220..115336e 100644 --- a/docs/studio.md +++ b/docs/studio.md @@ -1,7 +1,7 @@ --- title: Contentrain Studio description: "Open-core team operations and delivery for the same Git-native content contract used by Contentrain AI" -order: 3 +order: 5 category: getting-started slug: studio --- @@ -14,7 +14,7 @@ In short: > Contentrain AI gives developers local-first packages and agent workflows. Studio gives teams an authenticated web surface for review, collaboration, media, APIs, and CDN delivery on top of the same `.contentrain/` contract. -Teams can self-host the AGPL core or use a managed Pro/Enterprise offering, depending on how much infrastructure and operations they want to own. +Teams can self-host the AGPL core or use the managed plans (Starter/Pro/Enterprise), depending on how much infrastructure and operations they want to own. It is not a separate content format and it is not a different storage engine. Studio sits on top of the same Contentrain model: From 9ecf3042fcbcce0999e0eb5ca5d940387de657ef Mon Sep 17 00:00:00 2001 From: AHMET BAYHAN BAYRAMOGLU <49499275+ABB65@users.noreply.github.com> Date: Fri, 17 Jul 2026 20:18:56 +0300 Subject: [PATCH 2/2] docs: add /llms.txt and build-time /llms-full.txt generation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit llms.txt is a curated index of the AI package surface (packages, key facts, key pages) following the llms.txt convention, cross-linking the Studio docs' own llms.txt. llms-full.txt is generated in the VitePress buildEnd hook — all pages in sidebar order, frontmatter stripped, each with a Source URL — so it exists on every deploy regardless of how the build is invoked and never drifts from the published pages. Pages missing from the order list are appended automatically. Verification: vitepress build clean; dist contains llms.txt (2.9 KB) and llms-full.txt (282 KB, all 22 pages). --- docs/.vitepress/config.ts | 74 +++++++++++++++++++++++++++++++++++++++ docs/public/llms.txt | 48 +++++++++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 docs/public/llms.txt diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index c5503ba..347f800 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -1,6 +1,80 @@ +import { readdirSync, readFileSync, writeFileSync } from 'node:fs' +import { join, relative, resolve } from 'node:path' import { defineConfig } from 'vitepress' +/** + * Preferred order for /llms-full.txt — mirrors the sidebar. Pages not listed + * here are appended afterwards so the corpus stays complete when a page is + * added without updating this list. + */ +const LLMS_PAGE_ORDER = [ + 'index', + 'getting-started', + 'demo', + 'ecosystem', + 'concepts', + 'studio', + 'packages/mcp', + 'packages/cli', + 'packages/sdk', + 'packages/rules', + 'packages/types', + 'guides/providers', + 'guides/http-transport', + 'guides/embedding-mcp', + 'guides/normalize', + 'guides/frameworks', + 'guides/i18n', + 'guides/serve-ui', + 'reference/model-kinds', + 'reference/field-types', + 'reference/config', + 'reference/providers', +] + +function allMarkdownPages(dir: string, root: string): string[] { + const out: string[] = [] + for (const entry of readdirSync(dir, { withFileTypes: true })) { + if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'public') continue + const full = join(dir, entry.name) + if (entry.isDirectory()) out.push(...allMarkdownPages(full, root)) + else if (entry.name.endsWith('.md')) out.push(relative(root, full).replace(/\.md$/, '')) + } + return out +} + +function stripFrontmatter(md: string): { body: string, title?: string } { + const m = /^---\n([\s\S]*?)\n---\n?/.exec(md) + if (!m) return { body: md } + const title = /(?:^|\n)title:\s*["']?([^"'\n]+)["']?/.exec(m[1])?.[1]?.trim() + return { body: md.slice(m[0].length), title } +} + +/** Generate /llms-full.txt into the build output — the whole site as one markdown file. */ +function buildLlmsFull(srcDir: string, outDir: string): void { + const discovered = allMarkdownPages(srcDir, srcDir) + const ordered = [ + ...LLMS_PAGE_ORDER.filter(p => discovered.includes(p)), + ...discovered.filter(p => !LLMS_PAGE_ORDER.includes(p)).toSorted(), + ] + const sections = ordered.map((page) => { + const raw = readFileSync(resolve(srcDir, `${page}.md`), 'utf-8') + const { body, title } = stripFrontmatter(raw) + const heading = title ?? /^#\s+(.+)$/m.exec(body)?.[1] ?? page + const url = page === 'index' ? 'https://ai.contentrain.io/' : `https://ai.contentrain.io/${page}` + return `# ${heading}\nSource: ${url}\n\n${body.trim()}\n` + }) + const header = '# Contentrain AI — Full Documentation\n\n' + + '> The complete ai.contentrain.io documentation as a single markdown file for LLM ingestion. ' + + 'Curated index: https://ai.contentrain.io/llms.txt\n\n' + writeFileSync(join(outDir, 'llms-full.txt'), header + sections.join('\n---\n\n')) +} + export default defineConfig({ + buildEnd(siteConfig) { + buildLlmsFull(siteConfig.srcDir, siteConfig.outDir) + }, + title: 'Contentrain AI', description: 'Extract, govern, and ship structured content from your codebase.', diff --git a/docs/public/llms.txt b/docs/public/llms.txt new file mode 100644 index 0000000..2f8c996 --- /dev/null +++ b/docs/public/llms.txt @@ -0,0 +1,48 @@ +# Contentrain AI Documentation + +> Contentrain AI is the MIT-licensed open-source toolkit for AI-generated content governance: a 24-tool MCP server (@contentrain/mcp), a CLI (contentrain), shared TypeScript types (@contentrain/types), agent rules and skills (@contentrain/rules, @contentrain/skills), and a generated typed query SDK (@contentrain/query). Content lives as canonical JSON/Markdown in your Git repo under .contentrain/ — agents write through deterministic MCP tools, humans review through git branches. + +Full documentation as a single file (for LLMs): https://ai.contentrain.io/llms-full.txt +Contentrain Studio (team web surface) documentation: https://docs.contentrain.io/llms.txt + +## Packages (npm) + +- @contentrain/mcp — MCP server: 24 deterministic tools (19 core + 5 media), stdio + HTTP transports, Local / GitHub / GitLab providers +- contentrain — CLI: init, serve (review UI + MCP transports), validate, generate, diff, merge, prune, studio commands +- @contentrain/query — universal query SDK; `contentrain generate` emits a typed client into .contentrain/client/ (#contentrain imports); optional CDN transport +- @contentrain/types — shared contract: model/field/config/provider types plus pure, browser-safe validate/serialize functions +- @contentrain/rules — always-loaded agent guardrails plus shared quality rules +- @contentrain/skills — 15 on-demand Agent Skills (Agent Skills standard) + +## Key Facts + +- 4 model kinds: collection (object-map by entry id), singleton, dictionary (flat string map), document (markdown + frontmatter) +- 27 field types; content is validated before every write — an error on any entry in a contentrain_content_save call means nothing is committed +- Every write lands on an isolated cr/* git branch; workflow is auto-merge or review (config.json) +- dry_run preview belongs to contentrain_apply (the normalize tool that can patch source); destructive tools require confirm: true +- Locale strategies: file / suffix / directory / none; entry status and scheduling live in .contentrain/meta/, not in content +- MIT licensed, local-first (no cloud dependency); GitHub/GitLab remote providers are optional peer dependencies + +## Key Pages + +- Getting Started: /getting-started +- 2-Minute Demo: /demo +- Ecosystem Map: /ecosystem +- Core Concepts: /concepts +- Contentrain Studio: /studio +- MCP Tools: /packages/mcp +- CLI: /packages/cli +- Query SDK: /packages/sdk +- Rules & Skills: /packages/rules +- Types: /packages/types +- Providers & Transports: /guides/providers +- HTTP Transport: /guides/http-transport +- Embedding MCP: /guides/embedding-mcp +- Normalize Flow: /guides/normalize +- Framework Integration: /guides/frameworks +- i18n Workflow: /guides/i18n +- Serve UI: /guides/serve-ui +- Model Kinds: /reference/model-kinds +- Field Types: /reference/field-types +- Configuration: /reference/config +- RepoProvider Reference: /reference/providers