@superdoc/cli 0.35.0-next.8 → 0.35.0-next.9
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/dist/index.js +132 -17
- package/dist/prompts/mcp-prompt.md +1 -1
- package/dist/prompts/system-prompt.md +1 -1
- package/package.json +7 -7
package/dist/index.js
CHANGED
|
@@ -765063,7 +765063,7 @@ var init_host2 = __esm(() => {
|
|
|
765063
765063
|
});
|
|
765064
765064
|
|
|
765065
765065
|
// ../../packages/sdk/langs/node/src/runtime/sdk-version.generated.ts
|
|
765066
|
-
var SDK_VERSION = "2.12.0-next.
|
|
765066
|
+
var SDK_VERSION = "2.12.0-next.9";
|
|
765067
765067
|
|
|
765068
765068
|
// ../../packages/sdk/langs/node/src/runtime/embedded-platform.ts
|
|
765069
765069
|
import { chmodSync, existsSync } from "node:fs";
|
|
@@ -806260,17 +806260,25 @@ function normalizeTableColor2(raw) {
|
|
|
806260
806260
|
return normalized ? `#${normalized}` : null;
|
|
806261
806261
|
}
|
|
806262
806262
|
async function runAcceptTrackedChanges(doc, args2) {
|
|
806263
|
-
return runTrackedChangeDecision(doc, "accept_tracked_changes", "accept", args2.author, args2.changeType);
|
|
806263
|
+
return runTrackedChangeDecision(doc, "accept_tracked_changes", "accept", Array.isArray(args2.id) ? args2.id : typeof args2.id === "string" ? [args2.id] : undefined, args2.author, args2.changeType);
|
|
806264
806264
|
}
|
|
806265
806265
|
async function runRejectTrackedChanges(doc, args2) {
|
|
806266
|
-
return runTrackedChangeDecision(doc, "reject_tracked_changes", "reject", args2.author, args2.changeType);
|
|
806266
|
+
return runTrackedChangeDecision(doc, "reject_tracked_changes", "reject", Array.isArray(args2.id) ? args2.id : typeof args2.id === "string" ? [args2.id] : undefined, args2.author, args2.changeType);
|
|
806267
806267
|
}
|
|
806268
|
-
async function runTrackedChangeDecision(doc, intentLabel, decision, author, changeType) {
|
|
806268
|
+
async function runTrackedChangeDecision(doc, intentLabel, decision, exactIds, author, changeType) {
|
|
806269
806269
|
const pre = await buildDocumentSnapshot(doc);
|
|
806270
806270
|
try {
|
|
806271
|
-
const listFn = maybeMethod2(doc, ["trackChanges", "list"]);
|
|
806272
806271
|
const decideFn = maybeMethod2(doc, ["trackChanges", "decide"]);
|
|
806273
|
-
if (!
|
|
806272
|
+
if (!decideFn) {
|
|
806273
|
+
throw new SuperDocCliError("doc.trackChanges.list / decide are not available on the document handle.", {
|
|
806274
|
+
code: "TOOL_DISPATCH_NOT_FOUND"
|
|
806275
|
+
});
|
|
806276
|
+
}
|
|
806277
|
+
if (exactIds && exactIds.length > 0) {
|
|
806278
|
+
return decideExactTrackedChanges(doc, intentLabel, decision, decideFn, exactIds, pre);
|
|
806279
|
+
}
|
|
806280
|
+
const listFn = maybeMethod2(doc, ["trackChanges", "list"]);
|
|
806281
|
+
if (!listFn) {
|
|
806274
806282
|
throw new SuperDocCliError("doc.trackChanges.list / decide are not available on the document handle.", {
|
|
806275
806283
|
code: "TOOL_DISPATCH_NOT_FOUND"
|
|
806276
806284
|
});
|
|
@@ -806339,6 +806347,53 @@ async function runTrackedChangeDecision(doc, intentLabel, decision, author, chan
|
|
|
806339
806347
|
return failedReceipt2(intentLabel, err2, pre);
|
|
806340
806348
|
}
|
|
806341
806349
|
}
|
|
806350
|
+
function trackedChangeDecideFailure(result) {
|
|
806351
|
+
const rec = asRecord10(result);
|
|
806352
|
+
if (!rec || rec.success !== false)
|
|
806353
|
+
return null;
|
|
806354
|
+
const failure27 = asRecord10(rec.failure);
|
|
806355
|
+
return {
|
|
806356
|
+
code: asString2(failure27?.code, "ACTION_FAILED") || "ACTION_FAILED",
|
|
806357
|
+
message: asString2(failure27?.message, "tracked-change decision failed") || "tracked-change decision failed"
|
|
806358
|
+
};
|
|
806359
|
+
}
|
|
806360
|
+
async function decideExactTrackedChanges(doc, intentLabel, decision, decideFn, exactIds, pre) {
|
|
806361
|
+
const target = exactIds.length === 1 ? { kind: "id", id: exactIds[0] } : { kind: "ids", ids: [...exactIds] };
|
|
806362
|
+
const result = await decideFn({ decision, target });
|
|
806363
|
+
const failure27 = trackedChangeDecideFailure(result);
|
|
806364
|
+
const selectedTargets = exactIds.map((id2) => ({
|
|
806365
|
+
selector: { kind: "entity", entityType: "trackedChange", entityId: id2 },
|
|
806366
|
+
matched: failure27 ? [] : [id2]
|
|
806367
|
+
}));
|
|
806368
|
+
if (failure27) {
|
|
806369
|
+
return {
|
|
806370
|
+
status: "failed",
|
|
806371
|
+
intent: intentLabel,
|
|
806372
|
+
preSnapshot: { revision: pre.revision, counts: pre.counts },
|
|
806373
|
+
selectedTargets,
|
|
806374
|
+
executedOperations: [{ operationId: "doc.trackChanges.decide", result }],
|
|
806375
|
+
verification: [],
|
|
806376
|
+
errors: [
|
|
806377
|
+
{
|
|
806378
|
+
code: failure27.code,
|
|
806379
|
+
message: failure27.message,
|
|
806380
|
+
recovery: { kind: "reinspect" }
|
|
806381
|
+
}
|
|
806382
|
+
]
|
|
806383
|
+
};
|
|
806384
|
+
}
|
|
806385
|
+
const post = await buildDocumentSnapshot(doc);
|
|
806386
|
+
const verification = evaluateChecks(pre, post, [{ kind: "revision-changed" }]);
|
|
806387
|
+
return {
|
|
806388
|
+
status: verification.every((v) => v.passed) ? "ok" : "failed",
|
|
806389
|
+
intent: intentLabel,
|
|
806390
|
+
preSnapshot: { revision: pre.revision, counts: pre.counts },
|
|
806391
|
+
postSnapshot: { revision: post.revision, counts: post.counts },
|
|
806392
|
+
selectedTargets,
|
|
806393
|
+
executedOperations: [{ operationId: "doc.trackChanges.decide", result }],
|
|
806394
|
+
verification
|
|
806395
|
+
};
|
|
806396
|
+
}
|
|
806342
806397
|
async function listAllTrackedChanges(listFn) {
|
|
806343
806398
|
const PAGE = 250;
|
|
806344
806399
|
let offset = 0;
|
|
@@ -809341,14 +809396,12 @@ async function dispatchSuperdocPerformAction(doc, args2) {
|
|
|
809341
809396
|
case "accept_tracked_changes":
|
|
809342
809397
|
return runAcceptTrackedChanges(doc, {
|
|
809343
809398
|
action: action2,
|
|
809344
|
-
|
|
809345
|
-
changeType: parseTrackedChangeKind(args2.changeType)
|
|
809399
|
+
...parseTrackedChangeDecisionArgs(action2, args2)
|
|
809346
809400
|
});
|
|
809347
809401
|
case "reject_tracked_changes":
|
|
809348
809402
|
return runRejectTrackedChanges(doc, {
|
|
809349
809403
|
action: action2,
|
|
809350
|
-
|
|
809351
|
-
changeType: parseTrackedChangeKind(args2.changeType)
|
|
809404
|
+
...parseTrackedChangeDecisionArgs(action2, args2)
|
|
809352
809405
|
});
|
|
809353
809406
|
case "normalize_body_font_size": {
|
|
809354
809407
|
const fontSize = asNumber2(args2.fontSize);
|
|
@@ -809701,6 +809754,62 @@ async function dispatchSuperdocPerformAction(doc, args2) {
|
|
|
809701
809754
|
}
|
|
809702
809755
|
}
|
|
809703
809756
|
}
|
|
809757
|
+
function parseTrackedChangeDecisionArgs(action2, args2) {
|
|
809758
|
+
const hasId = args2.id !== undefined;
|
|
809759
|
+
const hasAuthor = args2.author !== undefined;
|
|
809760
|
+
const hasChangeType = args2.changeType !== undefined;
|
|
809761
|
+
const id2 = hasId ? parseExactTrackedChangeIdList(args2.id) : undefined;
|
|
809762
|
+
const author = asString2(args2.author)?.trim();
|
|
809763
|
+
const changeType = parseTrackedChangeKind(args2.changeType);
|
|
809764
|
+
if (hasId && !id2) {
|
|
809765
|
+
throw new SuperDocCliError(`${action2} requires "id" to be a non-empty string or array of non-empty strings`, {
|
|
809766
|
+
code: "INVALID_ARGUMENT"
|
|
809767
|
+
});
|
|
809768
|
+
}
|
|
809769
|
+
if (hasAuthor && !author) {
|
|
809770
|
+
throw new SuperDocCliError(`${action2} requires "author" to be a non-empty string when provided`, {
|
|
809771
|
+
code: "INVALID_ARGUMENT"
|
|
809772
|
+
});
|
|
809773
|
+
}
|
|
809774
|
+
if (hasChangeType && !changeType) {
|
|
809775
|
+
throw new SuperDocCliError(`${action2} requires "changeType" to be insert, delete, replacement, or format when provided`, {
|
|
809776
|
+
code: "INVALID_ARGUMENT"
|
|
809777
|
+
});
|
|
809778
|
+
}
|
|
809779
|
+
if (id2 && (hasAuthor || hasChangeType)) {
|
|
809780
|
+
throw new SuperDocCliError(`${action2} cannot combine "id" with "author" or "changeType"`, {
|
|
809781
|
+
code: "INVALID_ARGUMENT"
|
|
809782
|
+
});
|
|
809783
|
+
}
|
|
809784
|
+
if (id2)
|
|
809785
|
+
return { id: id2 };
|
|
809786
|
+
return {
|
|
809787
|
+
...author ? { author } : {},
|
|
809788
|
+
...changeType ? { changeType } : {}
|
|
809789
|
+
};
|
|
809790
|
+
}
|
|
809791
|
+
function parseExactTrackedChangeIdList(value2) {
|
|
809792
|
+
if (typeof value2 === "string") {
|
|
809793
|
+
const trimmed = value2.trim();
|
|
809794
|
+
return trimmed.length > 0 ? [trimmed] : undefined;
|
|
809795
|
+
}
|
|
809796
|
+
if (!Array.isArray(value2))
|
|
809797
|
+
return;
|
|
809798
|
+
const ids = [];
|
|
809799
|
+
const seen = new Set;
|
|
809800
|
+
for (const entry of value2) {
|
|
809801
|
+
if (typeof entry !== "string")
|
|
809802
|
+
return;
|
|
809803
|
+
const trimmed = entry.trim();
|
|
809804
|
+
if (trimmed.length === 0)
|
|
809805
|
+
return;
|
|
809806
|
+
if (seen.has(trimmed))
|
|
809807
|
+
continue;
|
|
809808
|
+
seen.add(trimmed);
|
|
809809
|
+
ids.push(trimmed);
|
|
809810
|
+
}
|
|
809811
|
+
return ids.length > 0 ? ids : undefined;
|
|
809812
|
+
}
|
|
809704
809813
|
async function superdocPerformAction(doc, args2) {
|
|
809705
809814
|
try {
|
|
809706
809815
|
return await dispatchSuperdocPerformAction(doc, args2);
|
|
@@ -809981,8 +810090,8 @@ var init_actions = __esm(() => {
|
|
|
809981
810090
|
add_comments: 'commentText, selector (one block) OR selectors[] to comment MANY blocks in ONE call (same text) — use selectors[] for "comment every heading/section/clause"; NEVER emit multiple add_comments calls, batch the targets into selectors[]',
|
|
809982
810091
|
resolve_comments: 'anchorText? (resolve only comments anchored on text containing this; omit to resolve ALL open comments), reopen? (true = reopen resolved comments instead) — THE way to resolve (or reopen) comments. Use for "resolve the comment(s)" / "mark comments resolved".',
|
|
809983
810092
|
reply_to_comment: `commentText (the reply body), anchorText (text the target comment is anchored on / mentions) OR commentId — THE way to REPLY to an existing comment thread. Use for "reply to the comment about X" / "respond to Reviewer's comment". Adds a threaded reply, not a new top-level comment.`,
|
|
809984
|
-
accept_tracked_changes: 'author
|
|
809985
|
-
reject_tracked_changes: "author
|
|
810093
|
+
accept_tracked_changes: 'id? (string or string[]) OR author?/changeType?: insert|delete|replacement|format — a string[] decides that exact set atomically; e.g. changeType:"format" accepts ONLY formatting revisions (bold/italic/color), leaving text edits pending',
|
|
810094
|
+
reject_tracked_changes: "id? (string or string[]) OR author?/changeType?: insert|delete|replacement|format — a string[] decides that exact set atomically",
|
|
809986
810095
|
normalize_body_font_size: "fontSize, changeMode?",
|
|
809987
810096
|
set_font_family: 'fontFamily (e.g. "Arial"), selector? (one block) OR targetText/targetTexts[] (occurrences) — omit both to set the WHOLE body font, caseSensitive?, changeMode? — THE way to change the typeface. Use for "change the font to X" / "set the heading font to Y".',
|
|
809988
810097
|
format_text: "bold?/italic?/underline?/strike? booleans, highlight? color name, color?, fontSize?, applied to EVERY occurrence of targetText (or targetTexts[] for several phrases in one call, or a selector'd block), caseSensitive?, changeMode? — THE way to bold/italicize/underline/highlight text, tracked-safe",
|
|
@@ -810072,8 +810181,8 @@ var init_actions = __esm(() => {
|
|
|
810072
810181
|
resolve_comments: ["anchorText", "reopen"],
|
|
810073
810182
|
reply_to_comment: ["commentText", "anchorText", "commentId"],
|
|
810074
810183
|
rewrite_block: ["text", "selector", "changeMode", "evidence"],
|
|
810075
|
-
accept_tracked_changes: ["author", "changeType"],
|
|
810076
|
-
reject_tracked_changes: ["author", "changeType"],
|
|
810184
|
+
accept_tracked_changes: ["id", "author", "changeType"],
|
|
810185
|
+
reject_tracked_changes: ["id", "author", "changeType"],
|
|
810077
810186
|
normalize_body_font_size: ["fontSize", "changeMode"],
|
|
810078
810187
|
set_font_family: ["fontFamily", "selector", "targetText", "targetTexts", "caseSensitive", "changeMode"],
|
|
810079
810188
|
apply_letter_spacing: ["selector", "letterSpacing", "changeMode"],
|
|
@@ -810170,7 +810279,7 @@ function buildPerformActionDefinition(includedActions) {
|
|
|
810170
810279
|
description: buildActionDescription(included.size === ACTION_NAMES_LIST.length ? undefined : included),
|
|
810171
810280
|
inputSchema: {
|
|
810172
810281
|
type: "object",
|
|
810173
|
-
additionalProperties:
|
|
810282
|
+
additionalProperties: false,
|
|
810174
810283
|
required: ["action"],
|
|
810175
810284
|
properties: {
|
|
810176
810285
|
action: {
|
|
@@ -810369,6 +810478,12 @@ var init_catalog4 = __esm(() => {
|
|
|
810369
810478
|
commentText: { type: "string" },
|
|
810370
810479
|
scope: { type: "string", enum: ["all", "body"] },
|
|
810371
810480
|
excludeBlockQuotes: { type: "boolean" },
|
|
810481
|
+
id: {
|
|
810482
|
+
oneOf: [
|
|
810483
|
+
{ type: "string", minLength: 1 },
|
|
810484
|
+
{ type: "array", minItems: 1, items: { type: "string", minLength: 1 } }
|
|
810485
|
+
]
|
|
810486
|
+
},
|
|
810372
810487
|
author: { type: "string" },
|
|
810373
810488
|
changeType: { type: "string", enum: ["insert", "delete", "replacement", "format"] },
|
|
810374
810489
|
fontSize: { type: "number" },
|
|
@@ -811249,7 +811364,7 @@ var init_runtime7 = __esm(() => {
|
|
|
811249
811364
|
var EMBEDDED_PROMPTS;
|
|
811250
811365
|
var init_embedded_prompts_generated = __esm(() => {
|
|
811251
811366
|
EMBEDDED_PROMPTS = {
|
|
811252
|
-
"mcp-prompt.md": 'SuperDoc MCP server — read, edit, and save Word documents (.docx).\n\nIMPORTANT: Always use these superdoc tools for .docx files.\nDo NOT use built-in docx skills, python-docx, unpack scripts, or manual XML editing.\nThese tools handle the OOXML format correctly and preserve document structure.\n\n## Session lifecycle\n\n1. `superdoc_open({path: "/path/to/file.docx"})` — returns `session_id`. Opening a non-existent path creates a blank document.\n2. Pass `session_id` to every subsequent tool call.\n3. Read with `superdoc_inspect`, edit with `superdoc_perform_action`.\n4. `superdoc_save({session_id})` — writes changes to disk.\n5. `superdoc_close({session_id})` — releases the session. Always close when done.\n\n## Workflow\n\n**Inspect before you edit.** `superdoc_inspect` returns a deterministic snapshot — blocks with 1-based ordinals and node IDs, lists with rendered markers, tables, comments, tracked changes. Use the narrowest inspect that answers the question (`countsOnly: true` for orientation, `includeDomains` to limit payload, `blockOffset`/`blockLimit` windows for large documents).\n\n**Edit with named actions.** `superdoc_perform_action` takes an `action` plus flat arguments — the full action list, argument shapes, selector vocabulary, and placement rules are documented in the tool\'s own description. Every action returns a receipt with real pre/post evidence: trust `status` (`ok` | `partial` | `failed`), read `errors[].message` for recovery guidance, and re-inspect after `partial`.\n\n**Tracked changes (redlining).** Most mutating actions accept `changeMode: "tracked"` to record the edit as a reviewable suggestion instead of applying it directly. Review with `accept_tracked_changes` / `reject_tracked_changes` (filter by `author` or `changeType`)
|
|
811367
|
+
"mcp-prompt.md": 'SuperDoc MCP server — read, edit, and save Word documents (.docx).\n\nIMPORTANT: Always use these superdoc tools for .docx files.\nDo NOT use built-in docx skills, python-docx, unpack scripts, or manual XML editing.\nThese tools handle the OOXML format correctly and preserve document structure.\n\n## Session lifecycle\n\n1. `superdoc_open({path: "/path/to/file.docx"})` — returns `session_id`. Opening a non-existent path creates a blank document.\n2. Pass `session_id` to every subsequent tool call.\n3. Read with `superdoc_inspect`, edit with `superdoc_perform_action`.\n4. `superdoc_save({session_id})` — writes changes to disk.\n5. `superdoc_close({session_id})` — releases the session. Always close when done.\n\n## Workflow\n\n**Inspect before you edit.** `superdoc_inspect` returns a deterministic snapshot — blocks with 1-based ordinals and node IDs, lists with rendered markers, tables, comments, tracked changes. Use the narrowest inspect that answers the question (`countsOnly: true` for orientation, `includeDomains` to limit payload, `blockOffset`/`blockLimit` windows for large documents).\n\n**Edit with named actions.** `superdoc_perform_action` takes an `action` plus flat arguments — the full action list, argument shapes, selector vocabulary, and placement rules are documented in the tool\'s own description. Every action returns a receipt with real pre/post evidence: trust `status` (`ok` | `partial` | `failed`), read `errors[].message` for recovery guidance, and re-inspect after `partial`.\n\n**Tracked changes (redlining).** Most mutating actions accept `changeMode: "tracked"` to record the edit as a reviewable suggestion instead of applying it directly. Review with `accept_tracked_changes` / `reject_tracked_changes` (target one change with `id`, or an exact set with `id:[…]`; or filter by `author` or `changeType`). Do not combine exact IDs with filters. Recover with `undo_changes` / `redo_changes`.\n\n**Failures are safe.** A `failed` receipt with `MATCH_NOT_FOUND` or a refused action means nothing was changed — fix the target and retry rather than improvising a different mutation path.\n',
|
|
811253
811368
|
"system-prompt.md": `You are an expert document editor working inside a live Word document. You know how documents actually work — headings structure content, numbering schemes carry legal meaning, tables hold data, tracked changes record intent, comments carry review. You edit the way a skilled human editor would: you understand what people MEAN, not just what they SAY, and you leave the document the way a professional would leave it.
|
|
811254
811369
|
|
|
811255
811370
|
============================================================
|
|
@@ -811309,7 +811424,7 @@ ACTIONS (superdoc_perform_action with flat args)
|
|
|
811309
811424
|
- add_comments: commentText, and either selector (one block) or selectors:[…] to comment MANY blocks in ONE call with the same text. To comment every heading/section/clause, resolve their targets and pass them all in selectors:[…] — NEVER emit a separate add_comments call per block.
|
|
811310
811425
|
- reply_to_comment: commentText (the reply body), and either anchorText (text the target comment is anchored on / mentions) or commentId. THE way to REPLY to an existing comment thread ("reply to the comment about X") — a threaded reply, not a new top-level comment.
|
|
811311
811426
|
- resolve_comments: anchorText? (resolve only comments anchored on / mentioning that text; omit to resolve ALL open comments), reopen:true to reopen resolved comments instead. THE way to "resolve the comment(s)" / "mark comments resolved".
|
|
811312
|
-
- accept_tracked_changes / reject_tracked_changes: optional author:"Full Name"
|
|
811427
|
+
- accept_tracked_changes / reject_tracked_changes: id:"change-id" or id:["id1","id2"] for one atomic set, OR optional author:"Full Name" / changeType:"insert"|"delete"|"replacement"|"format" to filter. Do not combine id with author/changeType. "Accept only the formatting changes" = changeType:"format" (formatting revisions — bold/italic/underline/color — are a DISTINCT tracked-change type from text edits; text changes stay pending).
|
|
811313
811428
|
- format_text: bold/italic/underline/strike:true, highlight:"yellow", color (named or hex), fontSize — applied to EVERY occurrence of targetText (or targetTexts:["…","…"] for several phrases in one call; or selector for a whole block). caseSensitive:true for exact case. changeMode:"tracked" produces format-type tracked changes. THE way to bold/italicize/underline/highlight/color text — find the literal texts first (inspect), then ONE call. NOTE: one call applies ONE set of properties to ALL its targets — to color two phrases DIFFERENT colors, make a SEPARATE call per color (do NOT batch different-colored phrases into one targetTexts call).
|
|
811314
811429
|
- apply_style: selector (the block to restyle), then ONE of styleId ("Heading2"), headingLevel (1-6), or likeText (text inside the block whose style AND effective look to copy). "Make Summary match the Parties heading" = apply_style {selector:…, likeText:"Parties"}. THE way to restyle an existing block — never delete-and-recreate it.
|
|
811315
811430
|
- normalize_body_font_size: fontSize:N.
|
|
@@ -18,6 +18,6 @@ These tools handle the OOXML format correctly and preserve document structure.
|
|
|
18
18
|
|
|
19
19
|
**Edit with named actions.** `superdoc_perform_action` takes an `action` plus flat arguments — the full action list, argument shapes, selector vocabulary, and placement rules are documented in the tool's own description. Every action returns a receipt with real pre/post evidence: trust `status` (`ok` | `partial` | `failed`), read `errors[].message` for recovery guidance, and re-inspect after `partial`.
|
|
20
20
|
|
|
21
|
-
**Tracked changes (redlining).** Most mutating actions accept `changeMode: "tracked"` to record the edit as a reviewable suggestion instead of applying it directly. Review with `accept_tracked_changes` / `reject_tracked_changes` (filter by `author` or `changeType`)
|
|
21
|
+
**Tracked changes (redlining).** Most mutating actions accept `changeMode: "tracked"` to record the edit as a reviewable suggestion instead of applying it directly. Review with `accept_tracked_changes` / `reject_tracked_changes` (target one change with `id`, or an exact set with `id:[…]`; or filter by `author` or `changeType`). Do not combine exact IDs with filters. Recover with `undo_changes` / `redo_changes`.
|
|
22
22
|
|
|
23
23
|
**Failures are safe.** A `failed` receipt with `MATCH_NOT_FOUND` or a refused action means nothing was changed — fix the target and retry rather than improvising a different mutation path.
|
|
@@ -57,7 +57,7 @@ ACTIONS (superdoc_perform_action with flat args)
|
|
|
57
57
|
- add_comments: commentText, and either selector (one block) or selectors:[…] to comment MANY blocks in ONE call with the same text. To comment every heading/section/clause, resolve their targets and pass them all in selectors:[…] — NEVER emit a separate add_comments call per block.
|
|
58
58
|
- reply_to_comment: commentText (the reply body), and either anchorText (text the target comment is anchored on / mentions) or commentId. THE way to REPLY to an existing comment thread ("reply to the comment about X") — a threaded reply, not a new top-level comment.
|
|
59
59
|
- resolve_comments: anchorText? (resolve only comments anchored on / mentioning that text; omit to resolve ALL open comments), reopen:true to reopen resolved comments instead. THE way to "resolve the comment(s)" / "mark comments resolved".
|
|
60
|
-
- accept_tracked_changes / reject_tracked_changes: optional author:"Full Name"
|
|
60
|
+
- accept_tracked_changes / reject_tracked_changes: id:"change-id" or id:["id1","id2"] for one atomic set, OR optional author:"Full Name" / changeType:"insert"|"delete"|"replacement"|"format" to filter. Do not combine id with author/changeType. "Accept only the formatting changes" = changeType:"format" (formatting revisions — bold/italic/underline/color — are a DISTINCT tracked-change type from text edits; text changes stay pending).
|
|
61
61
|
- format_text: bold/italic/underline/strike:true, highlight:"yellow", color (named or hex), fontSize — applied to EVERY occurrence of targetText (or targetTexts:["…","…"] for several phrases in one call; or selector for a whole block). caseSensitive:true for exact case. changeMode:"tracked" produces format-type tracked changes. THE way to bold/italicize/underline/highlight/color text — find the literal texts first (inspect), then ONE call. NOTE: one call applies ONE set of properties to ALL its targets — to color two phrases DIFFERENT colors, make a SEPARATE call per color (do NOT batch different-colored phrases into one targetTexts call).
|
|
62
62
|
- apply_style: selector (the block to restyle), then ONE of styleId ("Heading2"), headingLevel (1-6), or likeText (text inside the block whose style AND effective look to copy). "Make Summary match the Parties heading" = apply_style {selector:…, likeText:"Parties"}. THE way to restyle an existing block — never delete-and-recreate it.
|
|
63
63
|
- normalize_body_font_size: fontSize:N.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@superdoc/cli",
|
|
3
|
-
"version": "0.35.0-next.
|
|
3
|
+
"version": "0.35.0-next.9",
|
|
4
4
|
"description": "Command-line interface for SuperDoc: inspect, convert, and edit .docx files from a terminal or a script.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "AGPL-3.0",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@hocuspocus/server": "^2.13.6",
|
|
38
|
-
"@superdoc/sdk": "2.12.0-next.
|
|
38
|
+
"@superdoc/sdk": "2.12.0-next.9",
|
|
39
39
|
"@superdoc/document-api": "0.1.0-alpha.0",
|
|
40
40
|
"@superdoc/docx-engine": "0.14.0-next.6",
|
|
41
41
|
"@types/bun": "^1.3.8",
|
|
@@ -51,11 +51,11 @@
|
|
|
51
51
|
"access": "public"
|
|
52
52
|
},
|
|
53
53
|
"optionalDependencies": {
|
|
54
|
-
"@superdoc/cli-darwin-arm64": "0.35.0-next.
|
|
55
|
-
"@superdoc/cli-darwin-x64": "0.35.0-next.
|
|
56
|
-
"@superdoc/cli-linux-x64": "0.35.0-next.
|
|
57
|
-
"@superdoc/cli-linux-arm64": "0.35.0-next.
|
|
58
|
-
"@superdoc/cli-windows-x64": "0.35.0-next.
|
|
54
|
+
"@superdoc/cli-darwin-arm64": "0.35.0-next.9",
|
|
55
|
+
"@superdoc/cli-darwin-x64": "0.35.0-next.9",
|
|
56
|
+
"@superdoc/cli-linux-x64": "0.35.0-next.9",
|
|
57
|
+
"@superdoc/cli-linux-arm64": "0.35.0-next.9",
|
|
58
|
+
"@superdoc/cli-windows-x64": "0.35.0-next.9"
|
|
59
59
|
},
|
|
60
60
|
"scripts": {
|
|
61
61
|
"predev": "node scripts/ensure-superdoc-build.js",
|