@se-studio/contentful-cms 3.14.0 → 3.15.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/CHANGELOG.md +20 -0
- package/README.md +6 -2
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +15 -101
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/asset.d.ts.map +1 -1
- package/dist/commands/asset.js +310 -3
- package/dist/commands/asset.js.map +1 -1
- package/dist/commands/create-taxonomy.d.ts +11 -0
- package/dist/commands/create-taxonomy.d.ts.map +1 -1
- package/dist/commands/create-taxonomy.js +45 -4
- package/dist/commands/create-taxonomy.js.map +1 -1
- package/dist/contentful/asset-concepts.d.ts +53 -0
- package/dist/contentful/asset-concepts.d.ts.map +1 -0
- package/dist/contentful/asset-concepts.js +137 -0
- package/dist/contentful/asset-concepts.js.map +1 -0
- package/dist/contentful/asset-replace.d.ts +29 -0
- package/dist/contentful/asset-replace.d.ts.map +1 -0
- package/dist/contentful/asset-replace.js +57 -0
- package/dist/contentful/asset-replace.js.map +1 -0
- package/dist/contentful/assets.d.ts +11 -0
- package/dist/contentful/assets.d.ts.map +1 -1
- package/dist/contentful/assets.js +48 -2
- package/dist/contentful/assets.js.map +1 -1
- package/dist/contentful/client.d.ts +9 -0
- package/dist/contentful/client.d.ts.map +1 -1
- package/dist/contentful/client.js +27 -0
- package/dist/contentful/client.js.map +1 -1
- package/dist/contentful/cma-user-agent.d.ts +1 -1
- package/dist/contentful/entry-fields.d.ts +10 -0
- package/dist/contentful/entry-fields.d.ts.map +1 -1
- package/dist/contentful/entry-fields.js +23 -1
- package/dist/contentful/entry-fields.js.map +1 -1
- package/dist/contentful/linkedEntryFields.d.ts.map +1 -1
- package/dist/contentful/linkedEntryFields.js +1 -0
- package/dist/contentful/linkedEntryFields.js.map +1 -1
- package/dist/contentful/media-dimensions.d.ts +7 -0
- package/dist/contentful/media-dimensions.d.ts.map +1 -0
- package/dist/contentful/media-dimensions.js +169 -0
- package/dist/contentful/media-dimensions.js.map +1 -0
- package/dist/contentful/upload-limits.d.ts +10 -4
- package/dist/contentful/upload-limits.d.ts.map +1 -1
- package/dist/contentful/upload-limits.js +14 -7
- package/dist/contentful/upload-limits.js.map +1 -1
- package/dist/editor-pack/generate.js +2 -2
- package/dist/editor-pack/generate.js.map +1 -1
- package/dist/generated/help-topics.d.ts.map +1 -1
- package/dist/generated/help-topics.js +1 -1
- package/dist/generated/help-topics.js.map +1 -1
- package/dist/generated/hosted-guide.d.ts +1 -1
- package/dist/generated/hosted-guide.d.ts.map +1 -1
- package/dist/generated/hosted-guide.js +1 -1
- package/dist/generated/hosted-guide.js.map +1 -1
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.js +1 -1
- package/dist/mcp/tools/cms-edit.d.ts +1 -1
- package/dist/mcp/tools/cms-edit.d.ts.map +1 -1
- package/dist/mcp/tools/cms-edit.js +1 -1
- package/dist/mcp/tools/media.d.ts.map +1 -1
- package/dist/mcp/tools/media.js +3 -3
- package/dist/mcp/tools/media.js.map +1 -1
- package/dist/mcp/tools/staged-upload.d.ts.map +1 -1
- package/dist/mcp/tools/staged-upload.js +4 -3
- package/dist/mcp/tools/staged-upload.js.map +1 -1
- package/dist/session/refs.d.ts.map +1 -1
- package/dist/session/refs.js +2 -0
- package/dist/session/refs.js.map +1 -1
- package/dist/staged-upload/direct-intake.d.ts +23 -0
- package/dist/staged-upload/direct-intake.d.ts.map +1 -0
- package/dist/staged-upload/direct-intake.js +71 -0
- package/dist/staged-upload/direct-intake.js.map +1 -0
- package/dist/staged-upload/intake-policy.d.ts +13 -0
- package/dist/staged-upload/intake-policy.d.ts.map +1 -0
- package/dist/staged-upload/intake-policy.js +37 -0
- package/dist/staged-upload/intake-policy.js.map +1 -0
- package/dist/staged-upload/request.d.ts +5 -1
- package/dist/staged-upload/request.d.ts.map +1 -1
- package/dist/staged-upload/request.js +31 -2
- package/dist/staged-upload/request.js.map +1 -1
- package/dist/staged-upload/types.d.ts +4 -0
- package/dist/staged-upload/types.d.ts.map +1 -1
- package/dist/validation/allowed-types.d.ts.map +1 -1
- package/dist/validation/allowed-types.js +12 -1
- package/dist/validation/allowed-types.js.map +1 -1
- package/docs/FUNCTIONAL_SPEC.md +1 -1
- package/docs/editor-tasks/media-pipeline-prepare.md +12 -2
- package/docs/editor-tasks/media-reuse-and-upload.md +40 -8
- package/docs/editor-tasks/taxonomy.md +2 -0
- package/docs/help/index.md +1 -1
- package/docs/mcp/hosted-guide.md +8 -6
- package/package.json +2 -1
- package/skills/core/SKILL.md +11 -5
- package/skills/editor-tasks/SKILL.md +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @se-studio/contentful-cms Changelog
|
|
2
2
|
|
|
3
|
+
## 3.15.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Add asset replace (same id, same file name, dry-run, draft), asset set-title, concept assign and unassign, and asset search by concept. Video and image masters over 4MB upload direct to storage up to 100MB, then the media pipeline. The 4MB function cap stays for JSON, text, SVG, PDF, and Lottie.
|
|
8
|
+
|
|
9
|
+
Every cms-edit host gets this on the next package bump. No site code change. Hosts that intake video or large masters need `BLOB_READ_WRITE_TOKEN`. The media pipeline fetch timeout for HTTPS sources is 180s in the media-pipeline app, which deploys separately.
|
|
10
|
+
|
|
11
|
+
## 3.14.2
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- e947c0f: cms-edit add places new sections on a person type index or person page. Publishing an index template or directory schema refreshes person type pages.
|
|
16
|
+
|
|
17
|
+
## 3.14.1
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- Person type directories now render like article type indexes. A person type can carry index page content and index schema, and personPageTopContent, personPageIndexed, and personPageHidden apply to every person of that type. personTemplate is read as personPageTemplate once migration 35 renames the field.
|
|
22
|
+
|
|
3
23
|
## 3.14.0
|
|
4
24
|
|
|
5
25
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -233,7 +233,7 @@ For content types that follow the `${contentType}Type` naming convention (e.g. `
|
|
|
233
233
|
| `create taxonomy-from-json --json '…' [--if-not-exists] [--dry-run]` | Batch-create tagType, articleType, and tag entries from JSON |
|
|
234
234
|
| `create person-from-json --json '…' [--if-not-exists] [--dry-run]` | Batch-create person/author entries from JSON |
|
|
235
235
|
| `create person --slug <slug> --name "X" [--job-title <t>] [--person-type-id <id>] [--person-type-slug <slug>] [--indexed true\|false] [--hidden true\|false] [--if-not-exists] [--dry-run]` | Create a person entry (draft) |
|
|
236
|
-
| `create person-type --slug <slug> --name "X" [--person-template-id <id>] [--index-page-template-id <id>] [--indexed true\|false] [--hidden true\|false] [--if-not-exists] [--dry-run]` | Create a personType entry (draft) |
|
|
236
|
+
| `create person-type --slug <slug> --name "X" [--person-page-template-id <id>] [--index-page-template-id <id>] [--index-page-top-content-ids <ids>] [--person-page-indexed true\|false] [--person-page-hidden true\|false] [--indexed true\|false] [--hidden true\|false] [--if-not-exists] [--dry-run]` | Create a personType entry (draft). Index flags default indexed on and hidden off. Person-page flags stay unset when omitted. |
|
|
237
237
|
| `create person … [--bio-markdown <md>]` or `[--bio-file <path>]` | Bio as Markdown (mutually exclusive paths) |
|
|
238
238
|
| `create tag-type --slug <slug> --name "X" [--json-file <path>] [--if-not-exists] [--dry-run]` | Create a tagType entry (draft) |
|
|
239
239
|
| `create article-type --slug <slug> --name "X" [--json-file <path>] [--if-not-exists] [--dry-run]` | Create an articleType entry (draft) |
|
|
@@ -347,9 +347,13 @@ Configure optional tokens in `.contentful-cms.json` (`previewAccessToken` for de
|
|
|
347
347
|
| `asset upload … --with-media [--media-name "X"] [--media-position Left\|Middle\|Right] [--media-width <1–100>]` | Also create a draft Media wrapper |
|
|
348
348
|
| `asset upload … --if-exists-by-filename` | Return existing asset (and media if `--with-media`) when fileName matches |
|
|
349
349
|
| `asset info <asset-id>` | Show asset details |
|
|
350
|
+
| `asset search --concept <id> [--concept-all <id>]` | Live concept search (id, title, file name, description, concepts). Not the blog tag index |
|
|
351
|
+
| `asset set-title <asset-id> <title>` | Set the asset title. Draft. Does not change the file name |
|
|
352
|
+
| `asset replace <asset-id> --url <ready-url> [--dry-run]` | New binary on the same id. Keeps the file name. Draft. Raster/video URL must be a processed pack |
|
|
353
|
+
| `asset concept assign\|unassign <asset-id> <concept-id...>` | Write `metadata.concepts`. Fails if the concept does not exist |
|
|
350
354
|
| `asset set <ref> <field> <asset-id>` | Set a visual/asset field |
|
|
351
355
|
|
|
352
|
-
JSON output for upload (`CMS_EDIT_JSON=1`): `{ ok, id, fileName, url, mediaId?, mediaIds? }`.
|
|
356
|
+
JSON output for upload (`CMS_EDIT_JSON=1`): `{ ok, id, fileName, url, mediaId?, mediaIds? }`. Bytes that pass through this process are limited to **10MB** (local/URL/base64) or **4MB** (hosted function POST for JSON, text, SVG, PDF, and Lottie). Video, and an image master over 4MB, use a presigned direct upload of up to **100MB**, then the media pipeline. Contentful stores the processed file. With `--if-exists-by-filename`, run uploads **one at a time** per `fileName` if your script uses parallelism (see idempotent note above).
|
|
353
357
|
|
|
354
358
|
### Navigation Entries
|
|
355
359
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0BzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0BzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsUzD"}
|
package/dist/commands/add.js
CHANGED
|
@@ -8,7 +8,7 @@ import { errorMsg, successMsg, warnMsg } from '../output/print.js';
|
|
|
8
8
|
import { buildTree, findTreeNode, makeEntryLink, resolveRef } from '../session/refs.js';
|
|
9
9
|
import { requireSession, saveSession } from '../session/store.js';
|
|
10
10
|
import { renderSnapshot } from '../snapshot/render.js';
|
|
11
|
-
import { addContentTypeError } from '../validation/allowed-types.js';
|
|
11
|
+
import { addContentTypeError, resolveAddTargetField } from '../validation/allowed-types.js';
|
|
12
12
|
import { buildAddCreateFields } from './add-initial-fields.js';
|
|
13
13
|
import { assertAddTargetIsEntryLinkArray } from './add-target-field.js';
|
|
14
14
|
function getValidTypeValues(ctDef, typeFieldId) {
|
|
@@ -71,54 +71,12 @@ export function registerAddCommand(program) {
|
|
|
71
71
|
process.exit(1);
|
|
72
72
|
}
|
|
73
73
|
const parentCtId = parentEntryEarly.sys.contentType.sys.id;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
parentCtId === 'article' ||
|
|
79
|
-
parentCtId === 'articleType' ||
|
|
80
|
-
parentCtId === 'tag') {
|
|
81
|
-
const contentRootAllowed = ['topContent', 'content', 'bottomContent'];
|
|
82
|
-
if (opts.target && !contentRootAllowed.includes(opts.target)) {
|
|
83
|
-
errorMsg(`--target must be one of: ${contentRootAllowed.join(', ')}. Got: ${opts.target}`);
|
|
84
|
-
process.exit(1);
|
|
85
|
-
}
|
|
86
|
-
targetField = opts.target ?? 'content';
|
|
87
|
-
}
|
|
88
|
-
else if (parentCtId === 'template') {
|
|
89
|
-
const templateAllowed = ['preContent', 'postContent'];
|
|
90
|
-
if (!opts.target || !templateAllowed.includes(opts.target)) {
|
|
91
|
-
errorMsg('For template parent, --target preContent or postContent is required.');
|
|
92
|
-
process.exit(1);
|
|
93
|
-
}
|
|
94
|
-
targetField = opts.target;
|
|
95
|
-
}
|
|
96
|
-
else if (parentCtId === 'pageVariant') {
|
|
97
|
-
if (opts.target && opts.target !== 'alternativeContents') {
|
|
98
|
-
errorMsg(`--target on a page variant must be alternativeContents. Got: ${opts.target}`);
|
|
99
|
-
process.exit(1);
|
|
100
|
-
}
|
|
101
|
-
targetField = 'alternativeContents';
|
|
102
|
-
}
|
|
103
|
-
else if (parentCtId === 'customType') {
|
|
104
|
-
const customAllowed = ['topContent', 'indexPageTopContent'];
|
|
105
|
-
if (opts.target && !customAllowed.includes(opts.target)) {
|
|
106
|
-
errorMsg(`--target must be one of: ${customAllowed.join(', ')}. Got: ${opts.target}`);
|
|
107
|
-
process.exit(1);
|
|
108
|
-
}
|
|
109
|
-
targetField = opts.target ?? 'topContent';
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
// Non-container parents (component, media, …): require explicit --target and schema check.
|
|
113
|
-
if (!opts.target) {
|
|
114
|
-
errorMsg(`Parent content type "${parentCtId}" is not a page/article/collection/template. ` +
|
|
115
|
-
`add cannot invent a target field. For singular links (e.g. visual) use:\n` +
|
|
116
|
-
` set ${opts.parent} visual <entryId> --link\n` +
|
|
117
|
-
`Or pass --parent pointing at a collection/page and --target content|contents.`);
|
|
118
|
-
process.exit(1);
|
|
119
|
-
}
|
|
120
|
-
targetField = opts.target;
|
|
74
|
+
const resolved = resolveAddTargetField(parentCtId, opts.target, 'parent');
|
|
75
|
+
if (!resolved.ok) {
|
|
76
|
+
errorMsg(resolved.message);
|
|
77
|
+
process.exit(1);
|
|
121
78
|
}
|
|
79
|
+
targetField = resolved.field;
|
|
122
80
|
}
|
|
123
81
|
else if (opts.after) {
|
|
124
82
|
resolveRef(session, opts.after);
|
|
@@ -132,61 +90,17 @@ export function registerAddCommand(program) {
|
|
|
132
90
|
}
|
|
133
91
|
else {
|
|
134
92
|
parentEntryId = session.rootEntryId;
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
errorMsg('For template use preContent or postContent.');
|
|
140
|
-
process.exit(1);
|
|
141
|
-
}
|
|
142
|
-
targetField = opts.target;
|
|
143
|
-
}
|
|
144
|
-
else if (session.rootEntryType === 'pageVariant') {
|
|
145
|
-
if (opts.target !== 'alternativeContents') {
|
|
146
|
-
errorMsg(`--target on a page variant must be alternativeContents. Got: ${opts.target}`);
|
|
147
|
-
process.exit(1);
|
|
148
|
-
}
|
|
149
|
-
targetField = 'alternativeContents';
|
|
150
|
-
}
|
|
151
|
-
else if (session.rootEntryType === 'customType') {
|
|
152
|
-
const customAllowed = ['topContent', 'indexPageTopContent'];
|
|
153
|
-
if (!customAllowed.includes(opts.target)) {
|
|
154
|
-
errorMsg(`--target must be one of: ${customAllowed.join(', ')}. Got: ${opts.target}`);
|
|
155
|
-
process.exit(1);
|
|
156
|
-
}
|
|
157
|
-
targetField = opts.target;
|
|
158
|
-
}
|
|
159
|
-
else if (session.rootEntryType === 'page' ||
|
|
160
|
-
session.rootEntryType === 'article' ||
|
|
161
|
-
session.rootEntryType === 'articleType' ||
|
|
162
|
-
session.rootEntryType === 'tag') {
|
|
163
|
-
const contentRootAllowed = ['topContent', 'content', 'bottomContent'];
|
|
164
|
-
if (!contentRootAllowed.includes(opts.target)) {
|
|
165
|
-
errorMsg(`--target must be one of: ${contentRootAllowed.join(', ')}. Got: ${opts.target}`);
|
|
166
|
-
process.exit(1);
|
|
167
|
-
}
|
|
168
|
-
targetField = opts.target;
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
errorMsg(`--target is only supported when the session root is a page, article, articleType, or tag. Current root is ${session.rootEntryType}.`);
|
|
172
|
-
process.exit(1);
|
|
173
|
-
}
|
|
93
|
+
const rootEntry = session.entries[parentEntryId];
|
|
94
|
+
if (!rootEntry) {
|
|
95
|
+
errorMsg('Parent entry not found in session.');
|
|
96
|
+
process.exit(1);
|
|
174
97
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
}
|
|
180
|
-
if (session.rootEntryType === 'pageVariant') {
|
|
181
|
-
targetField = 'alternativeContents';
|
|
182
|
-
}
|
|
183
|
-
else if (session.rootEntryType === 'customType') {
|
|
184
|
-
targetField = 'topContent';
|
|
185
|
-
}
|
|
186
|
-
else {
|
|
187
|
-
targetField = 'content';
|
|
188
|
-
}
|
|
98
|
+
const resolved = resolveAddTargetField(rootEntry.sys.contentType.sys.id, opts.target, 'root');
|
|
99
|
+
if (!resolved.ok) {
|
|
100
|
+
errorMsg(resolved.message);
|
|
101
|
+
process.exit(1);
|
|
189
102
|
}
|
|
103
|
+
targetField = resolved.field;
|
|
190
104
|
}
|
|
191
105
|
const parentEntry = session.entries[parentEntryId];
|
|
192
106
|
if (!parentEntry) {
|
package/dist/commands/add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset.d.ts","sourceRoot":"","sources":["../../src/commands/asset.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAGvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"asset.d.ts","sourceRoot":"","sources":["../../src/commands/asset.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAGvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqEzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+jC3D"}
|
package/dist/commands/asset.js
CHANGED
|
@@ -4,7 +4,9 @@ import pc from 'picocolors';
|
|
|
4
4
|
import { attachAssetUsages } from '../audit/asset-usage.js';
|
|
5
5
|
import { runMediaReview } from '../audit/media-review.js';
|
|
6
6
|
import { loadConfig, resolveSpaceConfig } from '../config/load.js';
|
|
7
|
-
import {
|
|
7
|
+
import { assertConceptsExist, assetConceptHit, assignConceptIds, CONCEPT_SEARCH_SCAN_PAGE, conceptIdsFromLinks, conceptLink, conceptSearchHasLocalFilter, conceptSearchQuery, matchesConceptSearch, unassignConceptIds, windowConceptHits, } from '../contentful/asset-concepts.js';
|
|
8
|
+
import { planAssetReplace } from '../contentful/asset-replace.js';
|
|
9
|
+
import { defaultFileNameForMime, getAssetBacklinks, getAssetSummary, replaceAssetFile, summariseAsset, uploadAssetBuffer, } from '../contentful/assets.js';
|
|
8
10
|
import { createSafeEnvironment } from '../contentful/client.js';
|
|
9
11
|
import { HOSTED_ASSET_UPLOAD_BASE64_ERROR, isHostedAssetUploadContext, } from '../contentful/hosted-asset-upload.js';
|
|
10
12
|
import { createMediaEntry } from '../contentful/media.js';
|
|
@@ -22,6 +24,7 @@ import { errorMsg, infoMsg, successMsg, warnMsg } from '../output/print.js';
|
|
|
22
24
|
import { getRuntimeContext } from '../runtime/context.js';
|
|
23
25
|
import { makeAssetLink, makeEntryLink, resolveRef } from '../session/refs.js';
|
|
24
26
|
import { requireSession, saveSession } from '../session/store.js';
|
|
27
|
+
import { tryConsumeStagedUpload } from '../staged-upload/consume-text.js';
|
|
25
28
|
import { assertStagedKind } from '../staged-upload/mime.js';
|
|
26
29
|
function handleAssetCommandError(err) {
|
|
27
30
|
if (err instanceof ContentIndexSyncError) {
|
|
@@ -36,12 +39,14 @@ export function registerAssetCommand(program) {
|
|
|
36
39
|
const asset = program.command('asset').description('Search and inspect Contentful assets');
|
|
37
40
|
asset
|
|
38
41
|
.command('search [query]')
|
|
39
|
-
.description('Search assets by title
|
|
42
|
+
.description('Search assets by title, filename, or concept id')
|
|
40
43
|
.option('-n, --limit <n>', 'Max results (default 10)', '10')
|
|
41
44
|
.option('--skip <n>', 'Skip first N results for pagination', '0')
|
|
42
45
|
.option('--type <mime>', 'Filter by MIME type prefix (e.g. image/, application/pdf)')
|
|
43
46
|
.option('--filename <name>', 'Exact match on file.fileName')
|
|
44
47
|
.option('--filename-match <pattern>', 'Regex match on file.fileName')
|
|
48
|
+
.option('--concept <id>', 'Concept id. Repeat to match any of them.', collectIds, [])
|
|
49
|
+
.option('--concept-all <id>', 'Concept id that must be present. Repeat when several are required.', collectIds, [])
|
|
45
50
|
.action(async (query, opts, cmd) => {
|
|
46
51
|
const parentOpts = cmd.parent?.parent?.opts() ?? {};
|
|
47
52
|
try {
|
|
@@ -49,9 +54,73 @@ export function registerAssetCommand(program) {
|
|
|
49
54
|
const { space } = resolveSpaceConfig(config, parentOpts.space);
|
|
50
55
|
const limit = Number.parseInt(opts.limit, 10) || 10;
|
|
51
56
|
const skip = Number.parseInt(opts.skip, 10) || 0;
|
|
57
|
+
const conceptIds = opts.concept ?? [];
|
|
58
|
+
const conceptAllIds = opts.conceptAll ?? [];
|
|
59
|
+
if (conceptIds.length > 0 || conceptAllIds.length > 0) {
|
|
60
|
+
const env = await createSafeEnvironment(space);
|
|
61
|
+
const filter = {
|
|
62
|
+
title: query,
|
|
63
|
+
contentTypePrefix: opts.type,
|
|
64
|
+
fileName: opts.filename,
|
|
65
|
+
fileNamePattern: opts.filenameMatch
|
|
66
|
+
? parseSafeRegExpPattern(opts.filenameMatch, '--filename-match')
|
|
67
|
+
: undefined,
|
|
68
|
+
};
|
|
69
|
+
if (!conceptSearchHasLocalFilter(filter)) {
|
|
70
|
+
const page = await env.getAssets(conceptSearchQuery({ conceptIds, conceptAllIds, limit, skip }));
|
|
71
|
+
const hits = page.items.map(assetConceptHit);
|
|
72
|
+
const scanned = (page.skip ?? skip) + page.items.length;
|
|
73
|
+
printConceptHits(hits, {
|
|
74
|
+
query,
|
|
75
|
+
conceptIds,
|
|
76
|
+
conceptAllIds,
|
|
77
|
+
limit,
|
|
78
|
+
skip,
|
|
79
|
+
more: scanned < page.total,
|
|
80
|
+
});
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const matched = [];
|
|
84
|
+
let cmaSkip = 0;
|
|
85
|
+
let total = Number.POSITIVE_INFINITY;
|
|
86
|
+
let scannedAll = false;
|
|
87
|
+
const wanted = skip + limit;
|
|
88
|
+
while (cmaSkip < total) {
|
|
89
|
+
const page = await env.getAssets(conceptSearchQuery({
|
|
90
|
+
conceptIds,
|
|
91
|
+
conceptAllIds,
|
|
92
|
+
limit: CONCEPT_SEARCH_SCAN_PAGE,
|
|
93
|
+
skip: cmaSkip,
|
|
94
|
+
}));
|
|
95
|
+
total = page.total;
|
|
96
|
+
for (const asset of page.items) {
|
|
97
|
+
if (matchesConceptSearch(asset, filter)) {
|
|
98
|
+
matched.push(assetConceptHit(asset));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
cmaSkip += page.items.length;
|
|
102
|
+
if (page.items.length === 0 || cmaSkip >= total) {
|
|
103
|
+
scannedAll = true;
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
if (matched.length >= wanted) {
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const window = windowConceptHits(matched, skip, limit, scannedAll);
|
|
111
|
+
printConceptHits(window.hits, {
|
|
112
|
+
query,
|
|
113
|
+
conceptIds,
|
|
114
|
+
conceptAllIds,
|
|
115
|
+
limit,
|
|
116
|
+
skip,
|
|
117
|
+
more: window.more,
|
|
118
|
+
});
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
52
121
|
await ensureContentIndex(space, { onRebuild: warnMsg });
|
|
53
122
|
if (!query && !opts.filename && !opts.filenameMatch) {
|
|
54
|
-
errorMsg('Provide a title query
|
|
123
|
+
errorMsg('Provide a title query, --filename / --filename-match, or --concept / --concept-all.');
|
|
55
124
|
process.exit(1);
|
|
56
125
|
}
|
|
57
126
|
if (opts.filename && query) {
|
|
@@ -684,6 +753,244 @@ export function registerAssetCommand(program) {
|
|
|
684
753
|
process.exit(1);
|
|
685
754
|
}
|
|
686
755
|
});
|
|
756
|
+
asset
|
|
757
|
+
.command('set-title <asset-id> <title>')
|
|
758
|
+
.description('Set the title on an existing asset. Saves as draft. Does not change the file name or description.\n' +
|
|
759
|
+
'Example: cms-edit asset set-title abc123 "Parent and clinician"')
|
|
760
|
+
.action(async (assetId, title, _opts, cmd) => {
|
|
761
|
+
const parentOpts = cmd.parent?.parent?.opts() ?? {};
|
|
762
|
+
try {
|
|
763
|
+
const nextTitle = title.trim();
|
|
764
|
+
if (!nextTitle) {
|
|
765
|
+
errorMsg('Title is empty.');
|
|
766
|
+
process.exit(1);
|
|
767
|
+
}
|
|
768
|
+
const config = loadConfig(parentOpts.config);
|
|
769
|
+
const { space } = resolveSpaceConfig(config, parentOpts.space);
|
|
770
|
+
const env = await createSafeEnvironment(space);
|
|
771
|
+
const locale = space.defaultLocale;
|
|
772
|
+
const asset = await env.getAsset(assetId);
|
|
773
|
+
const fields = asset.fields;
|
|
774
|
+
if (!fields['title']) {
|
|
775
|
+
fields['title'] = {};
|
|
776
|
+
}
|
|
777
|
+
fields['title'][locale] = nextTitle;
|
|
778
|
+
await env.updateAsset(asset);
|
|
779
|
+
const summary = await getAssetSummary(env, assetId);
|
|
780
|
+
if (summary) {
|
|
781
|
+
await notifyContentIndexChanged(space, {
|
|
782
|
+
upsertAssets: [assetSummaryToIndexRow(summary)],
|
|
783
|
+
});
|
|
784
|
+
}
|
|
785
|
+
if (isJsonMode()) {
|
|
786
|
+
console.log(JSON.stringify({ ok: true, assetId, title: nextTitle }, null, 2));
|
|
787
|
+
}
|
|
788
|
+
else {
|
|
789
|
+
successMsg(`Updated title on asset ${assetId} (saved as draft).`);
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
catch (err) {
|
|
793
|
+
errorMsg(err instanceof Error ? err.message : String(err));
|
|
794
|
+
process.exit(1);
|
|
795
|
+
}
|
|
796
|
+
});
|
|
797
|
+
asset
|
|
798
|
+
.command('replace <asset-id>')
|
|
799
|
+
.description('Replace the binary on an existing asset id. Links stay. The current file name stays. Draft only.\n' +
|
|
800
|
+
'Raster and video: --url of the processed pack (…/packs/…/ready/…), after direct intake and the media pipeline.\n' +
|
|
801
|
+
'SVG, PDF, and Lottie: --staged or --url. --dry-run returns id, file name, old dimensions, new dimensions.\n' +
|
|
802
|
+
'Refuses a replace that would turn an image into a non-image, or the reverse.')
|
|
803
|
+
.option('--staged <uploadId>', 'Staged SVG, PDF, or Lottie upload id')
|
|
804
|
+
.option('--url <https-url>', 'Processed pack URL, or an SVG/PDF/Lottie URL')
|
|
805
|
+
.option('--mime <type>', 'MIME type when the response does not send one')
|
|
806
|
+
.option('--dry-run', 'Read dimensions and refuse an image-class change. Does not write.')
|
|
807
|
+
.action(async (assetId, opts, cmd) => {
|
|
808
|
+
const parentOpts = cmd.parent?.parent?.opts() ?? {};
|
|
809
|
+
try {
|
|
810
|
+
const sources = [opts.url, opts.staged].filter(Boolean);
|
|
811
|
+
if (sources.length !== 1) {
|
|
812
|
+
errorMsg('Provide exactly one replacement source: --url or --staged.');
|
|
813
|
+
process.exit(1);
|
|
814
|
+
}
|
|
815
|
+
const config = loadConfig(parentOpts.config);
|
|
816
|
+
const { space } = resolveSpaceConfig(config, parentOpts.space);
|
|
817
|
+
const env = await createSafeEnvironment(space);
|
|
818
|
+
const current = await env.getAsset(assetId);
|
|
819
|
+
const summary = summariseAsset(current);
|
|
820
|
+
const loaded = await loadReplacementSource(opts);
|
|
821
|
+
const nextContentType = (opts.mime ?? loaded.mimeType).trim().toLowerCase();
|
|
822
|
+
const plan = planAssetReplace({
|
|
823
|
+
id: assetId,
|
|
824
|
+
fileName: summary.fileName,
|
|
825
|
+
contentType: summary.contentType,
|
|
826
|
+
width: summary.width,
|
|
827
|
+
height: summary.height,
|
|
828
|
+
nextBuffer: loaded.buffer,
|
|
829
|
+
nextContentType,
|
|
830
|
+
sourceUrl: opts.url,
|
|
831
|
+
});
|
|
832
|
+
if (opts.dryRun) {
|
|
833
|
+
printReplacePlan(plan, true);
|
|
834
|
+
return;
|
|
835
|
+
}
|
|
836
|
+
const replaced = await replaceAssetFile(env, assetId, loaded.buffer, {
|
|
837
|
+
mimeType: nextContentType,
|
|
838
|
+
locale: space.defaultLocale,
|
|
839
|
+
sourceUrl: opts.url,
|
|
840
|
+
}, (msg) => infoMsg(msg));
|
|
841
|
+
await notifyContentIndexChanged(space, {
|
|
842
|
+
upsertAssets: [assetSummaryToIndexRow(replaced)],
|
|
843
|
+
});
|
|
844
|
+
if (opts.staged) {
|
|
845
|
+
await tryConsumeStagedUpload(() => consumeStagedReplacement(opts.staged ?? ''), 'Replaced the asset file');
|
|
846
|
+
}
|
|
847
|
+
printReplacePlan({
|
|
848
|
+
...plan,
|
|
849
|
+
new: {
|
|
850
|
+
width: replaced.width ?? plan.new.width,
|
|
851
|
+
height: replaced.height ?? plan.new.height,
|
|
852
|
+
},
|
|
853
|
+
}, false);
|
|
854
|
+
}
|
|
855
|
+
catch (err) {
|
|
856
|
+
errorMsg(err instanceof Error ? err.message : String(err));
|
|
857
|
+
process.exit(1);
|
|
858
|
+
}
|
|
859
|
+
});
|
|
860
|
+
const concept = asset
|
|
861
|
+
.command('concept')
|
|
862
|
+
.description('Assign or remove Contentful taxonomy concepts on an asset. Does not create schemes.');
|
|
863
|
+
concept
|
|
864
|
+
.command('assign <asset-id> <concept-id...>')
|
|
865
|
+
.description('Add concept ids to metadata.concepts. Fails if a concept does not exist. Draft only.\n' +
|
|
866
|
+
'Example: cms-edit asset concept assign abc123 conceptId1 conceptId2')
|
|
867
|
+
.action(async (assetId, conceptIds, _opts, cmd) => {
|
|
868
|
+
await writeAssetConcepts(assetId, conceptIds, 'assign', cmd);
|
|
869
|
+
});
|
|
870
|
+
concept
|
|
871
|
+
.command('unassign <asset-id> <concept-id...>')
|
|
872
|
+
.description('Remove concept ids from metadata.concepts. Fails if a concept does not exist. Draft only.')
|
|
873
|
+
.action(async (assetId, conceptIds, _opts, cmd) => {
|
|
874
|
+
await writeAssetConcepts(assetId, conceptIds, 'unassign', cmd);
|
|
875
|
+
});
|
|
876
|
+
}
|
|
877
|
+
function collectIds(value, previous = []) {
|
|
878
|
+
return [...previous, value];
|
|
879
|
+
}
|
|
880
|
+
function programOpts(cmd) {
|
|
881
|
+
let current = cmd;
|
|
882
|
+
while (current.parent) {
|
|
883
|
+
current = current.parent;
|
|
884
|
+
}
|
|
885
|
+
return current.opts();
|
|
886
|
+
}
|
|
887
|
+
function printConceptHits(hits, label) {
|
|
888
|
+
if (isJsonMode()) {
|
|
889
|
+
console.log(JSON.stringify(hits, null, 2));
|
|
890
|
+
return;
|
|
891
|
+
}
|
|
892
|
+
if (hits.length === 0) {
|
|
893
|
+
console.log(pc.dim('No assets found for those concepts.'));
|
|
894
|
+
return;
|
|
895
|
+
}
|
|
896
|
+
const name = [...label.conceptIds, ...label.conceptAllIds.map((id) => `all:${id}`)].join(', ');
|
|
897
|
+
console.log(`\n${pc.bold('Assets with concepts: ')}${pc.cyan(name)}\n`);
|
|
898
|
+
for (const hit of hits) {
|
|
899
|
+
console.log(` ${pc.bold(hit.id)} ${hit.title}`);
|
|
900
|
+
console.log(` ${pc.dim(hit.fileName)}`);
|
|
901
|
+
console.log(` ${hit.description ?? pc.dim('(no description)')}`);
|
|
902
|
+
console.log(` ${pc.dim(`concepts: ${hit.concepts.join(', ') || '(none)'}`)}`);
|
|
903
|
+
}
|
|
904
|
+
console.log('');
|
|
905
|
+
if (label.more) {
|
|
906
|
+
console.log(pc.dim(`Use --skip ${String(label.skip + hits.length)} to see the next page.`));
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
function printReplacePlan(plan, dryRun) {
|
|
910
|
+
const body = {
|
|
911
|
+
ok: true,
|
|
912
|
+
dryRun,
|
|
913
|
+
id: plan.id,
|
|
914
|
+
fileName: plan.fileName,
|
|
915
|
+
old: plan.old,
|
|
916
|
+
new: plan.new,
|
|
917
|
+
};
|
|
918
|
+
if (isJsonMode()) {
|
|
919
|
+
console.log(JSON.stringify(body, null, 2));
|
|
920
|
+
return;
|
|
921
|
+
}
|
|
922
|
+
const dims = (value) => value.width && value.height ? `${String(value.width)}×${String(value.height)}` : 'unknown';
|
|
923
|
+
if (dryRun) {
|
|
924
|
+
console.log(`\n${pc.bold('Replace dry-run')}\n`);
|
|
925
|
+
}
|
|
926
|
+
else {
|
|
927
|
+
successMsg(`Replaced file on asset ${plan.id} (saved as draft). File name unchanged.`);
|
|
928
|
+
}
|
|
929
|
+
console.log(` id: ${plan.id}`);
|
|
930
|
+
console.log(` fileName: ${plan.fileName}`);
|
|
931
|
+
console.log(` old: ${dims(plan.old)}`);
|
|
932
|
+
console.log(` new: ${dims(plan.new)}\n`);
|
|
933
|
+
}
|
|
934
|
+
async function loadReplacementSource(opts) {
|
|
935
|
+
if (opts.url) {
|
|
936
|
+
const fetched = await fetchUploadSource(opts.url);
|
|
937
|
+
return { buffer: fetched.buffer, mimeType: opts.mime ?? fetched.contentType ?? '' };
|
|
938
|
+
}
|
|
939
|
+
const staged = await peekStagedReplacement(opts.staged ?? '');
|
|
940
|
+
return { buffer: staged.buffer, mimeType: opts.mime ?? staged.mimeType };
|
|
941
|
+
}
|
|
942
|
+
async function peekStagedReplacement(uploadId) {
|
|
943
|
+
const context = getRuntimeContext();
|
|
944
|
+
const userId = context?.user?.userId;
|
|
945
|
+
const stagedStore = context?.stagedUploadStore;
|
|
946
|
+
if (!userId || !stagedStore) {
|
|
947
|
+
throw new Error('--staged requires hosted MCP context (authenticated user and Redis staged upload store).');
|
|
948
|
+
}
|
|
949
|
+
const staged = await stagedStore.peekFile(userId, uploadId);
|
|
950
|
+
assertStagedKind(staged.kind, ['asset']);
|
|
951
|
+
return staged;
|
|
952
|
+
}
|
|
953
|
+
async function consumeStagedReplacement(uploadId) {
|
|
954
|
+
const context = getRuntimeContext();
|
|
955
|
+
const userId = context?.user?.userId;
|
|
956
|
+
const stagedStore = context?.stagedUploadStore;
|
|
957
|
+
if (!userId || !stagedStore) {
|
|
958
|
+
throw new Error('--staged requires hosted MCP context (authenticated user and Redis staged upload store).');
|
|
959
|
+
}
|
|
960
|
+
await stagedStore.consume(userId, uploadId);
|
|
961
|
+
}
|
|
962
|
+
async function writeAssetConcepts(assetId, conceptIds, mode, cmd) {
|
|
963
|
+
const parentOpts = programOpts(cmd);
|
|
964
|
+
try {
|
|
965
|
+
const config = loadConfig(parentOpts.config);
|
|
966
|
+
const { space } = resolveSpaceConfig(config, parentOpts.space);
|
|
967
|
+
const env = await createSafeEnvironment(space);
|
|
968
|
+
await assertConceptsExist(env, conceptIds);
|
|
969
|
+
const asset = await env.getAsset(assetId);
|
|
970
|
+
const current = conceptIdsFromLinks(asset.metadata?.concepts);
|
|
971
|
+
const next = mode === 'assign'
|
|
972
|
+
? assignConceptIds(current, conceptIds)
|
|
973
|
+
: unassignConceptIds(current, conceptIds);
|
|
974
|
+
asset.metadata = {
|
|
975
|
+
...(asset.metadata ?? {}),
|
|
976
|
+
tags: asset.metadata?.tags ?? [],
|
|
977
|
+
concepts: next.map(conceptLink),
|
|
978
|
+
};
|
|
979
|
+
await env.updateAsset(asset);
|
|
980
|
+
if (isJsonMode()) {
|
|
981
|
+
console.log(JSON.stringify({ ok: true, assetId, concepts: next }, null, 2));
|
|
982
|
+
}
|
|
983
|
+
else {
|
|
984
|
+
successMsg(mode === 'assign'
|
|
985
|
+
? `Assigned concepts on asset ${assetId} (saved as draft).`
|
|
986
|
+
: `Removed concepts on asset ${assetId} (saved as draft).`);
|
|
987
|
+
console.log(pc.dim(` concepts: ${next.join(', ') || '(none)'}`));
|
|
988
|
+
}
|
|
989
|
+
}
|
|
990
|
+
catch (err) {
|
|
991
|
+
errorMsg(err instanceof Error ? err.message : String(err));
|
|
992
|
+
process.exit(1);
|
|
993
|
+
}
|
|
687
994
|
}
|
|
688
995
|
function assetSummaryToIndexRow(summary) {
|
|
689
996
|
return {
|