@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.
Files changed (173) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +519 -0
  3. package/dist/bin/cms-edit.d.ts +4 -0
  4. package/dist/bin/cms-edit.d.ts.map +1 -0
  5. package/dist/bin/cms-edit.js +101 -0
  6. package/dist/bin/cms-edit.js.map +1 -0
  7. package/dist/commands/add.d.ts +4 -0
  8. package/dist/commands/add.d.ts.map +1 -0
  9. package/dist/commands/add.js +166 -0
  10. package/dist/commands/add.js.map +1 -0
  11. package/dist/commands/asset.d.ts +4 -0
  12. package/dist/commands/asset.d.ts.map +1 -0
  13. package/dist/commands/asset.js +110 -0
  14. package/dist/commands/asset.js.map +1 -0
  15. package/dist/commands/colours.d.ts +4 -0
  16. package/dist/commands/colours.d.ts.map +1 -0
  17. package/dist/commands/colours.js +91 -0
  18. package/dist/commands/colours.js.map +1 -0
  19. package/dist/commands/create.d.ts +4 -0
  20. package/dist/commands/create.d.ts.map +1 -0
  21. package/dist/commands/create.js +223 -0
  22. package/dist/commands/create.js.map +1 -0
  23. package/dist/commands/diff.d.ts +4 -0
  24. package/dist/commands/diff.d.ts.map +1 -0
  25. package/dist/commands/diff.js +141 -0
  26. package/dist/commands/diff.js.map +1 -0
  27. package/dist/commands/discard.d.ts +4 -0
  28. package/dist/commands/discard.d.ts.map +1 -0
  29. package/dist/commands/discard.js +36 -0
  30. package/dist/commands/discard.js.map +1 -0
  31. package/dist/commands/entry-search.d.ts +4 -0
  32. package/dist/commands/entry-search.d.ts.map +1 -0
  33. package/dist/commands/entry-search.js +81 -0
  34. package/dist/commands/entry-search.js.map +1 -0
  35. package/dist/commands/export-converted.d.ts +8 -0
  36. package/dist/commands/export-converted.d.ts.map +1 -0
  37. package/dist/commands/export-converted.js +62 -0
  38. package/dist/commands/export-converted.js.map +1 -0
  39. package/dist/commands/links.d.ts +4 -0
  40. package/dist/commands/links.d.ts.map +1 -0
  41. package/dist/commands/links.js +255 -0
  42. package/dist/commands/links.js.map +1 -0
  43. package/dist/commands/list.d.ts +4 -0
  44. package/dist/commands/list.d.ts.map +1 -0
  45. package/dist/commands/list.js +91 -0
  46. package/dist/commands/list.js.map +1 -0
  47. package/dist/commands/move.d.ts +3 -0
  48. package/dist/commands/move.d.ts.map +1 -0
  49. package/dist/commands/move.js +84 -0
  50. package/dist/commands/move.js.map +1 -0
  51. package/dist/commands/nav.d.ts +4 -0
  52. package/dist/commands/nav.d.ts.map +1 -0
  53. package/dist/commands/nav.js +196 -0
  54. package/dist/commands/nav.js.map +1 -0
  55. package/dist/commands/open.d.ts +4 -0
  56. package/dist/commands/open.d.ts.map +1 -0
  57. package/dist/commands/open.js +74 -0
  58. package/dist/commands/open.js.map +1 -0
  59. package/dist/commands/read.d.ts +4 -0
  60. package/dist/commands/read.d.ts.map +1 -0
  61. package/dist/commands/read.js +102 -0
  62. package/dist/commands/read.js.map +1 -0
  63. package/dist/commands/remove.d.ts +4 -0
  64. package/dist/commands/remove.d.ts.map +1 -0
  65. package/dist/commands/remove.js +98 -0
  66. package/dist/commands/remove.js.map +1 -0
  67. package/dist/commands/rtf.d.ts +3 -0
  68. package/dist/commands/rtf.d.ts.map +1 -0
  69. package/dist/commands/rtf.js +131 -0
  70. package/dist/commands/rtf.js.map +1 -0
  71. package/dist/commands/save.d.ts +4 -0
  72. package/dist/commands/save.d.ts.map +1 -0
  73. package/dist/commands/save.js +59 -0
  74. package/dist/commands/save.js.map +1 -0
  75. package/dist/commands/screenshot.d.ts +4 -0
  76. package/dist/commands/screenshot.d.ts.map +1 -0
  77. package/dist/commands/screenshot.js +246 -0
  78. package/dist/commands/screenshot.js.map +1 -0
  79. package/dist/commands/set.d.ts +3 -0
  80. package/dist/commands/set.d.ts.map +1 -0
  81. package/dist/commands/set.js +152 -0
  82. package/dist/commands/set.js.map +1 -0
  83. package/dist/commands/skill.d.ts +4 -0
  84. package/dist/commands/skill.d.ts.map +1 -0
  85. package/dist/commands/skill.js +73 -0
  86. package/dist/commands/skill.js.map +1 -0
  87. package/dist/commands/snapshot.d.ts +3 -0
  88. package/dist/commands/snapshot.d.ts.map +1 -0
  89. package/dist/commands/snapshot.js +21 -0
  90. package/dist/commands/snapshot.js.map +1 -0
  91. package/dist/commands/types.d.ts +4 -0
  92. package/dist/commands/types.d.ts.map +1 -0
  93. package/dist/commands/types.js +78 -0
  94. package/dist/commands/types.js.map +1 -0
  95. package/dist/config/load.d.ts +14 -0
  96. package/dist/config/load.d.ts.map +1 -0
  97. package/dist/config/load.js +79 -0
  98. package/dist/config/load.js.map +1 -0
  99. package/dist/config/types.d.ts +13 -0
  100. package/dist/config/types.d.ts.map +1 -0
  101. package/dist/config/types.js +2 -0
  102. package/dist/config/types.js.map +1 -0
  103. package/dist/contentful/assets.d.ts +20 -0
  104. package/dist/contentful/assets.d.ts.map +1 -0
  105. package/dist/contentful/assets.js +36 -0
  106. package/dist/contentful/assets.js.map +1 -0
  107. package/dist/contentful/client.d.ts +28 -0
  108. package/dist/contentful/client.d.ts.map +1 -0
  109. package/dist/contentful/client.js +30 -0
  110. package/dist/contentful/client.js.map +1 -0
  111. package/dist/contentful/fetch.d.ts +20 -0
  112. package/dist/contentful/fetch.d.ts.map +1 -0
  113. package/dist/contentful/fetch.js +154 -0
  114. package/dist/contentful/fetch.js.map +1 -0
  115. package/dist/contentful/references.d.ts +7 -0
  116. package/dist/contentful/references.d.ts.map +1 -0
  117. package/dist/contentful/references.js +12 -0
  118. package/dist/contentful/references.js.map +1 -0
  119. package/dist/contentful/write.d.ts +16 -0
  120. package/dist/contentful/write.d.ts.map +1 -0
  121. package/dist/contentful/write.js +75 -0
  122. package/dist/contentful/write.js.map +1 -0
  123. package/dist/index.d.ts +3 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +2 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/output/json.d.ts +47 -0
  128. package/dist/output/json.d.ts.map +1 -0
  129. package/dist/output/json.js +87 -0
  130. package/dist/output/json.js.map +1 -0
  131. package/dist/output/mode.d.ts +3 -0
  132. package/dist/output/mode.d.ts.map +1 -0
  133. package/dist/output/mode.js +16 -0
  134. package/dist/output/mode.js.map +1 -0
  135. package/dist/output/print.d.ts +14 -0
  136. package/dist/output/print.d.ts.map +1 -0
  137. package/dist/output/print.js +61 -0
  138. package/dist/output/print.js.map +1 -0
  139. package/dist/rtf/fromMarkdown.d.ts +19 -0
  140. package/dist/rtf/fromMarkdown.d.ts.map +1 -0
  141. package/dist/rtf/fromMarkdown.js +230 -0
  142. package/dist/rtf/fromMarkdown.js.map +1 -0
  143. package/dist/rtf/toMarkdown.d.ts +6 -0
  144. package/dist/rtf/toMarkdown.d.ts.map +1 -0
  145. package/dist/rtf/toMarkdown.js +105 -0
  146. package/dist/rtf/toMarkdown.js.map +1 -0
  147. package/dist/session/refs.d.ts +35 -0
  148. package/dist/session/refs.d.ts.map +1 -0
  149. package/dist/session/refs.js +128 -0
  150. package/dist/session/refs.js.map +1 -0
  151. package/dist/session/state.d.ts +91 -0
  152. package/dist/session/state.d.ts.map +1 -0
  153. package/dist/session/state.js +61 -0
  154. package/dist/session/state.js.map +1 -0
  155. package/dist/session/store.d.ts +10 -0
  156. package/dist/session/store.d.ts.map +1 -0
  157. package/dist/session/store.js +62 -0
  158. package/dist/session/store.js.map +1 -0
  159. package/dist/snapshot/render.d.ts +15 -0
  160. package/dist/snapshot/render.d.ts.map +1 -0
  161. package/dist/snapshot/render.js +166 -0
  162. package/dist/snapshot/render.js.map +1 -0
  163. package/dist/validation/allowed-types.d.ts +7 -0
  164. package/dist/validation/allowed-types.d.ts.map +1 -0
  165. package/dist/validation/allowed-types.js +16 -0
  166. package/dist/validation/allowed-types.js.map +1 -0
  167. package/package.json +61 -0
  168. package/skills/core/SKILL.md +483 -0
  169. package/skills/manifest.json +7 -0
  170. package/skills/navigation/SKILL.md +18 -0
  171. package/skills/rich-text/SKILL.md +23 -0
  172. package/skills/screenshots/SKILL.md +32 -0
  173. package/skills/templates/SKILL.md +16 -0
