mdcms init
Interactive wizard that bootstraps a new MDCMS project from an existing repository.
OAuth login
Opens a browser window for authentication using the device flow (same
mechanism as
mdcms login).Directory scanning
Recursively scans the repository for
.md and .mdx files and groups them by
top-level content directories.Locale detection
Analyzes file naming patterns to detect locale suffixes (e.g.
post.en.mdx,
post.fr.mdx) and infers default/supported locale configuration.Schema inference
Parses frontmatter from discovered files to infer content types and their
field schemas using Zod types.
Config generation
Writes
mdcms.config.ts with defineConfig and defineType calls reflecting
all discovered types, directories, and locale settings.Content push
Pushes all discovered content files to the server as draft documents and
writes the initial manifest.
Running
mdcms init in a repository that already has an mdcms.config.ts
will prompt before overwriting.mdcms login
Authenticate with the MDCMS server using a browser-based OAuth flow and store credentials locally.
Start challenge
The CLI sends a login challenge to the server with a cryptographic state parameter and a loopback redirect URI.
Browser authentication
Your default browser opens the server’s authorization page. Complete the login
there.
Receive callback
The CLI listens on a local port for the OAuth callback. The browser redirects
back with an authorization code.
Credential storage
Credentials are stored per server/project/environment combination:- macOS: OS Keychain via the
securityCLI (service:mdcms-cli), with file-based fallback - Other platforms:
~/.mdcms/credentials.jsonwith0600permissions
Authentication precedence
When resolving an API key, the CLI checks these sources in order:--api-keyflagMDCMS_API_KEYenvironment variable- Stored credential profile (from
mdcms login)
Default scopes
The login flow requests the following scopes:mdcms logout
Revoke the stored API key and clear local credentials for the current server/project/environment tuple.
mdcms push
Upload local content changes to the MDCMS server.
| Flag | Description |
|---|---|
--force | Skip all interactive prompts; auto-select all new and deleted files |
--dry-run | Show the push plan without making any API writes |
--validate | Validate frontmatter against the local schema before pushing |
--published | Reserved for future use |
How push works
- Load manifest — Reads
.mdcms.manifest.jsonto determine which documents are tracked locally. - Hash-based change detection — Computes a content hash for each tracked file and compares against the manifest. Only changed files are included in the push plan.
- New file detection — Scans content directories for untracked
.md/.mdxfiles not yet in the manifest. In interactive mode, you select which new files to upload. - Deletion detection — Files present in the manifest but missing from disk are flagged as candidates for server-side deletion.
- Plan summary — The CLI prints a summary of changes, new files, and deletions before writing anything.
- Confirmation — Destructive changes (deletions, overwrites) require explicit confirmation unless
--forceis passed. - Execute — Changed files are uploaded, new documents are created, and deleted documents are removed on the server.
- Update manifest — The local manifest is updated with new document IDs, revision numbers, and hashes.
Concurrency control
Push uses optimistic concurrency via thedraftRevision field. If the server’s current revision does not match the manifest’s recorded revision, the push for that document is rejected. Run mdcms pull to reconcile before retrying.
mdcms pull
Download content from the MDCMS server to your local filesystem.
| Flag | Description |
|---|---|
--published | Pull published snapshots instead of draft heads |
--force | Skip overwrite confirmation for locally modified files |
--dry-run | Show the pull plan without writing any files |
Change categories
The pull command classifies each document into one of these categories:| Category | Behavior |
|---|---|
| Both Modified | Local and server changes detected. Prompts for confirmation before overwriting |
| Server Modified | Server has newer content. File is updated automatically |
| Locally Modified | Only local changes exist. File is skipped (not overwritten) |
| New | Document exists on server but not locally. File is created |
| Moved/Renamed | Server path differs from manifest path. File is moved to the new location |
| Deleted on Server | Document was removed server-side. Prompts for confirmation before deleting the local file |
| Unknown Type | Document type has no matching config entry. Skipped with a warning |
| Unchanged | Content hashes match. No action taken |
Use
--force to skip confirmation prompts in non-interactive environments
(e.g. CI pipelines). Locally modified files will be overwritten.mdcms schema sync
Upload the local schema definition to the MDCMS server.
- Parses
mdcms.config.tsand resolves all type definitions - Applies environment-specific overlays if an
environmentsblock is defined in the config - Builds a schema sync payload and uploads it to the server via
PUT /api/v1/schema - Persists the returned
schemaHashto.mdcms/schema/<project>.<environment>.json
mdcms push to ensure content is validated against the correct schema version.
Overrides
Schema sync respects the standard--project and --environment global flags:
mdcms status
Compare local content and schema state against the server.
- Content drift — Documents that have been modified locally, modified on the server, or are out of sync
- Schema drift — Whether the local schema hash matches the server’s current schema
Drift categories
| Category | Description |
|---|---|
modified_on_server | Server has newer content than the local manifest records |
modified_locally | Local file has changed since last push/pull |
both_modified | Both local and server content have diverged |
new_on_server | Document exists on server but not in the local manifest |
deleted_on_server | Document is in the manifest but no longer on the server |
moved_renamed | Server path differs from the manifest path |
unchanged | Everything is in sync |
Exit codes
| Code | Meaning |
|---|---|
0 | Everything is in sync |
1 | Drift detected (content or schema) |
mdcms migrate
Generate and apply content migrations when the schema changes.
| Flag | Description |
|---|---|
--apply | Execute the generated migration instead of just previewing it |
How migrations work
- Detect schema changes — Compares the current
mdcms.config.tstypes against the server’s active schema - Generate transforms — Creates per-document migration operations (e.g. adding default values for new required fields, renaming fields)
- Preview — Without
--apply, the CLI prints a summary of what would change - Apply — With
--apply, each document is transformed and pushed as a new draft revision. If the document was previously published, a new version is auto-published
Migrations are forward-only. Always review the preview output before running
with
--apply.