@se-studio/contentful-cms 1.0.16 → 1.0.18

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 CHANGED
@@ -1,5 +1,17 @@
1
1
  # @se-studio/contentful-cms Changelog
2
2
 
3
+ ## 1.0.18
4
+
5
+ ### Patch Changes
6
+
7
+ - Bulk version bump: patch for all packages
8
+
9
+ ## 1.0.17
10
+
11
+ ### Patch Changes
12
+
13
+ - Bulk version bump: patch for all packages
14
+
3
15
  ## 1.0.16
4
16
 
5
17
  ### Patch Changes
@@ -5,6 +5,7 @@ import { fileURLToPath } from 'node:url';
5
5
  import { Command } from 'commander';
6
6
  import { registerAddCommand } from '../commands/add.js';
7
7
  import { registerAssetCommand } from '../commands/asset.js';
8
+ import { registerBackupCommand } from '../commands/backup.js';
8
9
  import { registerColoursCommand } from '../commands/colours.js';
9
10
  import { registerCreateCommand } from '../commands/create.js';
10
11
  import { registerDiffCommand } from '../commands/diff.js';
@@ -19,6 +20,7 @@ import { registerOpenCommand } from '../commands/open.js';
19
20
  import { registerReadCommand } from '../commands/read.js';
20
21
  import { registerRemoveCommand } from '../commands/remove.js';
21
22
  import { registerResolveCommand } from '../commands/resolve.js';
23
+ import { registerRestoreCommand } from '../commands/restore.js';
22
24
  import { registerRtfCommand } from '../commands/rtf.js';
23
25
  import { registerSaveCommand } from '../commands/save.js';
24
26
  import { registerScreenshotCommand } from '../commands/screenshot.js';
@@ -59,6 +61,8 @@ registerLinksCommand(program);
59
61
  registerAddCommand(program);
60
62
  registerRemoveCommand(program);
61
63
  registerMoveCommand(program);
64
+ registerBackupCommand(program);
65
+ registerRestoreCommand(program);
62
66
  registerCreateCommand(program);
63
67
  registerNavCommand(program);
64
68
  registerAssetCommand(program);
