@cloudhal/core-contracts 0.3.4 → 0.3.5
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/package.json +1 -1
- package/schemas/.bundled/analytics-beacon.schema.json +0 -132
- package/schemas/.bundled/analytics-event.schema.json +0 -411
- package/schemas/.bundled/asset.schema.json +0 -519
- package/schemas/.bundled/automation.schema.json +0 -334
- package/schemas/.bundled/comment-submission.schema.json +0 -172
- package/schemas/.bundled/comment.schema.json +0 -425
- package/schemas/.bundled/content-entry.schema.json +0 -514
- package/schemas/.bundled/glossary.schema.json +0 -139
- package/schemas/.bundled/menu.schema.json +0 -371
- package/schemas/.bundled/page.schema.json +0 -738
- package/schemas/.bundled/project.schema.json +0 -97
- package/schemas/.bundled/redirect.schema.json +0 -152
- package/schemas/.bundled/release.schema.json +0 -639
- package/schemas/.bundled/schedule-run.schema.json +0 -310
- package/schemas/.bundled/section.schema.json +0 -434
- package/schemas/.bundled/site.schema.json +0 -1050
- package/schemas/.bundled/skill-manifest.schema.json +0 -51
- package/schemas/.bundled/snapshot.schema.json +0 -192
- package/schemas/.bundled/taxonomy.schema.json +0 -200
- package/schemas/.bundled/term.schema.json +0 -315
|
@@ -1,514 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "https://cloudhal.dev/schemas/v1/content-entry.schema.json",
|
|
4
|
-
"title": "ContentEntry",
|
|
5
|
-
"description": "A structured content item in a named collection (e.g. collection 'posts'). Core fields are typed; collection-specific fields live in `fields` and are validated by the collection's own schema in a later phase.",
|
|
6
|
-
"type": "object",
|
|
7
|
-
"additionalProperties": false,
|
|
8
|
-
"required": [
|
|
9
|
-
"schemaVersion",
|
|
10
|
-
"id",
|
|
11
|
-
"siteId",
|
|
12
|
-
"collection",
|
|
13
|
-
"slug",
|
|
14
|
-
"locale",
|
|
15
|
-
"status",
|
|
16
|
-
"title",
|
|
17
|
-
"body",
|
|
18
|
-
"fields",
|
|
19
|
-
"tags",
|
|
20
|
-
"author",
|
|
21
|
-
"rev",
|
|
22
|
-
"createdAt",
|
|
23
|
-
"updatedAt"
|
|
24
|
-
],
|
|
25
|
-
"properties": {
|
|
26
|
-
"schemaVersion": {
|
|
27
|
-
"$ref": "#/$defs/SchemaVersion"
|
|
28
|
-
},
|
|
29
|
-
"id": {
|
|
30
|
-
"$ref": "#/$defs/Id"
|
|
31
|
-
},
|
|
32
|
-
"siteId": {
|
|
33
|
-
"$ref": "#/$defs/Id"
|
|
34
|
-
},
|
|
35
|
-
"collection": {
|
|
36
|
-
"$ref": "#/$defs/Slug"
|
|
37
|
-
},
|
|
38
|
-
"slug": {
|
|
39
|
-
"$ref": "#/$defs/Slug"
|
|
40
|
-
},
|
|
41
|
-
"locale": {
|
|
42
|
-
"$ref": "#/$defs/Locale"
|
|
43
|
-
},
|
|
44
|
-
"status": {
|
|
45
|
-
"$ref": "#/$defs/PublishStatus"
|
|
46
|
-
},
|
|
47
|
-
"title": {
|
|
48
|
-
"type": "string",
|
|
49
|
-
"minLength": 1,
|
|
50
|
-
"maxLength": 300
|
|
51
|
-
},
|
|
52
|
-
"summary": {
|
|
53
|
-
"type": "string",
|
|
54
|
-
"maxLength": 2000
|
|
55
|
-
},
|
|
56
|
-
"body": {
|
|
57
|
-
"$ref": "#/$defs/Body"
|
|
58
|
-
},
|
|
59
|
-
"fields": {
|
|
60
|
-
"type": "object",
|
|
61
|
-
"description": "Collection-specific values; any JSON.",
|
|
62
|
-
"additionalProperties": true
|
|
63
|
-
},
|
|
64
|
-
"tags": {
|
|
65
|
-
"type": "array",
|
|
66
|
-
"description": "Deprecated by RFC-0002: use `terms.tag`. Still accepted on input for one release and translated into terms; the store then writes []. Removed in schemaVersion 2.",
|
|
67
|
-
"deprecated": true,
|
|
68
|
-
"items": {
|
|
69
|
-
"$ref": "#/$defs/Slug"
|
|
70
|
-
},
|
|
71
|
-
"uniqueItems": true,
|
|
72
|
-
"maxItems": 50
|
|
73
|
-
},
|
|
74
|
-
"terms": {
|
|
75
|
-
"type": "object",
|
|
76
|
-
"description": "Term assignments by taxonomy key (e.g. 'category', 'tag'). Terms are referenced by id, independent of locale. A taxonomy without terms is omitted, never an empty object.",
|
|
77
|
-
"propertyNames": {
|
|
78
|
-
"$ref": "#/$defs/Slug"
|
|
79
|
-
},
|
|
80
|
-
"minProperties": 1,
|
|
81
|
-
"maxProperties": 10,
|
|
82
|
-
"additionalProperties": {
|
|
83
|
-
"$ref": "#/$defs/TermAssignment"
|
|
84
|
-
}
|
|
85
|
-
},
|
|
86
|
-
"author": {
|
|
87
|
-
"$ref": "#/$defs/Actor"
|
|
88
|
-
},
|
|
89
|
-
"coverImage": {
|
|
90
|
-
"$ref": "#/$defs/ImageRef"
|
|
91
|
-
},
|
|
92
|
-
"publishedAt": {
|
|
93
|
-
"$ref": "#/$defs/Timestamp"
|
|
94
|
-
},
|
|
95
|
-
"availability": {
|
|
96
|
-
"$ref": "#/$defs/Availability"
|
|
97
|
-
},
|
|
98
|
-
"rev": {
|
|
99
|
-
"$ref": "#/$defs/Revision"
|
|
100
|
-
},
|
|
101
|
-
"createdAt": {
|
|
102
|
-
"$ref": "#/$defs/Timestamp"
|
|
103
|
-
},
|
|
104
|
-
"updatedAt": {
|
|
105
|
-
"$ref": "#/$defs/Timestamp"
|
|
106
|
-
},
|
|
107
|
-
"translation": {
|
|
108
|
-
"$ref": "#/$defs/Translation"
|
|
109
|
-
},
|
|
110
|
-
"metadata": {
|
|
111
|
-
"$ref": "#/$defs/Metadata"
|
|
112
|
-
},
|
|
113
|
-
"corrections": {
|
|
114
|
-
"type": "array",
|
|
115
|
-
"description": "Corrections, clarifications and updates appended to the entry, oldest first (RFC-0019 §2). The store stamps `at`; an item that has been live can no longer be removed, and only a person may edit its note.",
|
|
116
|
-
"items": {
|
|
117
|
-
"$ref": "#/$defs/Correction"
|
|
118
|
-
},
|
|
119
|
-
"maxItems": 100
|
|
120
|
-
}
|
|
121
|
-
},
|
|
122
|
-
"$defs": {
|
|
123
|
-
"Actor": {
|
|
124
|
-
"type": "object",
|
|
125
|
-
"additionalProperties": false,
|
|
126
|
-
"required": [
|
|
127
|
-
"kind",
|
|
128
|
-
"id"
|
|
129
|
-
],
|
|
130
|
-
"properties": {
|
|
131
|
-
"kind": {
|
|
132
|
-
"$ref": "#/$defs/ActorKind"
|
|
133
|
-
},
|
|
134
|
-
"id": {
|
|
135
|
-
"$ref": "#/$defs/Id"
|
|
136
|
-
},
|
|
137
|
-
"name": {
|
|
138
|
-
"type": "string",
|
|
139
|
-
"maxLength": 200
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
},
|
|
143
|
-
"ActorKind": {
|
|
144
|
-
"type": "string",
|
|
145
|
-
"description": "Who performed an action. Humans and agents share one actor model so the policy engine treats them uniformly.",
|
|
146
|
-
"enum": [
|
|
147
|
-
"human",
|
|
148
|
-
"agent",
|
|
149
|
-
"system"
|
|
150
|
-
]
|
|
151
|
-
},
|
|
152
|
-
"Availability": {
|
|
153
|
-
"type": "object",
|
|
154
|
-
"description": "Time gates of a page or content entry (RFC-0008): the published site shows the node only from `from` (inclusive: an embargo) until `until` (exclusive: an expiry), checked at render time, so the gates hold even when no scheduler runs. Before `from` and from `until` on, the node is absent from every public route, list, feed, sitemap and search output; previews still show it. At least one gate; writers check that `from` is before `until`.",
|
|
155
|
-
"additionalProperties": false,
|
|
156
|
-
"minProperties": 1,
|
|
157
|
-
"properties": {
|
|
158
|
-
"from": {
|
|
159
|
-
"$ref": "#/$defs/Timestamp"
|
|
160
|
-
},
|
|
161
|
-
"until": {
|
|
162
|
-
"$ref": "#/$defs/Timestamp"
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
},
|
|
166
|
-
"Body": {
|
|
167
|
-
"type": "object",
|
|
168
|
-
"additionalProperties": false,
|
|
169
|
-
"required": [
|
|
170
|
-
"format",
|
|
171
|
-
"value"
|
|
172
|
-
],
|
|
173
|
-
"properties": {
|
|
174
|
-
"format": {
|
|
175
|
-
"type": "string",
|
|
176
|
-
"enum": [
|
|
177
|
-
"markdown",
|
|
178
|
-
"html"
|
|
179
|
-
]
|
|
180
|
-
},
|
|
181
|
-
"value": {
|
|
182
|
-
"type": "string",
|
|
183
|
-
"maxLength": 1000000
|
|
184
|
-
},
|
|
185
|
-
"profile": {
|
|
186
|
-
"$ref": "#/$defs/BodyProfile"
|
|
187
|
-
},
|
|
188
|
-
"blocks": {
|
|
189
|
-
"$ref": "#/$defs/BodyBlocks"
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
},
|
|
193
|
-
"BodyBlock": {
|
|
194
|
-
"type": "object",
|
|
195
|
-
"description": "One top-level block of a markdown body in the store's index (RFC-0014 §3). Written by the store only: a client's values are replaced on every write. `by`, `via` and `at` say who last changed the block's content, through which channel and when; they are absent for content written before the index existed.",
|
|
196
|
-
"additionalProperties": false,
|
|
197
|
-
"required": [
|
|
198
|
-
"id",
|
|
199
|
-
"hash"
|
|
200
|
-
],
|
|
201
|
-
"properties": {
|
|
202
|
-
"id": {
|
|
203
|
-
"type": "string",
|
|
204
|
-
"pattern": "^blk_[0-9A-Za-z]{8,24}$",
|
|
205
|
-
"description": "Stable across writes that keep the block's content or its place among unchanged blocks."
|
|
206
|
-
},
|
|
207
|
-
"hash": {
|
|
208
|
-
"type": "string",
|
|
209
|
-
"pattern": "^[0-9a-f]{64}$",
|
|
210
|
-
"description": "SHA-256 (hex) of the block's markdown without trailing whitespace."
|
|
211
|
-
},
|
|
212
|
-
"by": {
|
|
213
|
-
"$ref": "#/$defs/Actor"
|
|
214
|
-
},
|
|
215
|
-
"via": {
|
|
216
|
-
"type": "string",
|
|
217
|
-
"enum": [
|
|
218
|
-
"studio",
|
|
219
|
-
"mcp",
|
|
220
|
-
"api",
|
|
221
|
-
"import",
|
|
222
|
-
"ai-command",
|
|
223
|
-
"proposal"
|
|
224
|
-
],
|
|
225
|
-
"description": "The channel of that change."
|
|
226
|
-
},
|
|
227
|
-
"at": {
|
|
228
|
-
"$ref": "#/$defs/Timestamp"
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
},
|
|
232
|
-
"BodyBlocks": {
|
|
233
|
-
"type": "array",
|
|
234
|
-
"description": "A markdown body's block index, in body order (RFC-0014 §3). Absent means not indexed (yet, or an HTML body), never empty.",
|
|
235
|
-
"maxItems": 5000,
|
|
236
|
-
"items": {
|
|
237
|
-
"$ref": "#/$defs/BodyBlock"
|
|
238
|
-
}
|
|
239
|
-
},
|
|
240
|
-
"BodyProfile": {
|
|
241
|
-
"type": "integer",
|
|
242
|
-
"enum": [
|
|
243
|
-
1
|
|
244
|
-
],
|
|
245
|
-
"description": "The markdown dialect a body follows (RFC-0014 §1): 1 = Cloudhal Markdown v1 (CommonMark + GFM + `asset:` + directives; raw HTML escaped). Set by the store on markdown bodies."
|
|
246
|
-
},
|
|
247
|
-
"Correction": {
|
|
248
|
-
"type": "object",
|
|
249
|
-
"description": "One correction notice (RFC-0019 §2).",
|
|
250
|
-
"additionalProperties": false,
|
|
251
|
-
"required": [
|
|
252
|
-
"id",
|
|
253
|
-
"kind",
|
|
254
|
-
"at",
|
|
255
|
-
"note"
|
|
256
|
-
],
|
|
257
|
-
"properties": {
|
|
258
|
-
"id": {
|
|
259
|
-
"$ref": "#/$defs/Id"
|
|
260
|
-
},
|
|
261
|
-
"kind": {
|
|
262
|
-
"type": "string",
|
|
263
|
-
"enum": [
|
|
264
|
-
"correction",
|
|
265
|
-
"clarification",
|
|
266
|
-
"update"
|
|
267
|
-
]
|
|
268
|
-
},
|
|
269
|
-
"at": {
|
|
270
|
-
"$ref": "#/$defs/Timestamp",
|
|
271
|
-
"description": "When it was written; set by the store, never by the caller."
|
|
272
|
-
},
|
|
273
|
-
"note": {
|
|
274
|
-
"type": "string",
|
|
275
|
-
"description": "What changed, in markdown (inline).",
|
|
276
|
-
"minLength": 1,
|
|
277
|
-
"maxLength": 2000
|
|
278
|
-
},
|
|
279
|
-
"snapshotId": {
|
|
280
|
-
"$ref": "#/$defs/Id",
|
|
281
|
-
"description": "The snapshot it was first published in."
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
},
|
|
285
|
-
"Id": {
|
|
286
|
-
"type": "string",
|
|
287
|
-
"description": "Prefixed, URL-safe identifier, e.g. site_01HZX8K3Q9. The prefix names the entity kind; agents and the MCP server pass these as opaque handles.",
|
|
288
|
-
"pattern": "^[a-z]+_[A-Za-z0-9]{6,32}$",
|
|
289
|
-
"minLength": 8,
|
|
290
|
-
"maxLength": 48
|
|
291
|
-
},
|
|
292
|
-
"ImageRef": {
|
|
293
|
-
"type": "object",
|
|
294
|
-
"description": "Reference to an image. With `assetId` the image is an Asset node (RFC-0004): the store writes its media URL into `src`, and its size into `width` and `height`, as a fallback for readers that do not resolve assets. Without it, `src` is a relative path or an absolute URL, as before.",
|
|
295
|
-
"additionalProperties": false,
|
|
296
|
-
"required": [
|
|
297
|
-
"src",
|
|
298
|
-
"alt"
|
|
299
|
-
],
|
|
300
|
-
"properties": {
|
|
301
|
-
"assetId": {
|
|
302
|
-
"$ref": "#/$defs/Id",
|
|
303
|
-
"description": "The Asset node shown (RFC-0004). Renderers that know assets resolve it and ignore `src`."
|
|
304
|
-
},
|
|
305
|
-
"src": {
|
|
306
|
-
"type": "string",
|
|
307
|
-
"minLength": 1,
|
|
308
|
-
"maxLength": 2048
|
|
309
|
-
},
|
|
310
|
-
"alt": {
|
|
311
|
-
"type": "string",
|
|
312
|
-
"maxLength": 500
|
|
313
|
-
},
|
|
314
|
-
"width": {
|
|
315
|
-
"type": "integer",
|
|
316
|
-
"minimum": 1
|
|
317
|
-
},
|
|
318
|
-
"height": {
|
|
319
|
-
"type": "integer",
|
|
320
|
-
"minimum": 1
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
},
|
|
324
|
-
"Locale": {
|
|
325
|
-
"type": "string",
|
|
326
|
-
"description": "BCP 47 language tag, e.g. en, tr, en-US.",
|
|
327
|
-
"pattern": "^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
|
|
328
|
-
},
|
|
329
|
-
"Metadata": {
|
|
330
|
-
"type": "object",
|
|
331
|
-
"description": "Free-form string-to-string map for extensions. Keys should be namespaced (e.g. cloudhal.source).",
|
|
332
|
-
"additionalProperties": {
|
|
333
|
-
"type": "string"
|
|
334
|
-
}
|
|
335
|
-
},
|
|
336
|
-
"PublishStatus": {
|
|
337
|
-
"type": "string",
|
|
338
|
-
"description": "Editorial lifecycle of a page or content entry.",
|
|
339
|
-
"enum": [
|
|
340
|
-
"draft",
|
|
341
|
-
"review",
|
|
342
|
-
"published",
|
|
343
|
-
"archived"
|
|
344
|
-
]
|
|
345
|
-
},
|
|
346
|
-
"Revision": {
|
|
347
|
-
"type": "integer",
|
|
348
|
-
"description": "Monotonic per-node revision used for optimistic locking (compare-and-swap on write).",
|
|
349
|
-
"minimum": 0
|
|
350
|
-
},
|
|
351
|
-
"SchemaVersion": {
|
|
352
|
-
"type": "integer",
|
|
353
|
-
"description": "Version of this contract. Readers reject unknown versions; migrations move documents forward one version at a time.",
|
|
354
|
-
"enum": [
|
|
355
|
-
1
|
|
356
|
-
]
|
|
357
|
-
},
|
|
358
|
-
"Slug": {
|
|
359
|
-
"type": "string",
|
|
360
|
-
"description": "Lower-case URL segment.",
|
|
361
|
-
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
362
|
-
"minLength": 1,
|
|
363
|
-
"maxLength": 128
|
|
364
|
-
},
|
|
365
|
-
"TermAssignment": {
|
|
366
|
-
"type": "object",
|
|
367
|
-
"description": "Terms of one taxonomy on one entry, in display order. The primary term is explicit and never derived from the order.",
|
|
368
|
-
"additionalProperties": false,
|
|
369
|
-
"required": [
|
|
370
|
-
"ids"
|
|
371
|
-
],
|
|
372
|
-
"properties": {
|
|
373
|
-
"ids": {
|
|
374
|
-
"type": "array",
|
|
375
|
-
"items": {
|
|
376
|
-
"$ref": "#/$defs/Id"
|
|
377
|
-
},
|
|
378
|
-
"minItems": 1,
|
|
379
|
-
"maxItems": 50,
|
|
380
|
-
"uniqueItems": true
|
|
381
|
-
},
|
|
382
|
-
"primary": {
|
|
383
|
-
"$ref": "#/$defs/Id",
|
|
384
|
-
"description": "The entry's main term in this taxonomy (breadcrumbs, articleSection, later permalinks). Must be one of `ids`."
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
},
|
|
388
|
-
"Timestamp": {
|
|
389
|
-
"type": "string",
|
|
390
|
-
"description": "RFC 3339 / ISO 8601 instant in UTC.",
|
|
391
|
-
"format": "date-time"
|
|
392
|
-
},
|
|
393
|
-
"Translation": {
|
|
394
|
-
"type": "object",
|
|
395
|
-
"description": "Links a page or entry to the other language versions of the same work (RFC-0033 §2). Staleness is computed: the source's current hash differs from source.hash.",
|
|
396
|
-
"additionalProperties": false,
|
|
397
|
-
"required": [
|
|
398
|
-
"group",
|
|
399
|
-
"method"
|
|
400
|
-
],
|
|
401
|
-
"properties": {
|
|
402
|
-
"group": {
|
|
403
|
-
"$ref": "#/$defs/Id",
|
|
404
|
-
"description": "The group's id: the original node's id, shared by every translation. May cross sites in one project."
|
|
405
|
-
},
|
|
406
|
-
"method": {
|
|
407
|
-
"$ref": "#/$defs/TranslationMethod"
|
|
408
|
-
},
|
|
409
|
-
"layout": {
|
|
410
|
-
"type": "string",
|
|
411
|
-
"description": "linked: the original's structural changes propagate to this translation as drafts (RFC-0033 §4a); independent: nothing propagates. Absent means linked.",
|
|
412
|
-
"enum": [
|
|
413
|
-
"linked",
|
|
414
|
-
"independent"
|
|
415
|
-
]
|
|
416
|
-
},
|
|
417
|
-
"source": {
|
|
418
|
-
"type": "object",
|
|
419
|
-
"description": "The node and revision this translation was made from. Absent on the original.",
|
|
420
|
-
"additionalProperties": false,
|
|
421
|
-
"required": [
|
|
422
|
-
"id",
|
|
423
|
-
"locale",
|
|
424
|
-
"rev",
|
|
425
|
-
"hash"
|
|
426
|
-
],
|
|
427
|
-
"properties": {
|
|
428
|
-
"id": {
|
|
429
|
-
"$ref": "#/$defs/Id"
|
|
430
|
-
},
|
|
431
|
-
"siteId": {
|
|
432
|
-
"$ref": "#/$defs/Id",
|
|
433
|
-
"description": "The source's site when it is another site of the same project (a language edition). Absent means this site."
|
|
434
|
-
},
|
|
435
|
-
"locale": {
|
|
436
|
-
"$ref": "#/$defs/Locale"
|
|
437
|
-
},
|
|
438
|
-
"rev": {
|
|
439
|
-
"$ref": "#/$defs/Revision"
|
|
440
|
-
},
|
|
441
|
-
"hash": {
|
|
442
|
-
"type": "string",
|
|
443
|
-
"description": "Lower-case hex SHA-256 of the source node's canonical JSON at that revision.",
|
|
444
|
-
"pattern": "^[0-9a-f]{64}$"
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
},
|
|
448
|
-
"provenance": {
|
|
449
|
-
"type": "object",
|
|
450
|
-
"description": "The machine-translation record: engine, glossary revision, checks run, quality score. Required when method is machine or machine-reviewed.",
|
|
451
|
-
"additionalProperties": false,
|
|
452
|
-
"required": [
|
|
453
|
-
"engine",
|
|
454
|
-
"at"
|
|
455
|
-
],
|
|
456
|
-
"properties": {
|
|
457
|
-
"engine": {
|
|
458
|
-
"type": "string",
|
|
459
|
-
"minLength": 1,
|
|
460
|
-
"maxLength": 200
|
|
461
|
-
},
|
|
462
|
-
"glossaryRev": {
|
|
463
|
-
"$ref": "#/$defs/Revision"
|
|
464
|
-
},
|
|
465
|
-
"score": {
|
|
466
|
-
"type": "number",
|
|
467
|
-
"minimum": 0,
|
|
468
|
-
"maximum": 100
|
|
469
|
-
},
|
|
470
|
-
"checks": {
|
|
471
|
-
"type": "array",
|
|
472
|
-
"items": {
|
|
473
|
-
"type": "string",
|
|
474
|
-
"minLength": 1,
|
|
475
|
-
"maxLength": 100
|
|
476
|
-
},
|
|
477
|
-
"maxItems": 50
|
|
478
|
-
},
|
|
479
|
-
"at": {
|
|
480
|
-
"$ref": "#/$defs/Timestamp"
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
},
|
|
484
|
-
"review": {
|
|
485
|
-
"type": "object",
|
|
486
|
-
"description": "The person who reviewed this translation and when. Only humans set it.",
|
|
487
|
-
"additionalProperties": false,
|
|
488
|
-
"required": [
|
|
489
|
-
"by",
|
|
490
|
-
"at"
|
|
491
|
-
],
|
|
492
|
-
"properties": {
|
|
493
|
-
"by": {
|
|
494
|
-
"$ref": "#/$defs/Actor"
|
|
495
|
-
},
|
|
496
|
-
"at": {
|
|
497
|
-
"$ref": "#/$defs/Timestamp"
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
},
|
|
503
|
-
"TranslationMethod": {
|
|
504
|
-
"type": "string",
|
|
505
|
-
"description": "How a page's or entry's text came to be (RFC-0033). 'original' marks the source of a translation group; 'machine-reviewed' is machine output a person has reviewed.",
|
|
506
|
-
"enum": [
|
|
507
|
-
"original",
|
|
508
|
-
"human",
|
|
509
|
-
"machine",
|
|
510
|
-
"machine-reviewed"
|
|
511
|
-
]
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
}
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "https://cloudhal.dev/schemas/v1/glossary.schema.json",
|
|
4
|
-
"title": "Glossary",
|
|
5
|
-
"description": "A site's translation glossary (RFC-0033 §2): terms with their approved translation per locale, and terms never to translate (brand and product names). Agents translating content read it as hard constraints; the checks flag drafts that break it. One per site, snapshotted like every node.",
|
|
6
|
-
"type": "object",
|
|
7
|
-
"additionalProperties": false,
|
|
8
|
-
"required": [
|
|
9
|
-
"schemaVersion",
|
|
10
|
-
"id",
|
|
11
|
-
"siteId",
|
|
12
|
-
"entries",
|
|
13
|
-
"rev",
|
|
14
|
-
"createdAt",
|
|
15
|
-
"updatedAt"
|
|
16
|
-
],
|
|
17
|
-
"properties": {
|
|
18
|
-
"schemaVersion": {
|
|
19
|
-
"$ref": "#/$defs/SchemaVersion"
|
|
20
|
-
},
|
|
21
|
-
"id": {
|
|
22
|
-
"$ref": "#/$defs/Id"
|
|
23
|
-
},
|
|
24
|
-
"siteId": {
|
|
25
|
-
"$ref": "#/$defs/Id"
|
|
26
|
-
},
|
|
27
|
-
"entries": {
|
|
28
|
-
"type": "array",
|
|
29
|
-
"description": "Unique by term (case-insensitive); order is the editor's.",
|
|
30
|
-
"items": {
|
|
31
|
-
"$ref": "#/$defs/GlossaryEntry"
|
|
32
|
-
},
|
|
33
|
-
"maxItems": 2000
|
|
34
|
-
},
|
|
35
|
-
"rev": {
|
|
36
|
-
"$ref": "#/$defs/Revision"
|
|
37
|
-
},
|
|
38
|
-
"createdAt": {
|
|
39
|
-
"$ref": "#/$defs/Timestamp"
|
|
40
|
-
},
|
|
41
|
-
"updatedAt": {
|
|
42
|
-
"$ref": "#/$defs/Timestamp"
|
|
43
|
-
},
|
|
44
|
-
"metadata": {
|
|
45
|
-
"$ref": "#/$defs/Metadata"
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
"$defs": {
|
|
49
|
-
"GlossaryEntry": {
|
|
50
|
-
"type": "object",
|
|
51
|
-
"additionalProperties": false,
|
|
52
|
-
"required": [
|
|
53
|
-
"term"
|
|
54
|
-
],
|
|
55
|
-
"properties": {
|
|
56
|
-
"term": {
|
|
57
|
-
"type": "string",
|
|
58
|
-
"description": "The term as written in the site's default locale.",
|
|
59
|
-
"minLength": 1,
|
|
60
|
-
"maxLength": 200
|
|
61
|
-
},
|
|
62
|
-
"note": {
|
|
63
|
-
"type": "string",
|
|
64
|
-
"description": "Context for translators and agents: meaning, part of speech, where it appears.",
|
|
65
|
-
"maxLength": 500
|
|
66
|
-
},
|
|
67
|
-
"doNotTranslate": {
|
|
68
|
-
"type": "boolean",
|
|
69
|
-
"description": "Keep the term as written in every locale (brand, product or proper names). Such an entry has no translations."
|
|
70
|
-
},
|
|
71
|
-
"caseSensitive": {
|
|
72
|
-
"type": "boolean",
|
|
73
|
-
"description": "Match the term only with this exact capitalisation."
|
|
74
|
-
},
|
|
75
|
-
"translations": {
|
|
76
|
-
"type": "object",
|
|
77
|
-
"description": "The approved translation per locale (never the default locale).",
|
|
78
|
-
"propertyNames": {
|
|
79
|
-
"$ref": "#/$defs/Locale"
|
|
80
|
-
},
|
|
81
|
-
"additionalProperties": {
|
|
82
|
-
"type": "object",
|
|
83
|
-
"additionalProperties": false,
|
|
84
|
-
"required": [
|
|
85
|
-
"text"
|
|
86
|
-
],
|
|
87
|
-
"properties": {
|
|
88
|
-
"text": {
|
|
89
|
-
"type": "string",
|
|
90
|
-
"minLength": 1,
|
|
91
|
-
"maxLength": 200
|
|
92
|
-
},
|
|
93
|
-
"note": {
|
|
94
|
-
"type": "string",
|
|
95
|
-
"maxLength": 500
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
},
|
|
102
|
-
"Id": {
|
|
103
|
-
"type": "string",
|
|
104
|
-
"description": "Prefixed, URL-safe identifier, e.g. site_01HZX8K3Q9. The prefix names the entity kind; agents and the MCP server pass these as opaque handles.",
|
|
105
|
-
"pattern": "^[a-z]+_[A-Za-z0-9]{6,32}$",
|
|
106
|
-
"minLength": 8,
|
|
107
|
-
"maxLength": 48
|
|
108
|
-
},
|
|
109
|
-
"Locale": {
|
|
110
|
-
"type": "string",
|
|
111
|
-
"description": "BCP 47 language tag, e.g. en, tr, en-US.",
|
|
112
|
-
"pattern": "^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
|
|
113
|
-
},
|
|
114
|
-
"Metadata": {
|
|
115
|
-
"type": "object",
|
|
116
|
-
"description": "Free-form string-to-string map for extensions. Keys should be namespaced (e.g. cloudhal.source).",
|
|
117
|
-
"additionalProperties": {
|
|
118
|
-
"type": "string"
|
|
119
|
-
}
|
|
120
|
-
},
|
|
121
|
-
"Revision": {
|
|
122
|
-
"type": "integer",
|
|
123
|
-
"description": "Monotonic per-node revision used for optimistic locking (compare-and-swap on write).",
|
|
124
|
-
"minimum": 0
|
|
125
|
-
},
|
|
126
|
-
"SchemaVersion": {
|
|
127
|
-
"type": "integer",
|
|
128
|
-
"description": "Version of this contract. Readers reject unknown versions; migrations move documents forward one version at a time.",
|
|
129
|
-
"enum": [
|
|
130
|
-
1
|
|
131
|
-
]
|
|
132
|
-
},
|
|
133
|
-
"Timestamp": {
|
|
134
|
-
"type": "string",
|
|
135
|
-
"description": "RFC 3339 / ISO 8601 instant in UTC.",
|
|
136
|
-
"format": "date-time"
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|