Automate PSD text replacement on Mac and Windows with Photoshop, dry-run safety, style-lock checks, rollback, and local PSD index cache. Use when requests in...
Cross-platform PSD text automation for teams using both macOS and Windows.
osascript)Read references/task-schema.json before running.
Minimal required fields:
taskIdinput.edits[] (layerName + newText)input.exactPath or input.fileHintKey optional fields:
workflow.sourceMode: inplace or copy_then_editoutput.exports[]: PNG export (mode=single or mode=layer_sets for sliced/block assets)output.bundle.zipName: zip name for sliced assets bundleoptions.pathBridgeMode: auto / always / off (macOS Unicode path bridge)options.bundleZip: whether to bundle layer_sets PNGs into one zipoptions.matchImagePath: screenshot path for selecting most similar exported sliceCreate or refresh local cache:
node skills/psd-automator/scripts/build-index.js \
--root "/Projects/Design" \
--root "/Users/me/Desktop/assets" \
--index "~/.openclaw/psd-index.json"
Incremental refresh:
node skills/psd-automator/scripts/build-index.js --incremental
Dry-run first (recommended):
node skills/psd-automator/scripts/run-task.js \
--task "skills/psd-automator/examples/task.mac.json" \
--dry-run
Execute:
node skills/psd-automator/scripts/run-task.js \
--task "skills/psd-automator/examples/task.mac.json"
Natural-language dispatch (through OpenClaw chat command, supports .psd and .psb):
/psd design-mac-01 帮我找到20260225工位名牌.psd或20260225工位名牌.psb,把姓名改成琳琳,座右铭改成步履不前,稳步前进,保存成png放置在桌面 --dry-run
When replying in DingTalk and task execution is successful with PNG output, the final response MUST include this marker with an absolute path:
[DINGTALK_IMAGE]{"path":"<absolute_png_path>"}[/DINGTALK_IMAGE]
Rules:
/Users/name/Desktop/xxx.png).pngOutputPath (or first item in pngOutputPaths) is missing, clearly report failure and do not emit a fake marker.mode=layer_sets, pngOutputPaths should contain all exported block images in the output folder.selectedPngPath as the single best-match image for screenshot workflows.bundleZipPath as file attachment: [DINGTALK_FILE]{"path":"<absolute_zip_path>","fileName":"<name>.zip","fileType":"zip"}[/DINGTALK_FILE].Use OpenClaw subagent routing guidance:
Core idea:
run-task.js locally.dryRun.font and size) after text changes..bak backup before write.E_FILE_AMBIGUOUS); never guess silently.availableLayers + suggestedLayers.ZIP package — ready to use