@@ -1 +1 @@
1
- {"version":3,"file":"cms-edit.js","sourceRoot":"","sources":["../../src/bin/cms-edit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cms-edit.js","sourceRoot":"","sources":["../../src/bin/cms-edit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerBackupCommand(program: Command): void;
3
+ //# sourceMappingURL=backup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwJ5D"}
@@ -0,0 +1,143 @@
1
+ /** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
2
+ import * as path from 'node:path';
3
+ import { loadConfig, resolveSpaceConfig } from '../config/load.js';
4
+ import { createSafeEnvironment } from '../contentful/client.js';
5
+ import { fetchEntryTree, findEntryBySlug, serializeEntry } from '../contentful/fetch.js';
6
+ import { isJsonMode } from '../output/mode.js';
7
+ import { errorMsg, infoMsg, successMsg } from '../output/print.js';
8
+ import { BACKUPS_DIR, generateBackupFilename, listBackups, writeBackup, } from '../session/backup.js';
9
+ import { loadSession } from '../session/store.js';
10
+ export function registerBackupCommand(program) {
11
+ const backupCmd = program
12
+ .command('backup [slug-or-id]')
13
+ .description('Snapshot the current Contentful state of an entry tree to a JSON file. ' +
14
+ 'Omit slug-or-id to use the active session.')
15
+ .option('--id', 'Treat argument as a Contentful entry ID instead of a slug')
16
+ .option('--label <text>', 'Human-readable label stored in backup metadata')
17
+ .option('--output <path>', 'Write to this path instead of ~/.contentful-cms/backups/');
18
+ // list subcommand
19
+ backupCmd
20
+ .command('list')
21
+ .description('List all backups in ~/.contentful-cms/backups/')
22
+ .action(() => {
23
+ try {
24
+ const backups = listBackups();
25
+ if (isJsonMode()) {
26
+ console.log(JSON.stringify(backups));
27
+ return;
28
+ }
29
+ if (backups.length === 0) {
30
+ console.log(`No backups found in ${BACKUPS_DIR}`);
31
+ return;
32
+ }
33
+ console.log(`\nBackups in ${BACKUPS_DIR}:\n`);
34
+ for (const [i, b] of backups.entries()) {
35
+ const slug = b.meta.rootSlug ?? b.meta.rootEntryId;
36
+ const label = b.meta.label ? ` "${b.meta.label}"` : '';
37
+ console.log(` ${String(i + 1).padStart(2)}. ${b.filename}` +
38
+ `\n ${b.meta.createdAt} space:${b.meta.spaceKey} ${slug} ${b.meta.entryCount} entries${label}`);
39
+ }
40
+ console.log('');
41
+ }
42
+ catch (err) {
43
+ errorMsg(err instanceof Error ? err.message : String(err));
44
+ process.exit(1);
45
+ }
46
+ });
47
+ backupCmd.action(async (slugOrId, opts, cmd) => {
48
+ const parentOpts = cmd.parent?.opts() ?? {};
49
+ try {
50
+ let entries;
51
+ let rootEntryId;
52
+ let spaceKey;
53
+ let spaceId;
54
+ let environment;
55
+ let defaultLocale;
56
+ if (slugOrId !== undefined) {
57
+ // Fetch fresh from Contentful
58
+ const config = loadConfig(parentOpts.config);
59
+ const resolved = resolveSpaceConfig(config, parentOpts.space);
60
+ spaceKey = resolved.key;
61
+ const space = resolved.space;
62
+ spaceId = space.spaceId;
63
+ environment = space.environment;
64
+ defaultLocale = space.defaultLocale;
65
+ const env = await createSafeEnvironment(space);
66
+ infoMsg(`Loading ${opts.id ? 'entry' : 'slug'} "${slugOrId}" from space "${spaceKey}"…`);
67
+ let rootEntry;
68
+ if (opts.id) {
69
+ rootEntry = await env.getEntry(slugOrId);
70
+ }
71
+ else {
72
+ const found = await findEntryBySlug(env, slugOrId, defaultLocale);
73
+ if (!found) {
74
+ errorMsg(`No entry found with slug "${slugOrId}"`);
75
+ process.exit(1);
76
+ return;
77
+ }
78
+ rootEntry = found;
79
+ }
80
+ rootEntryId = rootEntry.sys.id;
81
+ infoMsg('Fetching entry tree…');
82
+ entries = await fetchEntryTree(env, rootEntryId);
83
+ entries[rootEntryId] = serializeEntry(rootEntry);
84
+ }
85
+ else {
86
+ // Use active session (no network fetch needed)
87
+ const session = loadSession();
88
+ if (!session) {
89
+ errorMsg('No active session. Either run "cms-edit open <slug>" first, or pass a slug/id to backup directly.');
90
+ process.exit(1);
91
+ return;
92
+ }
93
+ entries = session.entries;
94
+ rootEntryId = session.rootEntryId;
95
+ spaceKey = session.spaceKey;
96
+ spaceId = session.spaceId;
97
+ environment = session.environment;
98
+ defaultLocale = session.defaultLocale;
99
+ }
100
+ // Derive root slug from root entry's slug field (null if absent)
101
+ const rootEntryData = entries[rootEntryId];
102
+ const slugField = rootEntryData?.fields['slug'];
103
+ const rootSlug = typeof slugField?.[defaultLocale] === 'string'
104
+ ? slugField[defaultLocale]
105
+ : typeof slugField?.['en-US'] === 'string'
106
+ ? slugField['en-US']
107
+ : null;
108
+ const entryCount = Object.keys(entries).length;
109
+ const label = opts.label ?? '';
110
+ const backup = {
111
+ meta: {
112
+ version: 1,
113
+ createdAt: new Date().toISOString(),
114
+ label,
115
+ spaceKey,
116
+ spaceId,
117
+ environment,
118
+ defaultLocale,
119
+ rootEntryId,
120
+ rootSlug,
121
+ entryCount,
122
+ },
123
+ entries,
124
+ };
125
+ const outputPath = opts.output
126
+ ? path.resolve(opts.output)
127
+ : path.join(BACKUPS_DIR, generateBackupFilename(spaceKey, rootEntryId));
128
+ writeBackup(backup, outputPath);
129
+ const displaySlug = rootSlug ?? rootEntryId;
130
+ if (isJsonMode()) {
131
+ console.log(JSON.stringify({ ok: true, path: outputPath, entryCount, label }));
132
+ }
133
+ else {
134
+ successMsg(`Backed up ${entryCount} entries for "${displaySlug}" → ${outputPath}`);
135
+ }
136
+ }
137
+ catch (err) {
138
+ errorMsg(err instanceof Error ? err.message : String(err));
139
+ process.exit(1);
140
+ }
141
+ });
142
+ }
143
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqH1D"}
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAGvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqH1D"}
@@ -2,6 +2,7 @@
2
2
  import pc from 'picocolors';
3
3
  import { isJsonMode } from '../output/mode.js';
4
4
  import { errorMsg, infoMsg } from '../output/print.js';
5
+ import { walkTextNodes } from '../rtf/replacePlainText.js';
5
6
  import { rtfToMarkdown } from '../rtf/toMarkdown.js';
6
7
  import { isRtfDocument } from '../rtf/utils.js';
7
8
  import { getEntryLabel, getEntryTypeLabel } from '../session/state.js';
@@ -84,8 +85,8 @@ export function registerDiffCommand(program) {
84
85
  const oldVal = original.fields[fieldId]?.[locale] ?? original.fields[fieldId]?.['en-US'];
85
86
  const newVal = current.fields[fieldId]?.[locale] ?? current.fields[fieldId]?.['en-US'];
86
87
  console.log(` ${pc.dim(fieldId)}:`);
87
- console.log(` ${pc.red(`- ${formatValueForDiff(oldVal)}`)}`);
88
- console.log(` ${pc.green(`+ ${formatValueForDiff(newVal)}`)}`);
88
+ console.log(` ${pc.red(`- ${formatValueForDiff(oldVal, newVal)}`)}`);
89
+ console.log(` ${pc.green(`+ ${formatValueForDiff(newVal, oldVal)}`)}`);
89
90
  }
90
91
  }
91
92
  else {
@@ -123,9 +124,12 @@ function findChangedFields(original, current, locale) {
123
124
  }
124
125
  return changed;
125
126
  }
126
- function formatValueForDiff(value) {
127
+ function formatValueForDiff(value, otherValue) {
127
128
  if (value === null || value === undefined)
128
129
  return '(empty)';
130
+ if (isRtfDocument(value) && isRtfDocument(otherValue)) {
131
+ return formatRtfDiff(otherValue, value);
132
+ }
129
133
  if (isRtfDocument(value))
130
134
  return rtfToMarkdown(value).slice(0, 120).replace(/\n/g, '↵');
131
135
  if (typeof value === 'string')
@@ -134,4 +138,40 @@ function formatValueForDiff(value) {
134
138
  return `[${value.length} items]`;
135
139
  return JSON.stringify(value).slice(0, 120);
136
140
  }
141
+ function collectTextValues(doc) {
142
+ const values = [];
143
+ for (const block of doc.content) {
144
+ walkTextNodes(block.content, (_parent, _idx, text) => {
145
+ values.push(text.value);
146
+ });
147
+ }
148
+ return values;
149
+ }
150
+ function excerpt(str, maxLen = 60) {
151
+ const s = str.replace(/\n/g, '↵');
152
+ return s.length > maxLen ? `${s.slice(0, maxLen)}…` : s;
153
+ }
154
+ function formatRtfDiff(before, after) {
155
+ const beforeValues = collectTextValues(before);
156
+ const afterValues = collectTextValues(after);
157
+ const len = Math.max(beforeValues.length, afterValues.length);
158
+ const changed = [];
159
+ for (let i = 0; i < len; i++) {
160
+ const b = beforeValues[i] ?? '';
161
+ const a = afterValues[i] ?? '';
162
+ if (b !== a)
163
+ changed.push({ i, before: b, after: a });
164
+ }
165
+ if (changed.length === 0)
166
+ return '(no text run changes)';
167
+ const lines = [`${String(changed.length)} text run(s) changed`];
168
+ const shown = changed.slice(0, 5);
169
+ for (const c of shown) {
170
+ lines.push(` [${String(c.i + 1)}] "${excerpt(c.before)}" → "${excerpt(c.after)}"`);
171
+ }
172
+ if (changed.length > 5) {
173
+ lines.push(` … and ${String(changed.length - 5)} more`);
174
+ }
175
+ return lines.join('\n');
176
+ }
137
177
  //# sourceMappingURL=diff.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.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 registerRestoreCommand(program: Command): void;
4
+ //# sourceMappingURL=restore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.d.ts","sourceRoot":"","sources":["../../src/commands/restore.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6CzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqH7D"}
@@ -0,0 +1,146 @@
1
+ import { loadConfig, resolveSpaceConfig } from '../config/load.js';
2
+ import { createSafeEnvironment, saveDraft } from '../contentful/client.js';
3
+ import { isJsonMode } from '../output/mode.js';
4
+ import { errorMsg, infoMsg, successMsg, warnMsg } from '../output/print.js';
5
+ import { readBackup, resolveBackupPath } from '../session/backup.js';
6
+ /**
7
+ * Merges all fields from a backup entry onto a freshly-fetched CMA entry.
8
+ * Unlike mergeFields in write.ts (which is locale-specific), this restores all
9
+ * locales stored in the backup so the restore is complete and faithful.
10
+ */
11
+ function mergeAllLocales(fresh, backupEntry) {
12
+ for (const [fieldId, localeMap] of Object.entries(backupEntry.fields)) {
13
+ if (!fresh.fields[fieldId]) {
14
+ fresh.fields[fieldId] = {};
15
+ }
16
+ for (const [locale, value] of Object.entries(localeMap)) {
17
+ fresh.fields[fieldId][locale] = value;
18
+ }
19
+ }
20
+ }
21
+ /**
22
+ * Computes a simple list of field IDs that differ between backup and current.
23
+ * Used for --dry-run output.
24
+ */
25
+ function diffFields(currentFields, backupFields) {
26
+ const changed = [];
27
+ const allFields = new Set([...Object.keys(currentFields), ...Object.keys(backupFields)]);
28
+ for (const fieldId of allFields) {
29
+ const curr = JSON.stringify(currentFields[fieldId]);
30
+ const bkp = JSON.stringify(backupFields[fieldId]);
31
+ if (curr !== bkp) {
32
+ changed.push(fieldId);
33
+ }
34
+ }
35
+ return changed;
36
+ }
37
+ export function registerRestoreCommand(program) {
38
+ program
39
+ .command('restore <backup-file-or-name>')
40
+ .description('Restore a backed-up entry tree to Contentful as drafts. ' +
41
+ 'Pass a filename from "backup list" or a path to a backup JSON file.')
42
+ .option('--dry-run', 'Show what would be restored without writing anything')
43
+ .action(async (backupArg, opts, cmd) => {
44
+ const parentOpts = cmd.parent?.opts() ?? {};
45
+ try {
46
+ const resolvedPath = resolveBackupPath(backupArg);
47
+ const backup = readBackup(resolvedPath);
48
+ const { meta, entries } = backup;
49
+ // Use --space from CLI if given, else fall back to the space recorded in the backup
50
+ const spaceKeyOverride = parentOpts.space ?? meta.spaceKey;
51
+ const config = loadConfig(parentOpts.config);
52
+ const { space } = resolveSpaceConfig(config, spaceKeyOverride);
53
+ const env = await createSafeEnvironment(space);
54
+ const entryIds = Object.keys(entries);
55
+ const displaySlug = meta.rootSlug ?? meta.rootEntryId;
56
+ infoMsg(`Restoring ${entryIds.length} entries for "${displaySlug}" from backup (${meta.createdAt})…`);
57
+ if (opts.dryRun) {
58
+ const wouldRestore = [];
59
+ const skipped = [];
60
+ for (const entryId of entryIds) {
61
+ try {
62
+ const fresh = await env.getEntry(entryId);
63
+ const backupEntry = entries[entryId];
64
+ if (!backupEntry)
65
+ continue;
66
+ const changed = diffFields(fresh.fields, backupEntry.fields);
67
+ wouldRestore.push({ entryId, changedFields: changed });
68
+ }
69
+ catch (err) {
70
+ skipped.push({
71
+ entryId,
72
+ reason: err instanceof Error ? err.message : String(err),
73
+ });
74
+ }
75
+ }
76
+ if (isJsonMode()) {
77
+ console.log(JSON.stringify({ dryRun: true, wouldRestore, skipped }));
78
+ }
79
+ else {
80
+ console.log('\nDry run — no changes will be written:\n');
81
+ for (const { entryId, changedFields } of wouldRestore) {
82
+ if (changedFields.length === 0) {
83
+ console.log(` ${entryId} (no changes)`);
84
+ }
85
+ else {
86
+ console.log(` ${entryId} fields: ${changedFields.join(', ')}`);
87
+ }
88
+ }
89
+ if (skipped.length > 0) {
90
+ console.log('\nSkipped (not found or error):');
91
+ for (const { entryId, reason } of skipped) {
92
+ console.log(` ${entryId} — ${reason}`);
93
+ }
94
+ }
95
+ console.log('');
96
+ }
97
+ return;
98
+ }
99
+ // Live restore
100
+ const saved = [];
101
+ const failed = [];
102
+ for (const entryId of entryIds) {
103
+ const backupEntry = entries[entryId];
104
+ if (!backupEntry)
105
+ continue;
106
+ try {
107
+ const fresh = await env.getEntry(entryId);
108
+ mergeAllLocales(fresh, backupEntry);
109
+ await saveDraft(fresh);
110
+ saved.push(entryId);
111
+ }
112
+ catch (err) {
113
+ const message = err instanceof Error ? err.message : String(err);
114
+ failed.push({
115
+ entryId,
116
+ error: message.includes('Version mismatch')
117
+ ? `Version conflict on ${entryId} — the entry was modified concurrently. Try again.`
118
+ : message,
119
+ });
120
+ }
121
+ }
122
+ if (isJsonMode()) {
123
+ console.log(JSON.stringify({ ok: failed.length === 0, saved, failed }));
124
+ }
125
+ else {
126
+ if (saved.length > 0) {
127
+ successMsg(`Restored ${saved.length} entries as drafts.`);
128
+ }
129
+ if (failed.length > 0) {
130
+ warnMsg(`${failed.length} entries could not be restored:`);
131
+ for (const { entryId, error } of failed) {
132
+ console.error(` ${entryId}: ${error}`);
133
+ }
134
+ }
135
+ }
136
+ if (failed.length > 0 && saved.length === 0) {
137
+ process.exit(1);
138
+ }
139
+ }
140
+ catch (err) {
141
+ errorMsg(err instanceof Error ? err.message : String(err));
142
+ process.exit(1);
143
+ }
144
+ });
145
+ }
146
+ //# sourceMappingURL=restore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.js","sourceRoot":"","sources":["../../src/commands/restore.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rtf.d.ts","sourceRoot":"","sources":["../../src/commands/rtf.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4OzD"}
1
+ {"version":3,"file":"rtf.d.ts","sourceRoot":"","sources":["../../src/commands/rtf.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgTzD"}
@@ -42,14 +42,36 @@ export function registerRtfCommand(program) {
42
42
  });
43
43
  rtfCmd
44
44
  .command('replace <ref> <field>')
45
- .description('Replace plain-text occurrences inside a rich text field (per text node; phrase split by bold cannot match as one string). ' +
46
- 'Use --replace-plain for quidget tokens `{*...*}` so asterisks are not parsed as Markdown.')
47
- .requiredOption('--find <text>', 'Substring to find')
45
+ .description('Replace plain-text occurrences inside a rich text field.\n' +
46
+ 'Use --replace-plain for quidget tokens `{*...*}` so asterisks are not parsed as Markdown.\n' +
47
+ 'Use --find-plain when the search string itself contains asterisks (e.g. to find an existing quidget).\n' +
48
+ 'Use --ignore-marks to match across adjacent bold/plain splits (e.g. **Annual fee: **$95).\n' +
49
+ 'Use --section "Heading" to scope replacements to blocks under a specific heading.\n' +
50
+ 'Use --section-nth N (with --section) when multiple headings share the same text — selects the Nth (1-indexed).\n' +
51
+ 'Existing `{*...*}` quidget spans are always protected — matches inside them are skipped.')
52
+ .option('--find <text>', 'Substring to find (literal; asterisks are NOT parsed as Markdown)')
53
+ .option('--find-plain <text>', 'Alias for --find; use when the search string contains * (e.g. to find quidget tokens)')
48
54
  .option('--replace <markdown>', 'Replacement as inline Markdown (**bold**, [links](url), …)')
49
55
  .option('--replace-plain <text>', 'Replacement as literal text (no Markdown; required for quidget strings containing *)')
50
56
  .option('--mode <mode>', 'all = replace every match; exactlyOne = require a single match (default: all)', 'all')
57
+ .option('--ignore-marks', 'Match across adjacent bold/plain text node splits within the same block')
58
+ .option('--in-table-col <n>', 'Restrict replacements to table column N (1-indexed); non-table content is unaffected', (v) => Number.parseInt(v, 10))
59
+ .option('--section <heading>', 'Scope replacements to blocks under the named heading (exact plain-text match)')
60
+ .option('--section-nth <n>', 'When multiple headings share the same text, use the Nth occurrence (1-indexed, default 1); requires --section', (v) => Number.parseInt(v, 10))
51
61
  .action(async (ref, field, opts) => {
52
62
  try {
63
+ // Resolve --find / --find-plain (exactly one required)
64
+ const hasFind = opts.find !== undefined && opts.find !== '';
65
+ const hasFindPlain = opts.findPlain !== undefined && opts.findPlain !== '';
66
+ if (!hasFind && !hasFindPlain) {
67
+ errorMsg('Provide --find or --find-plain.');
68
+ process.exit(1);
69
+ }
70
+ if (hasFind && hasFindPlain) {
71
+ errorMsg('Provide only one of --find or --find-plain, not both.');
72
+ process.exit(1);
73
+ }
74
+ const findStr = (hasFind ? opts.find : opts.findPlain) ?? '';
53
75
  const hasMd = opts.replace !== undefined && opts.replace !== '';
54
76
  const hasPlain = opts.replacePlain !== undefined && opts.replacePlain !== '';
55
77
  if (hasMd === hasPlain) {
@@ -60,6 +82,20 @@ export function registerRtfCommand(program) {
60
82
  errorMsg('--mode must be "all" or "exactlyOne".');
61
83
  process.exit(1);
62
84
  }
85
+ if (opts.inTableCol !== undefined &&
86
+ (Number.isNaN(opts.inTableCol) || opts.inTableCol < 1)) {
87
+ errorMsg('--in-table-col must be a positive integer.');
88
+ process.exit(1);
89
+ }
90
+ if (opts.sectionNth !== undefined && opts.section === undefined) {
91
+ errorMsg('--section-nth requires --section.');
92
+ process.exit(1);
93
+ }
94
+ if (opts.sectionNth !== undefined &&
95
+ (Number.isNaN(opts.sectionNth) || opts.sectionNth < 1)) {
96
+ errorMsg('--section-nth must be a positive integer.');
97
+ process.exit(1);
98
+ }
63
99
  const modeNorm = opts.mode;
64
100
  const session = requireSession();
65
101
  const entry = resolveRef(session, ref);
@@ -80,17 +116,17 @@ export function registerRtfCommand(program) {
80
116
  errorMsg(`Field "${field}" is not rich text on ${ref}.`);
81
117
  process.exit(1);
82
118
  }
83
- const replaceOptions = hasPlain
84
- ? {
85
- find: opts.find,
86
- mode: modeNorm,
87
- replacePlain: opts.replacePlain ?? '',
88
- }
89
- : {
90
- find: opts.find,
91
- mode: modeNorm,
92
- replaceMarkdown: opts.replace ?? '',
93
- };
119
+ const replaceOptions = {
120
+ find: findStr,
121
+ mode: modeNorm,
122
+ ...(hasPlain
123
+ ? { replacePlain: opts.replacePlain ?? '' }
124
+ : { replaceMarkdown: opts.replace ?? '' }),
125
+ ...(opts.ignoreMarks ? { ignoreMarks: true } : {}),
126
+ ...(opts.inTableCol !== undefined ? { tableCol: opts.inTableCol } : {}),
127
+ ...(opts.section !== undefined ? { section: opts.section } : {}),
128
+ ...(opts.sectionNth !== undefined ? { sectionNth: opts.sectionNth } : {}),
129
+ };
94
130
  const { document: next, matchCount } = replaceRtfPlainText(raw, replaceOptions);
95
131
  if (matchCount === 0) {
96
132
  warnMsg(`No occurrence of --find in "${field}" on ${ref}; session unchanged for this field.`);