@@ -0,0 +1,131 @@
1
+ import * as fs from 'node:fs';
2
+ import { BLOCKS } from '@contentful/rich-text-types';
3
+ import { errorMsg, successMsg } from '../output/print.js';
4
+ import { markdownToRtf } from '../rtf/fromMarkdown.js';
5
+ import { resolveRef } from '../session/refs.js';
6
+ import { requireSession, saveSession } from '../session/store.js';
7
+ const RTF_DESCRIPTION = 'Set a rich text field from Markdown input.\n' +
8
+ 'Use --file <path> to read from a file, or pass "-" to read from stdin.\n' +
9
+ 'Supports: # headings, **bold**, _italic_, [links](url), - lists, 1. lists, > blockquotes.\n' +
10
+ 'Subcommand: embed — insert embedded entry or asset block.';
11
+ export function registerRtfCommand(program) {
12
+ const rtfCmd = program
13
+ .command('rtf [ref] [field] [markdown]')
14
+ .description(RTF_DESCRIPTION)
15
+ .option('--file <path>', 'Read Markdown from a file')
16
+ .action(async (ref, field, markdownArg, opts) => {
17
+ try {
18
+ if (!ref || !field) {
19
+ errorMsg('Set rich text: provide <ref> and <field>. Example: cms-edit rtf @c1 body "..."');
20
+ process.exit(1);
21
+ }
22
+ const markdown = await resolveMarkdownInput(markdownArg, opts.file);
23
+ const session = requireSession();
24
+ const entry = resolveRef(session, ref);
25
+ const locale = session.defaultLocale;
26
+ const document = markdownToRtf(markdown);
27
+ if (!entry.fields[field]) {
28
+ entry.fields[field] = {};
29
+ }
30
+ entry.fields[field][locale] = document;
31
+ if (!session.modifiedEntryIds.includes(entry.sys.id)) {
32
+ session.modifiedEntryIds.push(entry.sys.id);
33
+ }
34
+ saveSession(session);
35
+ successMsg(`Set rich text field "${field}" on ${ref}.`);
36
+ }
37
+ catch (err) {
38
+ errorMsg(err instanceof Error ? err.message : String(err));
39
+ process.exit(1);
40
+ }
41
+ });
42
+ rtfCmd
43
+ .command('embed <ref> <field> <id>')
44
+ .description('Insert an embedded entry or asset block into a rich text field.')
45
+ .option('--at <index>', 'Insert at block index (0-based); omit to append at end', (v) => Number.parseInt(v, 10))
46
+ .option('--asset', 'Treat <id> as asset ID (default: entry ID)')
47
+ .action(async (ref, field, id, opts) => {
48
+ try {
49
+ const session = requireSession();
50
+ const entry = resolveRef(session, ref);
51
+ const locale = session.defaultLocale;
52
+ const fieldData = entry.fields[field];
53
+ if (!fieldData || typeof fieldData !== 'object') {
54
+ errorMsg(`Field "${field}" is missing on ${ref}.`);
55
+ process.exit(1);
56
+ }
57
+ const raw = fieldData[locale] ?? fieldData['en-US'];
58
+ if (raw === undefined || raw === null) {
59
+ errorMsg(`Field "${field}" has no value for locale. Set rich text content first (e.g. cms-edit rtf ${ref} ${field} "").`);
60
+ process.exit(1);
61
+ }
62
+ const doc = raw;
63
+ if (typeof doc !== 'object' ||
64
+ doc === null ||
65
+ doc.nodeType !== BLOCKS.DOCUMENT) {
66
+ errorMsg(`Field "${field}" is not a rich text document (nodeType must be "${BLOCKS.DOCUMENT}").`);
67
+ process.exit(1);
68
+ }
69
+ const document = doc;
70
+ const content = Array.isArray(document.content) ? [...document.content] : [];
71
+ const block = opts.asset
72
+ ? {
73
+ nodeType: BLOCKS.EMBEDDED_ASSET,
74
+ data: {
75
+ target: {
76
+ sys: { type: 'Link', linkType: 'Asset', id },
77
+ },
78
+ },
79
+ content: [],
80
+ }
81
+ : {
82
+ nodeType: BLOCKS.EMBEDDED_ENTRY,
83
+ data: {
84
+ target: {
85
+ sys: { type: 'Link', linkType: 'Entry', id },
86
+ },
87
+ },
88
+ content: [],
89
+ };
90
+ if (opts.at !== undefined) {
91
+ const at = Number.isNaN(opts.at) ? 0 : Math.max(0, Math.min(opts.at, content.length));
92
+ content.splice(at, 0, block);
93
+ }
94
+ else {
95
+ content.push(block);
96
+ }
97
+ const updated = {
98
+ ...document,
99
+ content,
100
+ };
101
+ entry.fields[field][locale] = updated;
102
+ if (!session.modifiedEntryIds.includes(entry.sys.id)) {
103
+ session.modifiedEntryIds.push(entry.sys.id);
104
+ }
105
+ saveSession(session);
106
+ const kind = opts.asset ? 'asset' : 'entry';
107
+ successMsg(`Inserted embedded ${kind} block into "${field}" on ${ref}.`);
108
+ }
109
+ catch (err) {
110
+ errorMsg(err instanceof Error ? err.message : String(err));
111
+ process.exit(1);
112
+ }
113
+ });
114
+ }
115
+ async function resolveMarkdownInput(markdownArg, filePath) {
116
+ if (filePath) {
117
+ return fs.readFileSync(filePath, 'utf-8');
118
+ }
119
+ if (markdownArg === '-') {
120
+ const chunks = [];
121
+ for await (const chunk of process.stdin) {
122
+ chunks.push(typeof chunk === 'string' ? Buffer.from(chunk, 'utf-8') : chunk);
123
+ }
124
+ return Buffer.concat(chunks).toString('utf-8');
125
+ }
126
+ if (markdownArg !== undefined && markdownArg !== '') {
127
+ return markdownArg;
128
+ }
129
+ throw new Error('Provide markdown as argument, or use --file <path>, or "-" for stdin.');
130
+ }
131
+ //# sourceMappingURL=rtf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rtf.js","sourceRoot":"","sources":["../../src/commands/rtf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
2
+ import type { Command } from 'commander';
3
+ export declare function registerSaveCommand(program: Command): void;
4
+ //# sourceMappingURL=save.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../src/commands/save.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+D1D"}
@@ -0,0 +1,59 @@
1
+ /** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
2
+ import { loadConfig, resolveSpaceConfig } from '../config/load.js';
3
+ import { createSafeEnvironment } from '../contentful/client.js';
4
+ import { applySessionPatches } from '../contentful/write.js';
5
+ import { errorMsg, infoMsg, successMsg, warnMsg } from '../output/print.js';
6
+ import { clearSession, requireSession, saveSession } from '../session/store.js';
7
+ export function registerSaveCommand(program) {
8
+ program
9
+ .command('save')
10
+ .description('Write all pending changes to Contentful as drafts.\n' +
11
+ 'This NEVER publishes — a human must review and publish in Contentful.')
12
+ .action(async (_opts, cmd) => {
13
+ const parentOpts = cmd.parent?.opts() ?? {};
14
+ try {
15
+ const session = requireSession();
16
+ if (session.modifiedEntryIds.length === 0 && session.pendingDeletions.length === 0) {
17
+ infoMsg('Nothing to save.');
18
+ return;
19
+ }
20
+ const changeCount = session.modifiedEntryIds.length;
21
+ const deletionCount = session.pendingDeletions.length;
22
+ infoMsg(`Saving ${changeCount} change${changeCount !== 1 ? 's' : ''}` +
23
+ (deletionCount > 0
24
+ ? ` and ${deletionCount} deletion${deletionCount !== 1 ? 's' : ''}`
25
+ : '') +
26
+ ` to Contentful (space: ${session.spaceKey})…`);
27
+ const config = loadConfig(parentOpts.config);
28
+ const { space } = resolveSpaceConfig(config, session.spaceKey);
29
+ const env = await createSafeEnvironment(space);
30
+ const { saved, failed } = await applySessionPatches(env, session);
31
+ if (saved.length > 0) {
32
+ // Update session: clear modified + deletions for what was saved
33
+ session.modifiedEntryIds = session.modifiedEntryIds.filter((id) => !saved.includes(id));
34
+ session.pendingDeletions = session.pendingDeletions.filter((id) => !saved.includes(id));
35
+ // Sync originalEntries to reflect the saved state
36
+ for (const id of saved) {
37
+ const entry = session.entries[id];
38
+ if (entry) {
39
+ session.originalEntries[id] = JSON.parse(JSON.stringify(entry));
40
+ }
41
+ }
42
+ saveSession(session);
43
+ successMsg(`Saved ${saved.length} entr${saved.length !== 1 ? 'ies' : 'y'} as drafts.`);
44
+ infoMsg('These changes are now visible in Contentful as drafts. A human must publish them to go live.');
45
+ }
46
+ for (const f of failed) {
47
+ warnMsg(f.error);
48
+ }
49
+ if (session.modifiedEntryIds.length === 0 && session.pendingDeletions.length === 0) {
50
+ clearSession(session.spaceId, session.rootEntryId);
51
+ }
52
+ }
53
+ catch (err) {
54
+ errorMsg(err instanceof Error ? err.message : String(err));
55
+ process.exit(1);
56
+ }
57
+ });
58
+ }
59
+ //# sourceMappingURL=save.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save.js","sourceRoot":"","sources":["../../src/commands/save.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
2
+ import type { Command } from 'commander';
3
+ export declare function registerScreenshotCommand(program: Command): void;
4
+ //# sourceMappingURL=screenshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/commands/screenshot.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAKvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0DzC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2QhE"}
@@ -0,0 +1,246 @@
1
+ /** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
2
+ import { spawnSync } from 'node:child_process';
3
+ import * as fs from 'node:fs';
4
+ import * as path from 'node:path';
5
+ import { loadConfig, resolveSpaceConfig } from '../config/load.js';
6
+ import { isJsonMode } from '../output/mode.js';
7
+ import { errorMsg, infoMsg, successMsg, warnMsg } from '../output/print.js';
8
+ import { resolveRef } from '../session/refs.js';
9
+ import { loadSession } from '../session/store.js';
10
+ const DEFAULT_WAIT_MS = 500;
11
+ /** Longer wait for showcase/render-json so URL params (e.g. backgroundColour) are applied before capture. */
12
+ const SHOWCASE_WAIT_MS = 1500;
13
+ const DEFAULT_VIEWPORT_WIDTH = 1280;
14
+ const DEFAULT_VIEWPORT_HEIGHT = 900;
15
+ const DEFAULT_BASE_URL = 'http://localhost:3000';
16
+ function isComponentOrCollectionUrl(url) {
17
+ return (url.includes('/cms-showcase/render') ||
18
+ url.includes('/cms-preview/render') ||
19
+ url.includes('/cms-preview/render-json'));
20
+ }
21
+ /** Collect repeatable --param key=value into an array. */
22
+ function collectParam(value, prev) {
23
+ prev.push(value);
24
+ return prev;
25
+ }
26
+ /** Parse --param key=value strings into a record for the showcase URL. */
27
+ function parseParamOverrides(params) {
28
+ const out = {};
29
+ for (const p of params) {
30
+ const eq = p.indexOf('=');
31
+ if (eq === -1)
32
+ continue;
33
+ const key = p.slice(0, eq).trim();
34
+ const value = p.slice(eq + 1).trim();
35
+ if (key)
36
+ out[key] = value;
37
+ }
38
+ return out;
39
+ }
40
+ export function registerScreenshotCommand(program) {
41
+ program
42
+ .command('screenshot [target]')
43
+ .description('Take a screenshot of a component, collection, or page. Requires agent-browser.\n\n' +
44
+ ' <target> can be:\n' +
45
+ ' @c0 — component/collection ref from current session\n' +
46
+ ' /pricing — page by slug\n' +
47
+ ' (omitted) — current open page (uses session root slug)\n\n' +
48
+ ' Type-only (no session needed):\n' +
49
+ ' --component HeroSimple\n' +
50
+ ' --collection CardGrid')
51
+ .option('--component <type>', 'Showcase a component by type name (no session needed)')
52
+ .option('--collection <type>', 'Showcase a collection by type name (no session needed)')
53
+ .option('--live', 'Fetch real Contentful data via /cms-preview/render?id=... (requires preview token)')
54
+ .option('--out <path>', 'Output file path (default: ./screenshot-<type>-<timestamp>.png)')
55
+ .option('--full', 'Capture the full scrollable page (passed to agent-browser)')
56
+ .option('--embedded', 'Append &embedded=true to showcase URL (suppresses IframeHeightReporter)')
57
+ .option('--clean', 'Use default showcase state only (no curated mock data). Use with --component/--collection.')
58
+ .option('--wait <ms>', 'Milliseconds to wait after page load before capturing', String(DEFAULT_WAIT_MS))
59
+ .option('--url-only', 'Print the URL only, do not invoke agent-browser (useful when browser unavailable)')
60
+ .option('--json-file <path>', 'Read an IBase* JSON file and screenshot it directly (no Contentful needed)')
61
+ .option('--param <key=value>', 'Showcase override (repeatable). Use with --component/--collection. E.g. --param backgroundColour=Navy --param textColour="Off White"', collectParam, [])
62
+ .option('--width <px>', 'Viewport width in pixels (e.g. 375 mobile, 768 tablet, 1280 desktop). Requires agent-browser.', String)
63
+ .option('--height <px>', 'Viewport height in pixels (used with --width; default 900 if only --width given)', String)
64
+ .action(async (target, opts) => {
65
+ try {
66
+ const parentOpts = program.opts();
67
+ const spaceKey = parentOpts.space;
68
+ const configPath = parentOpts.config;
69
+ const config = loadConfig(configPath);
70
+ const { space } = resolveSpaceConfig(config, spaceKey);
71
+ const baseUrl = space.devBaseUrl ?? DEFAULT_BASE_URL;
72
+ if (!space.devBaseUrl) {
73
+ warnMsg(`No devBaseUrl set for this space. Defaulting to ${DEFAULT_BASE_URL}. ` +
74
+ 'Add "devBaseUrl": "http://localhost:<port>" to your .contentful-cms.json.');
75
+ }
76
+ let url;
77
+ let displayType = 'page';
78
+ if (opts.jsonFile) {
79
+ // JSON file mode: read file, base64-encode, render-json URL (no Contentful)
80
+ const raw = fs.readFileSync(opts.jsonFile, 'utf-8');
81
+ const data = JSON.parse(raw);
82
+ const encoded = Buffer.from(raw, 'utf-8').toString('base64');
83
+ url = `${baseUrl}/cms-preview/render-json?data=${encoded}`;
84
+ displayType = data?.type ?? 'json';
85
+ }
86
+ else if (opts.component || opts.collection) {
87
+ // Type-only mode: showcase render with defaults and optional --param overrides
88
+ const mode = opts.component ? 'component' : 'collection';
89
+ const typeValue = (opts.component ?? opts.collection);
90
+ displayType = typeValue;
91
+ const paramFields = parseParamOverrides(opts.param ?? []);
92
+ url = buildShowcaseUrl(baseUrl, typeValue, mode, paramFields, opts.embedded, opts.clean);
93
+ }
94
+ else if (target?.startsWith('@')) {
95
+ // Ref mode: convert API → render-json (all entry types including person)
96
+ const session = loadSession();
97
+ if (!session) {
98
+ throw new Error("No active session. Run 'cms-edit open <slug>' or 'cms-edit open <id> --id' first. Or use --component / --collection for type-only mode.");
99
+ }
100
+ const entry = resolveRef(session, target);
101
+ const entryId = entry.sys.id;
102
+ const convertUrl = `${baseUrl}/api/cms-preview/convert?id=${entryId}`;
103
+ const res = await fetch(convertUrl);
104
+ if (!res.ok) {
105
+ const text = await res.text();
106
+ throw new Error(`Convert API failed (${res.status}). Ensure the app is running and not in production. ${text.slice(0, 100)}`);
107
+ }
108
+ const { data } = (await res.json());
109
+ if (data === undefined || data === null) {
110
+ throw new Error('Convert API returned no data.');
111
+ }
112
+ const encoded = Buffer.from(JSON.stringify(data), 'utf-8').toString('base64');
113
+ url = `${baseUrl}/cms-preview/render-json?data=${encoded}`;
114
+ displayType = data?.type ?? entryId;
115
+ }
116
+ else if (target?.startsWith('/') || target?.startsWith('http')) {
117
+ // Explicit slug or URL
118
+ url = target.startsWith('http') ? target : `${baseUrl}${target}`;
119
+ displayType = target;
120
+ }
121
+ else if (!target) {
122
+ // No target — use session root slug
123
+ const session = loadSession();
124
+ if (!session) {
125
+ throw new Error("No active session. Run 'cms-edit open <slug>' or 'cms-edit open <id> --id' first. Or pass a slug, e.g. cms-edit screenshot /pricing");
126
+ }
127
+ const rootEntry = session.entries[session.rootEntryId];
128
+ const locale = session.defaultLocale;
129
+ const slug = rootEntry?.fields['slug']?.[locale] ??
130
+ rootEntry?.fields['slug']?.['en-US'];
131
+ if (!slug) {
132
+ throw new Error('Could not determine slug from current session root entry.');
133
+ }
134
+ const normalizedSlug = slug.startsWith('/') ? slug : `/${slug}`;
135
+ url = `${baseUrl}${normalizedSlug}`;
136
+ displayType = normalizedSlug;
137
+ }
138
+ else {
139
+ throw new Error(`Unrecognised target "${target}". Use a @ref, a /slug, --component <type>, or --collection <type>.`);
140
+ }
141
+ const isShowcase = isComponentOrCollectionUrl(url);
142
+ const waitMs = opts.wait
143
+ ? Number(opts.wait)
144
+ : isShowcase
145
+ ? SHOWCASE_WAIT_MS
146
+ : DEFAULT_WAIT_MS;
147
+ if (opts.urlOnly || isJsonMode()) {
148
+ if (isJsonMode()) {
149
+ console.log(JSON.stringify({ ok: true, url, type: displayType }));
150
+ }
151
+ else {
152
+ console.log(url);
153
+ }
154
+ return;
155
+ }
156
+ // Require agent-browser when actually taking a screenshot (skip when --url-only)
157
+ const agentBrowserCheck = spawnSync('agent-browser', ['--version'], {
158
+ encoding: 'utf-8',
159
+ stdio: 'ignore',
160
+ });
161
+ if (agentBrowserCheck.error || agentBrowserCheck.status !== 0) {
162
+ errorMsg('Screenshots require agent-browser. Install with: npm install -g agent-browser && agent-browser install. Then run this command again.');
163
+ process.exit(1);
164
+ }
165
+ // Resolve output path
166
+ const timestamp = Date.now();
167
+ const safeName = displayType.replace(/[^a-zA-Z0-9_-]/g, '-').replace(/-+/g, '-');
168
+ const outPath = opts.out ?? `./screenshot-${safeName}-${timestamp}.png`;
169
+ const resolvedOutPath = path.resolve(outPath);
170
+ infoMsg(`Navigating to ${url}`);
171
+ // Open URL
172
+ const openResult = spawnSync('agent-browser', ['open', url], {
173
+ stdio: 'inherit',
174
+ shell: false,
175
+ });
176
+ if (openResult.status !== 0) {
177
+ throw new Error(`agent-browser failed to open URL: ${url}`);
178
+ }
179
+ // Set viewport: explicit --width, or default desktop for component/collection URLs
180
+ const widthPx = opts.width ? Number(opts.width) : Number.NaN;
181
+ const useExplicitWidth = Number.isFinite(widthPx) && widthPx > 0;
182
+ const useDefaultDesktopViewport = !opts.width && isShowcase;
183
+ if (useExplicitWidth || useDefaultDesktopViewport) {
184
+ const w = useExplicitWidth ? Math.round(widthPx) : DEFAULT_VIEWPORT_WIDTH;
185
+ const h = useExplicitWidth && opts.height && Number(opts.height) > 0
186
+ ? Math.round(Number(opts.height))
187
+ : DEFAULT_VIEWPORT_HEIGHT;
188
+ const viewportResult = spawnSync('agent-browser', ['set', 'viewport', String(w), String(h)], {
189
+ stdio: 'inherit',
190
+ shell: false,
191
+ });
192
+ if (viewportResult.status !== 0) {
193
+ warnMsg('agent-browser set viewport failed, proceeding with default viewport.');
194
+ }
195
+ }
196
+ // Wait for page to settle
197
+ if (waitMs > 0) {
198
+ const waitResult = spawnSync('agent-browser', ['wait', String(waitMs)], {
199
+ stdio: 'inherit',
200
+ shell: false,
201
+ });
202
+ if (waitResult.status !== 0) {
203
+ warnMsg('agent-browser wait step failed, proceeding with screenshot anyway.');
204
+ }
205
+ }
206
+ // Take screenshot
207
+ const screenshotArgs = ['screenshot', resolvedOutPath];
208
+ if (opts.full ?? isShowcase) {
209
+ screenshotArgs.push('--full');
210
+ }
211
+ const screenshotResult = spawnSync('agent-browser', screenshotArgs, {
212
+ stdio: 'inherit',
213
+ shell: false,
214
+ });
215
+ if (screenshotResult.status !== 0) {
216
+ throw new Error('agent-browser screenshot step failed.');
217
+ }
218
+ // Close browser
219
+ spawnSync('agent-browser', ['close'], { stdio: 'inherit', shell: false });
220
+ if (opts.json || isJsonMode()) {
221
+ console.log(JSON.stringify({ ok: true, url, file: resolvedOutPath }));
222
+ }
223
+ else {
224
+ successMsg(`Screenshot saved: ${resolvedOutPath}`);
225
+ }
226
+ }
227
+ catch (err) {
228
+ errorMsg(err instanceof Error ? err.message : String(err));
229
+ process.exit(1);
230
+ }
231
+ });
232
+ }
233
+ function buildShowcaseUrl(baseUrl, type, mode, fields, embedded, clean) {
234
+ const params = new URLSearchParams({ type, mode });
235
+ for (const [key, value] of Object.entries(fields)) {
236
+ params.set(key, value);
237
+ }
238
+ if (embedded) {
239
+ params.set('embedded', 'true');
240
+ }
241
+ if (clean) {
242
+ params.set('clean', 'true');
243
+ }
244
+ return `${baseUrl}/cms-showcase/render?${params.toString()}`;
245
+ }
246
+ //# sourceMappingURL=screenshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../src/commands/screenshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerSetCommand(program: Command): void;
3
+ //# sourceMappingURL=set.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../src/commands/set.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwIzD"}