camox 0.58.1 → 0.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/createBlock.js +1 -1
- package/dist/core/editing/createEditableBlock.js +1 -1
- package/dist/core/lib/recordScope.js +1 -1
- package/dist/features/canvas/CamoxCanvas.js +2 -2
- package/dist/features/canvas/CanvasOverlays.js +1 -1
- package/dist/features/canvas/sidebar/LayoutPageSeo.js +1 -1
- package/dist/features/canvas/sidebar/PageInspector.js +1 -1
- package/dist/features/content/CamoxContent.js +1 -1
- package/dist/features/content/components/MissingFromLocale.js +1 -1
- package/dist/features/page/CuratedPageContent.js +1 -1
- package/dist/features/preview/CamoxPreview.js +3 -3
- package/dist/features/preview/components/AddBlockSheet.js +1 -1
- package/dist/features/preview/components/AssetLightbox.js +1 -1
- package/dist/features/preview/components/BlockActionsPopover.js +1 -1
- package/dist/features/preview/components/CreatePageModal.js +2 -2
- package/dist/features/preview/components/FieldOverlayStyles.js +1 -1
- package/dist/features/preview/components/MobilePreviewDrawer.js +1 -1
- package/dist/features/preview/components/Overlays.js +1 -1
- package/dist/features/preview/components/PageInfo.js +1 -1
- package/dist/features/preview/components/PagePicker.js +1 -1
- package/dist/features/preview/components/PageTree.js +1 -1
- package/dist/features/preview/components/PreviewPanel.js +1 -1
- package/dist/features/preview/components/PreviewToolbar.js +1 -1
- package/dist/features/preview/components/SelectionEditor.js +1 -1
- package/dist/features/preview/components/StudioEditingFallback.js +1 -1
- package/dist/features/provider/AuthenticatedCamoxProvider.js +1 -1
- package/dist/features/provider/CamoxProvider.js +1 -1
- package/dist/features/provider/CoreCamoxProvider.js +3 -3
- package/dist/features/provider/components/CommandPalette.js +1 -1
- package/dist/features/renderer/rendererHost.js +3 -7
- package/dist/features/routes/pageRuntime.d.ts +2 -5
- package/dist/features/routes/pageRuntime.js +1 -2
- package/dist/features/runtime/RuntimeChrome.js +1 -1
- package/dist/features/runtime/navigationTarget.js +1 -2
- package/dist/features/runtime/pageApp.js +1 -1
- package/dist/features/runtime/rendererClient.js +1 -1
- package/dist/features/runtime/runtime.d.ts +0 -5
- package/dist/features/runtime/runtime.js +28 -32
- package/dist/features/runtime/worker.js +3 -3
- package/dist/features/settings/FaviconSettings.js +1 -1
- package/dist/features/studio/CamoxStudio.js +1 -1
- package/dist/features/studio/FollowAgentProvider.js +1 -1
- package/dist/features/studio/components/ChatWidget.js +1 -1
- package/dist/features/studio/components/DraftsControl.js +232 -201
- package/dist/features/studio/components/LocalePicker.js +2 -2
- package/dist/features/studio/components/Navbar.js +3 -3
- package/dist/features/studio/components/Patrol.js +1 -1
- package/dist/features/studio/components/ProjectMenu.js +2 -2
- package/dist/features/studio/components/ReviewDraftSheet.js +9 -15
- package/dist/features/studio/components/ThreadMessages.js +103 -21
- package/dist/features/studio/components/UserButton.js +2 -2
- package/dist/features/studio/draftLabel.js +1 -2
- package/dist/features/studio/draftNotice.js +0 -1
- package/dist/features/studio/showInCanvas.js +1 -1
- package/dist/features/vite/definitionsSync.js +14 -60
- package/dist/features/vite/devSignIn.js +1 -1
- package/dist/features/vite/runtimeDev.js +0 -1
- package/dist/features/vite/vite.d.ts +8 -5
- package/dist/features/vite/vite.js +34 -25
- package/dist/lib/api-client-server.js +25 -8
- package/dist/lib/api-client.js +2 -6
- package/dist/lib/auth.js +1 -1
- package/dist/lib/draft-scope.js +5 -25
- package/dist/lib/preview-handoff.js +1 -1
- package/dist/lib/server-auth-cookie.js +12 -10
- package/dist/lib/studio-reads.js +1 -1
- package/dist/lib/use-thread.js +31 -35
- package/dist/package.js +1 -1
- package/dist/studio.css +1 -1
- package/package.json +4 -4
- package/skills/camox/references/block-definitions.md +1 -1
- package/dist/features/vite/publishSeededContent.js +0 -30
- package/skills/camox-cli/SKILL.md +0 -15
- package/skills/camox-cli/references/cli-common.md +0 -58
- package/skills/camox-cli/references/cli-content.md +0 -181
- package/skills/camox-cli/references/cli-publishing.md +0 -26
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "camox",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.59.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"bin": {
|
|
6
6
|
"camox": "./bin/camox.mjs"
|
|
@@ -135,9 +135,9 @@
|
|
|
135
135
|
"takumi-js": "^2.18.1",
|
|
136
136
|
"unhead": "^3.4.3",
|
|
137
137
|
"zod": "^4.6.7",
|
|
138
|
-
"@camox/cli": "0.
|
|
139
|
-
"@camox/
|
|
140
|
-
"@camox/
|
|
138
|
+
"@camox/cli": "0.59.0",
|
|
139
|
+
"@camox/api-contract": "0.59.0",
|
|
140
|
+
"@camox/ui": "0.59.0"
|
|
141
141
|
},
|
|
142
142
|
"devDependencies": {
|
|
143
143
|
"@earendil-works/pi-ai": "1.3.0",
|
|
@@ -156,7 +156,7 @@ icon: field.icon({ default: "lucide:zap", title: "Icon" })
|
|
|
156
156
|
|
|
157
157
|
Icons are decorative unless given `aria-label` or `aria-labelledby`. Clicking an icon in preview opens the searchable collection picker. Values remain namespaced strings; editors cannot select another collection or an empty value.
|
|
158
158
|
|
|
159
|
-
Run `pnpm exec camox typegen` **before TypeScript checking in CI**, for example `camox typegen && tsc --noEmit`. This resolves Vite config without starting a server
|
|
159
|
+
Run `pnpm exec camox typegen` **before TypeScript checking in CI**, for example `camox typegen && tsc --noEmit`. This resolves Vite config without starting a server. It generates `src/camox/icons.gen.d.ts`; ensure your tsconfig includes it. Dev and build regenerate it automatically. Generation requires network access to the pinned Iconify snapshot.
|
|
160
160
|
|
|
161
161
|
Camox resolves selected SVGs from that same versioned snapshot and serves them through its API. Server rendering preloads selected/default SVGs into hydration data; no visitor requests to Iconify and no rebuild is needed when content changes. Only the editor fetches collection metadata and picker previews, not a whole SVG catalog.
|
|
162
162
|
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
//#region src/features/vite/publishSeededContent.ts
|
|
2
|
-
/**
|
|
3
|
-
* Publishes the content dev mode seeded into the development draft, so a fresh database starts
|
|
4
|
-
* with it on Live and the draft only holds the developer's own changes. Failures are warnings:
|
|
5
|
-
* the content stays in the draft, where it can still be published by hand.
|
|
6
|
-
*/
|
|
7
|
-
async function publishSeededContent(options) {
|
|
8
|
-
const { client, projectUuid, logger } = options;
|
|
9
|
-
try {
|
|
10
|
-
const project = await client.projects.getByUuid({ projectUuid });
|
|
11
|
-
const preview = await client.drafts.previewPublish({ projectId: project.id });
|
|
12
|
-
if (preview.changes.length === 0) return;
|
|
13
|
-
if (preview.blockers.length > 0) {
|
|
14
|
-
const blockers = preview.blockers.map((blocker) => blocker.message).join("; ");
|
|
15
|
-
logger.warn(`[camox] Seeded content stays in your development draft; publishing is blocked: ${blockers}`, { timestamp: true });
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
await client.drafts.publish({
|
|
19
|
-
projectId: project.id,
|
|
20
|
-
token: preview.token,
|
|
21
|
-
publishAnyway: true
|
|
22
|
-
});
|
|
23
|
-
logger.info(`[camox] Published ${preview.changes.length} seeded change${preview.changes.length === 1 ? "" : "s"} to Live`, { timestamp: true });
|
|
24
|
-
} catch (error) {
|
|
25
|
-
logger.warn(`[camox] Publishing seeded content failed: ${String(error)}`, { timestamp: true });
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
//#endregion
|
|
30
|
-
export { publishSeededContent };
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: camox-cli
|
|
3
|
-
description: Use when running the Camox CLI to read or change a Camox project's Pages, Blocks, content, layout assignments or metadata, to preview a change, or to publish or delete the development draft.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Camox CLI
|
|
7
|
-
|
|
8
|
-
For any CLI operation, first read [CLI common guidance](references/cli-common.md), then only the relevant command reference:
|
|
9
|
-
|
|
10
|
-
- Pages, metadata, layout assignments, Blocks, content, or ordering:
|
|
11
|
-
[CLI Content](references/cli-content.md).
|
|
12
|
-
- Where the CLI writes, publishing or deleting the development draft, or its status:
|
|
13
|
-
[CLI Publishing](references/cli-publishing.md).
|
|
14
|
-
|
|
15
|
-
The CLI changes content, never code. To create or change Block or Layout Definitions first, follow the [`camox` skill](../camox/SKILL.md), then wait for the dev server to discover the new definition before placing or assigning it.
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
# Camox CLI common guidance
|
|
2
|
-
|
|
3
|
-
Use the Camox CLI for CRUD operations on Pages, Blocks, Layout assignments, and metadata. Follow the [`camox` skill](../../camox/SKILL.md) instead when changing Block Definitions or Layout Definitions in `src/blocks/` or `src/layouts/`.
|
|
4
|
-
|
|
5
|
-
If a change should be visible without a code deployment, it is usually a CLI content operation. Some requests require both code and CLI work: define the new type first, wait for the dev server to discover it, then create or assign its content through the CLI.
|
|
6
|
-
|
|
7
|
-
## Run the installed CLI
|
|
8
|
-
|
|
9
|
-
Detect the package manager from the closest `package.json#packageManager` or lockfile, then use its local Camox binary:
|
|
10
|
-
|
|
11
|
-
| Package manager | Command |
|
|
12
|
-
| --------------- | ------------ |
|
|
13
|
-
| pnpm | `pnpm camox` |
|
|
14
|
-
| Bun | `bunx camox` |
|
|
15
|
-
| npm | `npx camox` |
|
|
16
|
-
|
|
17
|
-
In the examples below, replace `{{CAMOX_CMD}}` with that command.
|
|
18
|
-
|
|
19
|
-
## Discover the current command surface
|
|
20
|
-
|
|
21
|
-
Before a write, verify the relevant subcommand's `--help` unless already checked for the installed version in this session:
|
|
22
|
-
|
|
23
|
-
```sh
|
|
24
|
-
{{CAMOX_CMD}} pages create --help
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
Use root or group help only to discover unfamiliar commands. Reuse verified help within the session; recheck if the installed version changes. Installed help overrides these examples—do not guess commands or flags.
|
|
28
|
-
|
|
29
|
-
## Dev-first workflow
|
|
30
|
-
|
|
31
|
-
Every command reads and writes the current developer's development draft, never Live. Make content changes there and summarize them for review; they reach Live only when the draft is published (see [CLI Publishing](cli-publishing.md)). Don't publish unless the user asks.
|
|
32
|
-
|
|
33
|
-
- If a command fails with "run the site locally first", the development draft doesn't exist yet: the dev server creates it on its first sync after `camox login`.
|
|
34
|
-
|
|
35
|
-
## Verify changes in a browser
|
|
36
|
-
|
|
37
|
-
CLI credentials and browser sessions are separate. A fresh browser isn't signed in, even when CLI writes succeeded.
|
|
38
|
-
|
|
39
|
-
1. Start the app's dev server and check `{{CAMOX_CMD}} preview --help`.
|
|
40
|
-
2. Generate a handoff for the page you changed:
|
|
41
|
-
`{{CAMOX_CMD}} preview --url http://localhost:3000/about --json`
|
|
42
|
-
(Use the actual port; add `--cwd apps/site` in a monorepo.)
|
|
43
|
-
3. Open the returned `url` in your verification browser, not a separate default browser.
|
|
44
|
-
4. Wait for `[data-camox-preview="ready"]`. Its text identifies the project and the development draft; the server has loaded authenticated content. `[data-camox-preview="error"]` means verification failed, not that the write failed.
|
|
45
|
-
5. Inspect the changed content.
|
|
46
|
-
|
|
47
|
-
The URL is a single-use sign-in credential valid for three minutes. Do not share, commit, or include it in reports. Generate a new URL if expired or consumed. Only loopback HTTP(S) destinations are supported; previewing a deployed site is intentionally unsupported. The SDK must support this handoff: if the ready marker never appears, check the installed SDK version rather than assuming the write failed. A project or backend mismatch requires correcting `--cwd` or `--url` (or restarting a dev server running under another account).
|
|
48
|
-
|
|
49
|
-
## Write grounded content
|
|
50
|
-
|
|
51
|
-
Before writing Content:
|
|
52
|
-
|
|
53
|
-
1. Inspect existing Pages, Blocks, and Block type descriptions to learn the site's voice, positioning, names, and factual claims.
|
|
54
|
-
2. Use facts and copy supplied by the user. Research external facts with an available retrieval tool; ask when a material fact cannot be established.
|
|
55
|
-
3. Never invent filler copy, statistics, testimonials, company details, asset filenames, or URLs.
|
|
56
|
-
4. Leave `File`, `Embed`, or `Image` values empty when no real asset is available, and tell the user what remains to be supplied.
|
|
57
|
-
|
|
58
|
-
After writes, report the affected Pages and Blocks and the notable content or structural changes.
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
# Managing Pages and Blocks with the Camox CLI
|
|
2
|
-
|
|
3
|
-
Read [cli-common.md](cli-common.md) first for `{{CAMOX_CMD}}`, help verification, and the dev-first workflow.
|
|
4
|
-
|
|
5
|
-
Use these commands for Pages, metadata, Layout assignments, Blocks and their Content, and review. To create or change Block or Layout Definitions, follow the [`camox` skill](../../camox/SKILL.md).
|
|
6
|
-
|
|
7
|
-
## Pages
|
|
8
|
-
|
|
9
|
-
### Create a Page with an existing Layout
|
|
10
|
-
|
|
11
|
-
```sh
|
|
12
|
-
{{CAMOX_CMD}} layouts list
|
|
13
|
-
{{CAMOX_CMD}} pages create --path-segment about --layout-id default
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
`--layout-id` takes a Layout's name, the `layoutId` listed by `layouts list`.
|
|
17
|
-
|
|
18
|
-
Use `--parent-page-id <ID>` to nest the Page under another Page.
|
|
19
|
-
|
|
20
|
-
### Read and edit SEO metadata
|
|
21
|
-
|
|
22
|
-
```sh
|
|
23
|
-
{{CAMOX_CMD}} pages get --path /about
|
|
24
|
-
{{CAMOX_CMD}} pages set-seo --path /about --meta-title "About us" --meta-description "Meet the team."
|
|
25
|
-
{{CAMOX_CMD}} pages set-seo --id <PAGE_UUID> --meta-description ""
|
|
26
|
-
{{CAMOX_CMD}} pages set-seo --id <PAGE_UUID> --ai-seo on
|
|
27
|
-
{{CAMOX_CMD}} pages set-seo --id <PAGE_UUID> --ai-seo off
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
`set-seo` accepts exactly one of `--id` or `--path` and requires at least one of
|
|
31
|
-
`--meta-title`, `--meta-description` or `--ai-seo`. The meta title and
|
|
32
|
-
description are one group: writing either field makes both manual, keeping the
|
|
33
|
-
current value of the other, and cannot be combined with `--ai-seo on`.
|
|
34
|
-
`--ai-seo off` keeps current metadata as manual; `--ai-seo on` schedules
|
|
35
|
-
asynchronous generation, so read the Page again to inspect results. An empty
|
|
36
|
-
meta title blocks publishing.
|
|
37
|
-
|
|
38
|
-
Metadata edits apply right away in the development draft. Read metadata
|
|
39
|
-
with `pages get`.
|
|
40
|
-
|
|
41
|
-
## Blocks
|
|
42
|
-
|
|
43
|
-
### Inspect before changing
|
|
44
|
-
|
|
45
|
-
Look up the Page before creating or moving Blocks so you have its `id`, current Blocks, and any sibling ids. Describe the Block type before constructing Content:
|
|
46
|
-
|
|
47
|
-
```sh
|
|
48
|
-
{{CAMOX_CMD}} pages get --path /
|
|
49
|
-
{{CAMOX_CMD}} blocks describe --type hero
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### Find shared navigation and footer Blocks
|
|
53
|
-
|
|
54
|
-
`pages get` returns page-owned Blocks, not the Layout's shared shell. Inspect
|
|
55
|
-
the Layout to discover navigation, footer, and other layout-owned block IDs:
|
|
56
|
-
|
|
57
|
-
```sh
|
|
58
|
-
{{CAMOX_CMD}} layouts list
|
|
59
|
-
{{CAMOX_CMD}} layouts get --layout-id default
|
|
60
|
-
{{CAMOX_CMD}} blocks get --id <BLOCK_UUID>
|
|
61
|
-
{{CAMOX_CMD}} blocks edit --id <BLOCK_UUID> --content '{"title": "Updated title"}'
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Pass the Layout's name, the `layoutId` from `layouts list` (also the Page's
|
|
65
|
-
`layoutId`), to `layouts get --layout-id`. The response
|
|
66
|
-
includes `blocks` with `id`, `type`, `slot`, and Content, plus
|
|
67
|
-
`layout.beforeBlockIds` and `layout.afterBlockIds`. Pass a Block's `id` to
|
|
68
|
-
`blocks get` and `blocks edit`; do not use the Layout ID or Block type.
|
|
69
|
-
Inspect the Block's schema and current Content before editing, and preserve
|
|
70
|
-
repeatable items as described below.
|
|
71
|
-
|
|
72
|
-
Keep `--project` and `--cwd` consistent across the discovery and editing
|
|
73
|
-
commands. Shared shell edits affect every Page using that Layout,
|
|
74
|
-
and synced Block types can share Content across Layouts.
|
|
75
|
-
|
|
76
|
-
### Create and position a Block
|
|
77
|
-
|
|
78
|
-
```sh
|
|
79
|
-
{{CAMOX_CMD}} blocks create --page-id <PAGE_UUID> --type hero --content '{...}' --position first
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
Creation initializes omitted Content and Settings fields from the Block definition's defaults, including when `--content '{}'` is supplied. Explicit values are not replaced by defaults and must satisfy the field's JSON Schema; defaults do not merge into a supplied Link object. Omitted Repeaters initialize their default item count (or minimum count) with item defaults. Supplied arrays use exactly those items and must satisfy `minItems`/`maxItems`; `[]` is accepted only when the minimum allows it. Asset placeholders are not stored. Existing synced Block data still takes precedence for synced types.
|
|
83
|
-
|
|
84
|
-
Content and Settings writes are validated server-side against the development draft's definitions before mutation. Validation errors include field paths. String fields contain Markdown strings (not rich-text JSON objects); Embed fields contain strings matching their pattern. Assets use managed `{ "_fileId": "<file UUIDv7>" }` references, with asset lists stored as arrays of references. Asset normalization drops hydrated URL metadata and converts placeholders to null.
|
|
85
|
-
|
|
86
|
-
Updates validate only submitted fields, so unrelated historical invalid values do not prevent an edit. New records validate after defaults are applied. Unknown properties follow the schema's `additionalProperties` policy (allowed when unspecified); missing definitions retain legacy permissive behavior. Saved snapshots are not retroactively migrated or revalidated when restored.
|
|
87
|
-
|
|
88
|
-
Supply reference-specific copy, links, assets, and items directly as instance Content. Definition defaults should remain neutral, reusable examples—not a way to populate a reference site.
|
|
89
|
-
|
|
90
|
-
`blocks create` and `blocks move` accept the same positioning flags. Pass at most one:
|
|
91
|
-
|
|
92
|
-
| Flag | Meaning |
|
|
93
|
-
| ------------------------- | ----------------------------------------------- |
|
|
94
|
-
| `--position first` | Put the Block first. |
|
|
95
|
-
| `--position last` | Put the Block last; this is the create default. |
|
|
96
|
-
| `--after-id <ID>` | Put it immediately after a sibling Block. |
|
|
97
|
-
| `--before-id <ID>` | Put it immediately before a sibling Block. |
|
|
98
|
-
| `--after-position <KEY>` | Insert after a known fractional-index key. |
|
|
99
|
-
| `--before-position <KEY>` | Insert before a known fractional-index key. |
|
|
100
|
-
|
|
101
|
-
Prefer `--position`, `--after-id`, and `--before-id`. A move requires one positioning flag.
|
|
102
|
-
|
|
103
|
-
### Edit Block Content
|
|
104
|
-
|
|
105
|
-
Content patches merge ordinary fields, so send only fields that should change:
|
|
106
|
-
|
|
107
|
-
```sh
|
|
108
|
-
{{CAMOX_CMD}} pages get --path /pricing
|
|
109
|
-
{{CAMOX_CMD}} blocks edit --id <BLOCK_UUID> --content '{"headline": "New headline"}'
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### Set string fields from files
|
|
113
|
-
|
|
114
|
-
Use `--field-file <NAME>=<PATH>` on `blocks create` and `blocks edit` to set a top-level string field to a file's raw contents, without escaping it into JSON. It suits long Markdown and [Artifact](../../camox/references/artifacts.md) sources. Repeat the flag to set several fields. It merges with `--content`; when both set the same field, the file wins. On `blocks create`, pass `--content`, `--field-file`, or both.
|
|
115
|
-
|
|
116
|
-
```sh
|
|
117
|
-
{{CAMOX_CMD}} blocks edit --id <BLOCK_UUID> --content '{"title": "Orbit"}' --field-file source=./orbit.html
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
Every file is read before anything is written, so a missing or unreadable file fails the command without changing anything.
|
|
121
|
-
|
|
122
|
-
To build an Artifact source, loop until it renders correctly:
|
|
123
|
-
|
|
124
|
-
1. Write the source to a local file, such as `./orbit.html`.
|
|
125
|
-
2. Push it with `blocks edit --id <ID> --field-file <NAME>=./orbit.html` (or `blocks create` for a new Block).
|
|
126
|
-
3. Check the rendered page with `{{CAMOX_CMD}} preview`, following [CLI common guidance](cli-common.md).
|
|
127
|
-
4. Edit the file and push again.
|
|
128
|
-
|
|
129
|
-
### Edit repeatable Content safely
|
|
130
|
-
|
|
131
|
-
A repeatable field's array is replacement-shaped: omitting an existing item deletes it and cascades to its file references, settings, and nested items. Fetch the Block, preserve every existing item with `_itemId`, and add changes only to the intended entries:
|
|
132
|
-
|
|
133
|
-
```sh
|
|
134
|
-
{{CAMOX_CMD}} blocks get --id <BLOCK_UUID>
|
|
135
|
-
|
|
136
|
-
{{CAMOX_CMD}} blocks edit --id <BLOCK_UUID> --content '{
|
|
137
|
-
"items": [
|
|
138
|
-
{"_itemId": "<ITEM_UUID_1>"},
|
|
139
|
-
{"_itemId": "<ITEM_UUID_2>", "answer": "Updated answer."},
|
|
140
|
-
{"_itemId": "<ITEM_UUID_3>"}
|
|
141
|
-
]
|
|
142
|
-
}'
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
The response's `repeatableItems` contains each item's `id`, `fieldName`, `parentItemId`, and Content. Use the same `_itemId` pattern recursively for nested repeatables. Fetch multiple Blocks together when useful:
|
|
146
|
-
|
|
147
|
-
```sh
|
|
148
|
-
{{CAMOX_CMD}} blocks get-many --id <BLOCK_UUID> --id <BLOCK_UUID> --id <BLOCK_UUID>
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
`blocks get-many` returns the same bundle shape as `blocks get`, in requested-id order.
|
|
152
|
-
|
|
153
|
-
## Locales
|
|
154
|
-
|
|
155
|
-
```sh
|
|
156
|
-
{{CAMOX_CMD}} locales list
|
|
157
|
-
{{CAMOX_CMD}} locales add --tag de
|
|
158
|
-
{{CAMOX_CMD}} pages get --path /pricing --locale de
|
|
159
|
-
{{CAMOX_CMD}} blocks edit --id <BLOCK_UUID> --content '{"title":"Hallo"}' --locale de
|
|
160
|
-
{{CAMOX_CMD}} locales remove --tag de
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
Locales are content: adding or removing one changes the development draft, and
|
|
164
|
-
publishing puts the change on Live. Adding a locale gives every Page, Block,
|
|
165
|
-
repeatable item, synced Block and collection record a copy in it, keeping its
|
|
166
|
-
id, which Camox translates in the background. Every later change to the default
|
|
167
|
-
locale is translated into every other locale of the draft; edits made with
|
|
168
|
-
`--locale` aren't translated anywhere. `pages`,
|
|
169
|
-
`blocks edit/get/create/move/delete` and `layouts get` take `--locale <TAG>` to
|
|
170
|
-
read or write that copy; without it they act on the default locale. Removing a locale deletes its content from Live for good once
|
|
171
|
-
published. `locales set-default-tag --tag en-GB` corrects the default locale's
|
|
172
|
-
tag, only while it's the only locale.
|
|
173
|
-
|
|
174
|
-
## Review
|
|
175
|
-
|
|
176
|
-
```sh
|
|
177
|
-
{{CAMOX_CMD}} pages get --path /pricing
|
|
178
|
-
{{CAMOX_CMD}} blocks get --id <BLOCK_UUID>
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
Reads return the content of the development draft, which shows Live wherever it changes nothing. Every edit lands in the development draft right away and reaches Live only when the draft is published (see [CLI Publishing](cli-publishing.md)).
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# Publishing with the Camox CLI
|
|
2
|
-
|
|
3
|
-
Read [cli-common.md](cli-common.md) first for `{{CAMOX_CMD}}`, help verification, and the dev-first workflow.
|
|
4
|
-
|
|
5
|
-
Every command works in the current developer's development draft. Its changes reach Live, the public site, only when the draft is published. Agents in parallel worktrees share their developer's development draft, so publishing or deleting it covers all of their changes.
|
|
6
|
-
|
|
7
|
-
Don't publish or delete unless the user asks you to.
|
|
8
|
-
|
|
9
|
-
```sh
|
|
10
|
-
{{CAMOX_CMD}} status # whether the development draft exists, and how many changes it holds
|
|
11
|
-
{{CAMOX_CMD}} publish # what publishing would do, with a token
|
|
12
|
-
{{CAMOX_CMD}} publish --confirm TOKEN # publish the whole draft to Live
|
|
13
|
-
{{CAMOX_CMD}} delete --yes # empty the development draft; Live is untouched
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
`publish` lists, in order:
|
|
17
|
-
|
|
18
|
-
- **Blockers**: problems to fix in the draft before it can be published, such as an empty required reference or a page without a meta title. Definitions that differ from Live's are blockers too: local code changed a block, layout, or collection, and only a release can ship it to Live. Don't try to fix those through content; tell the user a release is needed.
|
|
19
|
-
- **Conflicts**: content Live changed or deleted since the draft changed it, with who published it and when. Publishing overwrites Live's version.
|
|
20
|
-
- **Lost changes**: changes publishing drops because what they belong to is gone.
|
|
21
|
-
- **Warnings**: the same problems already on Live. They don't block.
|
|
22
|
-
- **Changes**: everything the draft creates, changes, or deletes.
|
|
23
|
-
|
|
24
|
-
Show the user the list, especially conflicts and lost changes, and get their confirmation before passing the token to `publish --confirm`. If Live changed since the list was printed, nothing is published: the command prints the new list with a new token and fails with `CONFLICTS_CHANGED`. Review the new list with the user before confirming again.
|
|
25
|
-
|
|
26
|
-
After publishing, the development draft stays open and empty. `delete` empties it without publishing and can't be undone; it requires `--yes` when not run in a terminal.
|