@se-studio/contentful-cms 1.0.1
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 +15 -0
- package/README.md +519 -0
- package/dist/bin/cms-edit.d.ts +4 -0
- package/dist/bin/cms-edit.d.ts.map +1 -0
- package/dist/bin/cms-edit.js +101 -0
- package/dist/bin/cms-edit.js.map +1 -0
- package/dist/commands/add.d.ts +4 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +166 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/asset.d.ts +4 -0
- package/dist/commands/asset.d.ts.map +1 -0
- package/dist/commands/asset.js +110 -0
- package/dist/commands/asset.js.map +1 -0
- package/dist/commands/colours.d.ts +4 -0
- package/dist/commands/colours.d.ts.map +1 -0
- package/dist/commands/colours.js +91 -0
- package/dist/commands/colours.js.map +1 -0
- package/dist/commands/create.d.ts +4 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +223 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/diff.d.ts +4 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +141 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/discard.d.ts +4 -0
- package/dist/commands/discard.d.ts.map +1 -0
- package/dist/commands/discard.js +36 -0
- package/dist/commands/discard.js.map +1 -0
- package/dist/commands/entry-search.d.ts +4 -0
- package/dist/commands/entry-search.d.ts.map +1 -0
- package/dist/commands/entry-search.js +81 -0
- package/dist/commands/entry-search.js.map +1 -0
- package/dist/commands/export-converted.d.ts +8 -0
- package/dist/commands/export-converted.d.ts.map +1 -0
- package/dist/commands/export-converted.js +62 -0
- package/dist/commands/export-converted.js.map +1 -0
- package/dist/commands/links.d.ts +4 -0
- package/dist/commands/links.d.ts.map +1 -0
- package/dist/commands/links.js +255 -0
- package/dist/commands/links.js.map +1 -0
- package/dist/commands/list.d.ts +4 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +91 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/move.d.ts +3 -0
- package/dist/commands/move.d.ts.map +1 -0
- package/dist/commands/move.js +84 -0
- package/dist/commands/move.js.map +1 -0
- package/dist/commands/nav.d.ts +4 -0
- package/dist/commands/nav.d.ts.map +1 -0
- package/dist/commands/nav.js +196 -0
- package/dist/commands/nav.js.map +1 -0
- package/dist/commands/open.d.ts +4 -0
- package/dist/commands/open.d.ts.map +1 -0
- package/dist/commands/open.js +74 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/read.d.ts +4 -0
- package/dist/commands/read.d.ts.map +1 -0
- package/dist/commands/read.js +102 -0
- package/dist/commands/read.js.map +1 -0
- package/dist/commands/remove.d.ts +4 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +98 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/rtf.d.ts +3 -0
- package/dist/commands/rtf.d.ts.map +1 -0
- package/dist/commands/rtf.js +131 -0
- package/dist/commands/rtf.js.map +1 -0
- package/dist/commands/save.d.ts +4 -0
- package/dist/commands/save.d.ts.map +1 -0
- package/dist/commands/save.js +59 -0
- package/dist/commands/save.js.map +1 -0
- package/dist/commands/screenshot.d.ts +4 -0
- package/dist/commands/screenshot.d.ts.map +1 -0
- package/dist/commands/screenshot.js +246 -0
- package/dist/commands/screenshot.js.map +1 -0
- package/dist/commands/set.d.ts +3 -0
- package/dist/commands/set.d.ts.map +1 -0
- package/dist/commands/set.js +152 -0
- package/dist/commands/set.js.map +1 -0
- package/dist/commands/skill.d.ts +4 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +73 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/snapshot.d.ts +3 -0
- package/dist/commands/snapshot.d.ts.map +1 -0
- package/dist/commands/snapshot.js +21 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/commands/types.d.ts +4 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +78 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/config/load.d.ts +14 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +79 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/types.d.ts +13 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/contentful/assets.d.ts +20 -0
- package/dist/contentful/assets.d.ts.map +1 -0
- package/dist/contentful/assets.js +36 -0
- package/dist/contentful/assets.js.map +1 -0
- package/dist/contentful/client.d.ts +28 -0
- package/dist/contentful/client.d.ts.map +1 -0
- package/dist/contentful/client.js +30 -0
- package/dist/contentful/client.js.map +1 -0
- package/dist/contentful/fetch.d.ts +20 -0
- package/dist/contentful/fetch.d.ts.map +1 -0
- package/dist/contentful/fetch.js +154 -0
- package/dist/contentful/fetch.js.map +1 -0
- package/dist/contentful/references.d.ts +7 -0
- package/dist/contentful/references.d.ts.map +1 -0
- package/dist/contentful/references.js +12 -0
- package/dist/contentful/references.js.map +1 -0
- package/dist/contentful/write.d.ts +16 -0
- package/dist/contentful/write.d.ts.map +1 -0
- package/dist/contentful/write.js +75 -0
- package/dist/contentful/write.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/output/json.d.ts +47 -0
- package/dist/output/json.d.ts.map +1 -0
- package/dist/output/json.js +87 -0
- package/dist/output/json.js.map +1 -0
- package/dist/output/mode.d.ts +3 -0
- package/dist/output/mode.d.ts.map +1 -0
- package/dist/output/mode.js +16 -0
- package/dist/output/mode.js.map +1 -0
- package/dist/output/print.d.ts +14 -0
- package/dist/output/print.d.ts.map +1 -0
- package/dist/output/print.js +61 -0
- package/dist/output/print.js.map +1 -0
- package/dist/rtf/fromMarkdown.d.ts +19 -0
- package/dist/rtf/fromMarkdown.d.ts.map +1 -0
- package/dist/rtf/fromMarkdown.js +230 -0
- package/dist/rtf/fromMarkdown.js.map +1 -0
- package/dist/rtf/toMarkdown.d.ts +6 -0
- package/dist/rtf/toMarkdown.d.ts.map +1 -0
- package/dist/rtf/toMarkdown.js +105 -0
- package/dist/rtf/toMarkdown.js.map +1 -0
- package/dist/session/refs.d.ts +35 -0
- package/dist/session/refs.d.ts.map +1 -0
- package/dist/session/refs.js +128 -0
- package/dist/session/refs.js.map +1 -0
- package/dist/session/state.d.ts +91 -0
- package/dist/session/state.d.ts.map +1 -0
- package/dist/session/state.js +61 -0
- package/dist/session/state.js.map +1 -0
- package/dist/session/store.d.ts +10 -0
- package/dist/session/store.d.ts.map +1 -0
- package/dist/session/store.js +62 -0
- package/dist/session/store.js.map +1 -0
- package/dist/snapshot/render.d.ts +15 -0
- package/dist/snapshot/render.d.ts.map +1 -0
- package/dist/snapshot/render.js +166 -0
- package/dist/snapshot/render.js.map +1 -0
- package/dist/validation/allowed-types.d.ts +7 -0
- package/dist/validation/allowed-types.d.ts.map +1 -0
- package/dist/validation/allowed-types.js +16 -0
- package/dist/validation/allowed-types.js.map +1 -0
- package/package.json +61 -0
- package/skills/core/SKILL.md +483 -0
- package/skills/manifest.json +7 -0
- package/skills/navigation/SKILL.md +18 -0
- package/skills/rich-text/SKILL.md +23 -0
- package/skills/screenshots/SKILL.md +32 -0
- package/skills/templates/SKILL.md +16 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/session/state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE;QACH,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE;YAAE,GAAG,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC;QACrC,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACjD;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,CAAC;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACzC,mDAAmD;IACnD,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACjD,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,oBAAoB;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,qCAAqC;IACrC,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,gDAAgD;IAChD,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,sEAAsE;IACtE,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAExE;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,OAAO,GAAG,WAAW,CAM9F;AASD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAUhF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAc5E;AAED,gEAAgE;AAChE,eAAO,MAAM,oBAAoB,iEAAkE,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derives the display status of an entry.
|
|
3
|
+
*
|
|
4
|
+
* - changed: has unsaved local patches
|
|
5
|
+
* - draft: never published
|
|
6
|
+
* - pending: published but has newer draft on Contentful
|
|
7
|
+
* - published: published and no pending changes
|
|
8
|
+
*/
|
|
9
|
+
export function getEntryStatus(entry, isLocallyModified) {
|
|
10
|
+
if (isLocallyModified)
|
|
11
|
+
return 'changed';
|
|
12
|
+
const { publishedVersion, version } = entry.sys;
|
|
13
|
+
if (!publishedVersion)
|
|
14
|
+
return 'draft';
|
|
15
|
+
if (publishedVersion >= version - 1)
|
|
16
|
+
return 'published';
|
|
17
|
+
return 'pending';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Returns the content type ID for an entry (e.g. 'component', 'collection', 'page').
|
|
21
|
+
*/
|
|
22
|
+
function getContentTypeId(entry) {
|
|
23
|
+
return entry.sys.contentType.sys.id;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Returns the display type label for any content type.
|
|
27
|
+
* Looks for a ${ctId}Type discriminator field (e.g. componentType, collectionType,
|
|
28
|
+
* externalComponentType) and renders as TypeName[value] when present.
|
|
29
|
+
* Falls back to the capitalised content type ID for types without a discriminator.
|
|
30
|
+
*/
|
|
31
|
+
export function getEntryTypeLabel(entry, locale) {
|
|
32
|
+
const ctId = getContentTypeId(entry);
|
|
33
|
+
const typeFieldId = `${ctId}Type`;
|
|
34
|
+
const typeField = entry.fields[typeFieldId];
|
|
35
|
+
const val = typeField?.[locale] ?? typeField?.['en-US'];
|
|
36
|
+
if (typeof val === 'string' && val.trim()) {
|
|
37
|
+
const label = ctId.charAt(0).toUpperCase() + ctId.slice(1);
|
|
38
|
+
return `${label}[${val}]`;
|
|
39
|
+
}
|
|
40
|
+
return ctId.charAt(0).toUpperCase() + ctId.slice(1);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Returns the best display label (cmsLabel or heading or entry ID).
|
|
44
|
+
*/
|
|
45
|
+
export function getEntryLabel(entry, locale) {
|
|
46
|
+
const tryField = (fieldId) => {
|
|
47
|
+
const field = entry.fields[fieldId];
|
|
48
|
+
if (!field)
|
|
49
|
+
return null;
|
|
50
|
+
const val = field[locale] ?? field['en-US'];
|
|
51
|
+
return typeof val === 'string' && val.trim() ? val : null;
|
|
52
|
+
};
|
|
53
|
+
return (tryField('cmsLabel') ??
|
|
54
|
+
tryField('heading') ??
|
|
55
|
+
tryField('title') ??
|
|
56
|
+
tryField('adminLabel') ??
|
|
57
|
+
entry.sys.id);
|
|
58
|
+
}
|
|
59
|
+
/** The content array fields that can contain linked entries. */
|
|
60
|
+
export const CONTENT_ARRAY_FIELDS = ['topContent', 'content', 'bottomContent', 'contents'];
|
|
61
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/session/state.ts"],"names":[],"mappings":"AAqEA;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,KAAsB,EAAE,iBAA0B;IAC/E,IAAI,iBAAiB;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC;IAChD,IAAI,CAAC,gBAAgB;QAAE,OAAO,OAAO,CAAC;IACtC,IAAI,gBAAgB,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,WAAW,CAAC;IACxD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,KAAsB;IAC9C,OAAO,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAsB,EAAE,MAAc;IACtE,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,GAAG,IAAI,MAAM,CAAC;IAClC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,GAAG,KAAK,IAAI,GAAG,GAAG,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAsB,EAAE,MAAc;IAClE,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAiB,EAAE;QAClD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,CAAC,CAAC;IACF,OAAO,CACL,QAAQ,CAAC,UAAU,CAAC;QACpB,QAAQ,CAAC,SAAS,CAAC;QACnB,QAAQ,CAAC,OAAO,CAAC;QACjB,QAAQ,CAAC,YAAY,CAAC;QACtB,KAAK,CAAC,GAAG,CAAC,EAAE,CACb,CAAC;AACJ,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,CAAU,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SessionState } from './state.js';
|
|
2
|
+
export declare function loadSession(spaceId?: string, rootEntryId?: string): SessionState | null;
|
|
3
|
+
export declare function saveSession(state: SessionState): void;
|
|
4
|
+
export declare function clearSession(spaceId: string, rootEntryId: string): void;
|
|
5
|
+
export declare function clearAllSessions(): void;
|
|
6
|
+
/**
|
|
7
|
+
* Loads the active session or throws a helpful error if none exists.
|
|
8
|
+
*/
|
|
9
|
+
export declare function requireSession(): SessionState;
|
|
10
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/session/store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAoB/C,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CASvF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAIrD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAKvE;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAOvC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,YAAY,CAQ7C"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as os from 'node:os';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
const SESSIONS_DIR = path.join(os.homedir(), '.contentful-cms', 'sessions');
|
|
5
|
+
function getSessionPath(spaceId, rootEntryId) {
|
|
6
|
+
return path.join(SESSIONS_DIR, `${spaceId}-${rootEntryId}.json`);
|
|
7
|
+
}
|
|
8
|
+
/** Returns the path to the most recently modified session file, if any. */
|
|
9
|
+
function findLatestSessionPath() {
|
|
10
|
+
if (!fs.existsSync(SESSIONS_DIR))
|
|
11
|
+
return null;
|
|
12
|
+
const files = fs.readdirSync(SESSIONS_DIR).filter((f) => f.endsWith('.json'));
|
|
13
|
+
if (files.length === 0)
|
|
14
|
+
return null;
|
|
15
|
+
const sorted = files
|
|
16
|
+
.map((f) => ({ file: f, mtime: fs.statSync(path.join(SESSIONS_DIR, f)).mtime }))
|
|
17
|
+
.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
|
|
18
|
+
const latest = sorted[0];
|
|
19
|
+
return latest ? path.join(SESSIONS_DIR, latest.file) : null;
|
|
20
|
+
}
|
|
21
|
+
export function loadSession(spaceId, rootEntryId) {
|
|
22
|
+
const sessionPath = spaceId && rootEntryId ? getSessionPath(spaceId, rootEntryId) : findLatestSessionPath();
|
|
23
|
+
if (!sessionPath || !fs.existsSync(sessionPath))
|
|
24
|
+
return null;
|
|
25
|
+
try {
|
|
26
|
+
return JSON.parse(fs.readFileSync(sessionPath, 'utf-8'));
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function saveSession(state) {
|
|
33
|
+
fs.mkdirSync(SESSIONS_DIR, { recursive: true });
|
|
34
|
+
const sessionPath = getSessionPath(state.spaceId, state.rootEntryId);
|
|
35
|
+
fs.writeFileSync(sessionPath, JSON.stringify(state, null, 2), 'utf-8');
|
|
36
|
+
}
|
|
37
|
+
export function clearSession(spaceId, rootEntryId) {
|
|
38
|
+
const sessionPath = getSessionPath(spaceId, rootEntryId);
|
|
39
|
+
if (fs.existsSync(sessionPath)) {
|
|
40
|
+
fs.unlinkSync(sessionPath);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function clearAllSessions() {
|
|
44
|
+
if (!fs.existsSync(SESSIONS_DIR))
|
|
45
|
+
return;
|
|
46
|
+
for (const file of fs.readdirSync(SESSIONS_DIR)) {
|
|
47
|
+
if (file.endsWith('.json')) {
|
|
48
|
+
fs.unlinkSync(path.join(SESSIONS_DIR, file));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Loads the active session or throws a helpful error if none exists.
|
|
54
|
+
*/
|
|
55
|
+
export function requireSession() {
|
|
56
|
+
const session = loadSession();
|
|
57
|
+
if (!session) {
|
|
58
|
+
throw new Error("No active session. Run 'cms-edit open <slug>' or 'cms-edit open <id> --id' first.");
|
|
59
|
+
}
|
|
60
|
+
return session;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/session/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { SessionState } from '../session/state.js';
|
|
2
|
+
interface RenderOptions {
|
|
3
|
+
compact?: boolean;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Renders the full content tree snapshot to stdout.
|
|
7
|
+
* In JSON mode emits a single JSON object; otherwise emits formatted human text.
|
|
8
|
+
*/
|
|
9
|
+
export declare function renderSnapshot(session: SessionState, options?: RenderOptions): void;
|
|
10
|
+
/**
|
|
11
|
+
* Renders a single field value for display (used by `read` command).
|
|
12
|
+
*/
|
|
13
|
+
export declare function renderFieldValue(value: unknown, indent?: string): string;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/snapshot/render.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,UAAU,aAAa;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAsFD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,GAAE,aAAkB,GAAG,IAAI,CA4EvF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,SAAK,GAAG,MAAM,CAgBpE"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
|
|
2
|
+
import pc from 'picocolors';
|
|
3
|
+
import { isJsonMode } from '../output/mode.js';
|
|
4
|
+
import { entryLabel, refLabel, statusBadge, typeLabel } from '../output/print.js';
|
|
5
|
+
import { getEntryLabel, getEntryStatus, getEntryTypeLabel } from '../session/state.js';
|
|
6
|
+
/**
|
|
7
|
+
* Returns the snapshot as a plain JSON-serialisable object.
|
|
8
|
+
* Used by renderSnapshot when JSON mode is active.
|
|
9
|
+
*/
|
|
10
|
+
function buildSnapshotJson(session) {
|
|
11
|
+
const locale = session.defaultLocale;
|
|
12
|
+
const rootEntry = session.entries[session.rootEntryId];
|
|
13
|
+
const rootStatus = rootEntry
|
|
14
|
+
? getEntryStatus(rootEntry, session.modifiedEntryIds.includes(session.rootEntryId))
|
|
15
|
+
: 'draft';
|
|
16
|
+
const rootSlug = session.rootEntryType === 'template' || session.rootEntryType === 'navigation'
|
|
17
|
+
? ''
|
|
18
|
+
: rootEntry
|
|
19
|
+
? String(rootEntry.fields['slug']?.[locale] ?? rootEntry.fields['slug']?.['en-US'] ?? '?')
|
|
20
|
+
: '?';
|
|
21
|
+
const entries = [];
|
|
22
|
+
for (const node of session.treeNodes) {
|
|
23
|
+
if (node.entryId === session.rootEntryId)
|
|
24
|
+
continue;
|
|
25
|
+
const entry = session.entries[node.entryId];
|
|
26
|
+
if (!entry)
|
|
27
|
+
continue;
|
|
28
|
+
const isModified = session.modifiedEntryIds.includes(node.entryId);
|
|
29
|
+
const ctId = entry.sys.contentType.sys.id;
|
|
30
|
+
const typeFieldId = `${ctId}Type`;
|
|
31
|
+
const typeField = entry.fields[typeFieldId];
|
|
32
|
+
const typeVal = typeField?.[locale] ?? typeField?.['en-US'];
|
|
33
|
+
const parentNode = node.parentId
|
|
34
|
+
? session.treeNodes.find((n) => n.entryId === node.parentId)
|
|
35
|
+
: null;
|
|
36
|
+
entries.push({
|
|
37
|
+
ref: node.ref,
|
|
38
|
+
entryId: node.entryId,
|
|
39
|
+
contentType: ctId,
|
|
40
|
+
type: typeof typeVal === 'string' ? typeVal : null,
|
|
41
|
+
label: getEntryLabel(entry, locale),
|
|
42
|
+
status: getEntryStatus(entry, isModified),
|
|
43
|
+
depth: node.depth,
|
|
44
|
+
parentRef: parentNode?.ref ?? null,
|
|
45
|
+
parentField: node.parentField,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
rootType: session.rootEntryType,
|
|
50
|
+
rootSlug,
|
|
51
|
+
rootId: session.rootEntryId,
|
|
52
|
+
rootStatus,
|
|
53
|
+
spaceKey: session.spaceKey,
|
|
54
|
+
fetchedAt: session.fetchedAt,
|
|
55
|
+
unsavedChanges: session.modifiedEntryIds.length,
|
|
56
|
+
pendingDeletions: session.pendingDeletions.length,
|
|
57
|
+
entries,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Renders the full content tree snapshot to stdout.
|
|
62
|
+
* In JSON mode emits a single JSON object; otherwise emits formatted human text.
|
|
63
|
+
*/
|
|
64
|
+
export function renderSnapshot(session, options = {}) {
|
|
65
|
+
if (isJsonMode()) {
|
|
66
|
+
console.log(JSON.stringify(buildSnapshotJson(session), null, 2));
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const { compact = false } = options;
|
|
70
|
+
const locale = session.defaultLocale;
|
|
71
|
+
const rootEntry = session.entries[session.rootEntryId];
|
|
72
|
+
const rootStatus = rootEntry
|
|
73
|
+
? getEntryStatus(rootEntry, session.modifiedEntryIds.includes(session.rootEntryId))
|
|
74
|
+
: 'draft';
|
|
75
|
+
const rootSlug = session.rootEntryType === 'template' || session.rootEntryType === 'navigation'
|
|
76
|
+
? ''
|
|
77
|
+
: rootEntry
|
|
78
|
+
? String(rootEntry.fields['slug']?.[locale] ?? rootEntry.fields['slug']?.['en-US'] ?? '?')
|
|
79
|
+
: '?';
|
|
80
|
+
const rootTitle = session.rootEntryType === 'template' && rootEntry
|
|
81
|
+
? `Template: ${getEntryLabel(rootEntry, locale)}`
|
|
82
|
+
: session.rootEntryType === 'navigation' && rootEntry
|
|
83
|
+
? `Navigation: ${getEntryLabel(rootEntry, locale)}`
|
|
84
|
+
: session.rootEntryType.charAt(0).toUpperCase() + session.rootEntryType.slice(1);
|
|
85
|
+
const slugPart = session.rootEntryType === 'template' || session.rootEntryType === 'navigation'
|
|
86
|
+
? ''
|
|
87
|
+
: ` ${pc.cyan(`/${rootSlug}`)} `;
|
|
88
|
+
console.log(`\n${pc.bold(rootTitle)}:${slugPart}` +
|
|
89
|
+
`${pc.dim(`[${session.rootEntryId} | `)}${statusBadge(rootStatus)}${pc.dim(']')} ` +
|
|
90
|
+
`${pc.dim('·')} ${pc.bold(session.spaceKey)}\n`);
|
|
91
|
+
// Skip the root entry itself (index 0) — it's shown in the header
|
|
92
|
+
for (const node of session.treeNodes) {
|
|
93
|
+
if (node.entryId === session.rootEntryId)
|
|
94
|
+
continue;
|
|
95
|
+
const entry = session.entries[node.entryId];
|
|
96
|
+
if (!entry)
|
|
97
|
+
continue;
|
|
98
|
+
const isModified = session.modifiedEntryIds.includes(node.entryId);
|
|
99
|
+
const status = getEntryStatus(entry, isModified);
|
|
100
|
+
const typeLabelStr = getEntryTypeLabel(entry, locale);
|
|
101
|
+
const displayLabel = getEntryLabel(entry, locale);
|
|
102
|
+
const indent = ' '.repeat(node.depth);
|
|
103
|
+
if (compact) {
|
|
104
|
+
console.log(`${indent}${refLabel(node.ref)} ${typeLabel(typeLabelStr)}`);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
console.log(`${indent}${refLabel(node.ref)} ${typeLabel(typeLabelStr)} ${entryLabel(displayLabel)} ${statusBadge(status)}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const pendingCount = session.modifiedEntryIds.length;
|
|
111
|
+
const deletionCount = session.pendingDeletions.length;
|
|
112
|
+
if (pendingCount > 0 || deletionCount > 0) {
|
|
113
|
+
const parts = [];
|
|
114
|
+
if (pendingCount > 0)
|
|
115
|
+
parts.push(`${pendingCount} unsaved change${pendingCount > 1 ? 's' : ''}`);
|
|
116
|
+
if (deletionCount > 0)
|
|
117
|
+
parts.push(`${deletionCount} pending deletion${deletionCount > 1 ? 's' : ''}`);
|
|
118
|
+
console.log(`\n${pc.yellow(`⚠ ${parts.join(', ')} — run "cms-edit save" to write to Contentful`)}`);
|
|
119
|
+
}
|
|
120
|
+
console.log('');
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Renders a single field value for display (used by `read` command).
|
|
124
|
+
*/
|
|
125
|
+
export function renderFieldValue(value, indent = '') {
|
|
126
|
+
if (value === null || value === undefined)
|
|
127
|
+
return pc.dim('(empty)');
|
|
128
|
+
if (typeof value === 'boolean')
|
|
129
|
+
return value ? pc.green('true') : pc.red('false');
|
|
130
|
+
if (typeof value === 'number')
|
|
131
|
+
return pc.yellow(String(value));
|
|
132
|
+
if (typeof value === 'string')
|
|
133
|
+
return value.length > 0 ? value : pc.dim('(empty string)');
|
|
134
|
+
if (isRtfDocument(value))
|
|
135
|
+
return pc.dim('[Rich text — use "cms-edit read <ref> <field>" to view]');
|
|
136
|
+
if (isEntryLink(value))
|
|
137
|
+
return pc.dim(`[Entry link → ${value.sys.id}]`);
|
|
138
|
+
if (isAssetLink(value))
|
|
139
|
+
return pc.dim(`[Asset link → ${value.sys.id}]`);
|
|
140
|
+
if (Array.isArray(value)) {
|
|
141
|
+
if (value.length === 0)
|
|
142
|
+
return pc.dim('(empty array)');
|
|
143
|
+
return value
|
|
144
|
+
.map((item, i) => `${indent} [${i}] ${renderFieldValue(item, `${indent} `)}`)
|
|
145
|
+
.join('\n');
|
|
146
|
+
}
|
|
147
|
+
return JSON.stringify(value, null, 2);
|
|
148
|
+
}
|
|
149
|
+
function isRtfDocument(value) {
|
|
150
|
+
return (typeof value === 'object' &&
|
|
151
|
+
value !== null &&
|
|
152
|
+
value.nodeType === 'document');
|
|
153
|
+
}
|
|
154
|
+
function isEntryLink(value) {
|
|
155
|
+
return (typeof value === 'object' &&
|
|
156
|
+
value !== null &&
|
|
157
|
+
'sys' in value &&
|
|
158
|
+
value.sys?.linkType === 'Entry');
|
|
159
|
+
}
|
|
160
|
+
function isAssetLink(value) {
|
|
161
|
+
return (typeof value === 'object' &&
|
|
162
|
+
value !== null &&
|
|
163
|
+
'sys' in value &&
|
|
164
|
+
value.sys?.linkType === 'Asset');
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/snapshot/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content type IDs allowed when adding entries to page/article/template content arrays.
|
|
3
|
+
* Used by the add command to refuse unsupported types with a clear error.
|
|
4
|
+
*/
|
|
5
|
+
export declare const ALLOWED_CONTENT_TYPES_FOR_PAGE_ARTICLE: readonly ["component", "collection", "externalComponent", "person", "media", "externalVideo"];
|
|
6
|
+
export declare function isAllowedContentTypeForAdd(contentTypeId: string): boolean;
|
|
7
|
+
//# sourceMappingURL=allowed-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allowed-types.d.ts","sourceRoot":"","sources":["../../src/validation/allowed-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,sCAAsC,+FAOzC,CAAC;AAEX,wBAAgB,0BAA0B,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAEzE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content type IDs allowed when adding entries to page/article/template content arrays.
|
|
3
|
+
* Used by the add command to refuse unsupported types with a clear error.
|
|
4
|
+
*/
|
|
5
|
+
export const ALLOWED_CONTENT_TYPES_FOR_PAGE_ARTICLE = [
|
|
6
|
+
'component',
|
|
7
|
+
'collection',
|
|
8
|
+
'externalComponent',
|
|
9
|
+
'person',
|
|
10
|
+
'media',
|
|
11
|
+
'externalVideo',
|
|
12
|
+
];
|
|
13
|
+
export function isAllowedContentTypeForAdd(contentTypeId) {
|
|
14
|
+
return ALLOWED_CONTENT_TYPES_FOR_PAGE_ARTICLE.includes(contentTypeId);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=allowed-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allowed-types.js","sourceRoot":"","sources":["../../src/validation/allowed-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,sCAAsC,GAAG;IACpD,WAAW;IACX,YAAY;IACZ,mBAAmB;IACnB,QAAQ;IACR,OAAO;IACP,eAAe;CACP,CAAC;AAEX,MAAM,UAAU,0BAA0B,CAAC,aAAqB;IAC9D,OAAQ,sCAA4D,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AAC/F,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@se-studio/contentful-cms",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "CLI tool for AI agents to read and edit Contentful draft content without publish permissions",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/Something-Else-Studio/se-core-product",
|
|
8
|
+
"directory": "packages/contentful-cms"
|
|
9
|
+
},
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"type": "module",
|
|
12
|
+
"main": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"bin": {
|
|
21
|
+
"cms-edit": "./dist/bin/cms-edit.js"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist",
|
|
25
|
+
"skills",
|
|
26
|
+
"*.md"
|
|
27
|
+
],
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@contentful/rich-text-types": "^17.2.5",
|
|
30
|
+
"commander": "^14.0.3",
|
|
31
|
+
"contentful-management": "^11.74.0",
|
|
32
|
+
"dotenv": "^17.3.1",
|
|
33
|
+
"picocolors": "^1.1.1"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@biomejs/biome": "^2.4.6",
|
|
37
|
+
"@types/node": "^22.19.15",
|
|
38
|
+
"typescript": "^5.9.3",
|
|
39
|
+
"vitest": "^4.0.18"
|
|
40
|
+
},
|
|
41
|
+
"keywords": [
|
|
42
|
+
"contentful",
|
|
43
|
+
"cms",
|
|
44
|
+
"cli",
|
|
45
|
+
"ai-agent",
|
|
46
|
+
"content-management",
|
|
47
|
+
"typescript"
|
|
48
|
+
],
|
|
49
|
+
"homepage": "https://github.com/Something-Else-Studio/se-core-product#readme",
|
|
50
|
+
"bugs": {
|
|
51
|
+
"url": "https://github.com/Something-Else-Studio/se-core-product/issues"
|
|
52
|
+
},
|
|
53
|
+
"scripts": {
|
|
54
|
+
"build": "tsc --project tsconfig.build.json",
|
|
55
|
+
"dev": "tsc --project tsconfig.build.json --watch",
|
|
56
|
+
"type-check": "tsc --noEmit",
|
|
57
|
+
"lint": "biome lint .",
|
|
58
|
+
"clean": "rm -rf dist .turbo *.tsbuildinfo",
|
|
59
|
+
"test": "vitest run --passWithNoTests"
|
|
60
|
+
}
|
|
61
|
+
}
|