@ninkch/dsh-artcraft 0.3.1 → 0.3.2

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 ADDED
@@ -0,0 +1,158 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented in this file.
4
+ Format: `## [X.Y.Z] -- date`. Entries are rebuilt from git tags and commit
5
+ history; where the record is incomplete the entry says so instead of guessing.
6
+
7
+ Released versions are exactly the git tags listed below. Versions without a
8
+ tag (planned but never published) are **not** given entries.
9
+
10
+ ## [0.3.1] -- 2026-10-17
11
+
12
+ ### Fixed
13
+ - `fix(tools)`: pass the computed fallback `output` through to
14
+ `ctx.tools.register()` -- fixes issue #1, where every agent tool failed to
15
+ register on DSH 44.0.0 ("must declare output { schema, render,
16
+ presentationMeta? }") while the HTTP API kept working.
17
+
18
+ ## [0.3.0] -- 2026-10-16
19
+
20
+ First minor bump, explicitly approved by the maintainer (recorded in
21
+ RELEASING.md); includes everything accumulated since 0.2.10.
22
+
23
+ ### Added
24
+ - `feat`: FigCraft as the 13th family member (bins whitelist, catalog card,
25
+ capability stats) + the first bundled craft skill pack (7 skills).
26
+ - `feat(skills+chains)`: batch-pipeline and multicam skills, 3 more
27
+ task-to-command chains, English skill index, frontend contract docs.
28
+ - `feat(qc-v2+refs)`: app-side QC checks and five deeper craft references.
29
+ - `feat(live)`: control-channel liveness probe (`artcraft_live` +
30
+ `GET /artcraft/api/live`).
31
+ - `feat(ui+recipes)`: plugins-page card shows the bundled skill pack; 3 more
32
+ orchestration chains.
33
+ - `feat(api)`: capability stats and bundled skill pack over HTTP.
34
+ - `feat(qc+skills)`: deterministic delivery QC tool (`artcraft_qc`) + 2 more
35
+ craft skills + deep reference files.
36
+ - `chore(release)`: 0.3.0 release commit.
37
+
38
+ ## [0.2.10] -- 2026-10-12
39
+
40
+ ### Fixed
41
+ - `fix(update UX)`: persistent "restart Harness to finish update" state --
42
+ `/update/check` reports disk-vs-running version mismatch
43
+ (`pendingRestart`/`pendingVersion`/`diskVersion`); the client keeps the note
44
+ across re-mounts and suppresses the misleading "update available" state
45
+ while a restart is pending.
46
+ - `docs(RELEASING)`: GitHub-facing text must be English/ASCII-only --
47
+ `Invoke-RestMethod` string bodies mangled non-ASCII into `?` (Latin-1
48
+ fallback); always send UTF-8 bytes + charset and read the body back.
49
+
50
+ ## [0.2.9] -- 2026-10-12
51
+
52
+ ### Added
53
+ - `feat`: family expanded to 12 apps -- WordCraft, DeckCraft, GridCraft,
54
+ CADCraft, SoundCraft (bins whitelist, CLI defaults, display labels, client
55
+ card, auto-discovery, example config, docs).
56
+ - `feat`: capability catalog for all 12 family apps -- `apps/catalog.json`
57
+ (subcommands / control ports / MCP / repos from official docs and local
58
+ `--help`), `artcraft_apps` tool + `GET /artcraft/api/apps`, control channel
59
+ extended to vectorcraft (7979) and lightcraft (7980) + port passthrough.
60
+
61
+ ## [0.2.8] -- 2026-10-12
62
+
63
+ Note: 0.2.7 was planned during this cycle but never published (no tag) -- the
64
+ minor bump was reverted to patch-level increments; the number was reused for
65
+ this release.
66
+
67
+ ### Added
68
+ - `feat!`: bridge semantics -- no `dataRoot`; callers decide paths (chat =
69
+ conversation workspace, canvas = project dir); the plugins-page card shows
70
+ the config directory instead. (Breaking API change, shipped as a patch per
71
+ the versioning rule.)
72
+ - `feat(update)`: registry fallback chain (npmjs -> npmmirror) for update
73
+ checks and tarball downloads -- unblocks machines without a proxy.
74
+ - `feat`: first-run auto-discovery of family CLI installs (bootstrap config)
75
+ + `POST /artcraft/api/discover` + `artcraft_discover` tool.
76
+ - `feat`: the refresh button doubles as family-install discovery (creates /
77
+ repairs the config); `/discover` auto-corrects stale paths.
78
+ - `feat`: built-in expert recipes -- 8 professional workflows with
79
+ principles/steps/checks + the `artcraft_recipes` tool.
80
+
81
+ ### Changed
82
+ - `ci`: publish via GitHub Release (OIDC) -- the maintainer pushes, no direct
83
+ pushes from automation.
84
+ - `docs(RELEASING)`: forbid "Frankenstein patches" -- installed copies must
85
+ come from npm only.
86
+
87
+ ## [0.2.6] -- 2026-10-11
88
+
89
+ ### Added
90
+ - `feat(update)`: deterministic tarball updater v2 (sha512 from
91
+ `dist.integrity` + atomic swap, bypasses the pnpm age-gate); config now
92
+ persists at `~/.dsh/artcraft.config.json`.
93
+
94
+ ### Fixed
95
+ - `ci(guard)`: tolerate push-order races -- the main-ancestor check retries 3x
96
+ before failing.
97
+
98
+ ## [0.2.5] -- 2026-10-10
99
+
100
+ ### Added
101
+ - `feat(update)`: npm-mode self-update pins the official registry; docs cover
102
+ the install-mode switch to npm.
103
+
104
+ ### Fixed
105
+ - `fix(tools)`: `output` declaration `{ schema, render }` -- matches the host
106
+ requirement; verified through the poster/video integration session.
107
+
108
+ ### Changed
109
+ - `ci`: new guard -- `package.json` version must match the release tag.
110
+ - `docs(RELEASING)`: record version/tag mismatch and update-semantics lessons.
111
+ - `fix(release)`: bump `package.json` 0.2.4 -> 0.2.5 (the version guard
112
+ correctly intercepted the missing bump).
113
+
114
+ ## [0.2.4] -- 2026-10-10
115
+
116
+ ### Added
117
+ - `feat(ui)`: status card on the plugins page via the `plugins.bundle.config`
118
+ keyed slot; 7-family bins; EffectCraft path resolution.
119
+ - `chore`: release governance -- dev/main branching, main-tag guard,
120
+ RELEASING.md rules.
121
+
122
+ ### Fixed
123
+ - `fix(release)`: bump `package.json` 0.2.3 -> 0.2.4 (tag/version mismatch
124
+ had broken publishing).
125
+
126
+ ## [0.2.3] -- 2026-10-10
127
+
128
+ ### Fixed
129
+ - `fix`: strip the UTF-8 BOM from `package.json` (the DSH loader's
130
+ `JSON.parse` rejects BOMs; the package loaded as broken).
131
+
132
+ ## [0.2.2] -- 2026-10-10
133
+
134
+ ### Fixed
135
+ - `fix(tools)`: declare the `output` schema (the registry requires
136
+ `{ schema, render?, presentationMeta? }`).
137
+
138
+ ## [0.2.1] -- 2026-10-10
139
+
140
+ ### Changed
141
+ - `feat(ui)`: move status/update into the Plugins page detail card; the
142
+ sidebar panel is dropped (the bridge does not belong in the main panel).
143
+
144
+ ## [0.2.0] -- 2026-10-10
145
+
146
+ ### Added
147
+ - `feat`: self-update (check/apply) + a sidebar panel with toolchain status.
148
+ - `ci`: npm Trusted Publishing workflow (OIDC, release-triggered).
149
+
150
+ ## [0.1.1] -- 2026-10-10
151
+
152
+ ### Added
153
+ - `feat`: initial plugin -- PhotoCraft / FilmCraft / EffectCraft automation
154
+ via headless CLIs and JSON control channels (as `@local/artcraft 0.1.1`).
155
+ - `docs`: bilingual product README (English-first + zh-CN), npm metadata.
156
+ - `docs(license)`: Apache-2.0 for the plugin; ArtCraft apps are fair-source
157
+ (verbatim notice in NOTICE.md).
158
+ - `chore!`: rename to `@ninkch/dsh-artcraft` for npm + profile registration.
package/README.md CHANGED
@@ -27,7 +27,7 @@ for agents from day one.
27
27
  This plugin brings that surface into DeepSeek Harness, so an AI agent can *operate* the apps —
28
28
  not just talk about them:
29
29
 
30
- - **In chat** — nine agent tools let any Harness session check the toolchain, run CLI commands,
30
+ - **In chat** — ten agent tools let any Harness session check the toolchain, run CLI commands,
31
31
  send control-channel commands to a running app, do bridged file operations, run delivery QC,
32
32
  and consult a per-app capability catalog.
33
33
  - **A bundled craft skill pack** — eleven skills (`artcraft-ops`, `artcraft-shot-language`,
@@ -43,9 +43,6 @@ not just talk about them:
43
43
  - **Paths belong to the caller** — this plugin is a bridge and owns no data directory. Files read
44
44
  or written go wherever the caller points: chat invocations default to the current conversation
45
45
  workspace (or any path named in the prompt); the canvas writes under its own project folder.
46
- - **Paths belong to the caller** — this plugin is a bridge and owns no data directory. Files read
47
- or written go wherever the caller points: chat invocations default to the current conversation
48
- workspace (or any path named in the prompt); the canvas writes under its own project folder.
49
46
 
50
47
  A typical AI short-drama loop looks like this: generate storyboard frames with a model →
51
48
  batch color-grade and sharpen them in PhotoCraft → render an animated title in EffectCraft →
@@ -81,7 +78,7 @@ Everything runs locally. No cloud round-trips, no accounts, no telemetry.
81
78
  - **ArtCraft apps** — grab what you need from [getartcraft.com](https://getartcraft.com/apps)
82
79
  or the [storytold GitHub releases](https://github.com/storytold). The portable/installer builds
83
80
  ship the CLI binaries on Windows and Linux (`photocraft-cli.exe` …); macOS ships them as a
84
- separate notarized zip. Versions tested: PhotoCraft 0.6, FilmCraft 0.5, EffectCraft (early).
81
+ separate notarized zip. Versions tested: PhotoCraft 0.9, FilmCraft 0.8, EffectCraft (early).
85
82
  - Nothing else. No Python, no FFmpeg — the ArtCraft apps bring their own codecs.
86
83
 
87
84
  ## Setup
@@ -127,8 +124,8 @@ re-read on every request — no restart needed for path changes:
127
124
  "bins": {
128
125
  // three accepted forms: a directory (the <name>-cli binary is appended),
129
126
  // a full path to the executable, or a bare name looked up on PATH
130
- "photocraft": "C:/craft/photocraft-0.6.0-windows-x64-portable",
131
- "filmcraft": "C:/craft/filmcraft-0.5.0-windows-x64-portable",
127
+ "photocraft": "C:/craft/<PhotoCraft portable folder>",
128
+ "filmcraft": "C:/craft/<FilmCraft portable folder>",
132
129
  "effectcraft": "C:/Program Files/EffectCraft"
133
130
  },
134
131
  "control": { "filmcraft": 9876, "effectcraft": 9877 }
@@ -140,7 +137,7 @@ re-read on every request — no restart needed for path changes:
140
137
 
141
138
  ## Driving it from chat
142
139
 
143
- The plugin registers four tools. The agent composes them, so plain language works:
140
+ The plugin registers ten tools. The agent composes them, so plain language works:
144
141
 
145
142
  > *"Color-grade every PNG in `demo/media` with a soft S-curve and smart sharpening at 80, put the
146
143
  > results in `demo/out/graded`."*
@@ -154,7 +151,7 @@ artcraft_cli { bin:"photocraft", args:["batch","--actions","demo/craft/grade.js
154
151
 
155
152
  | Tool | What it does |
156
153
  |---|---|
157
- | `artcraft_status` | Toolchain health check: which of the 12 CLIs resolved, config location, control ports, running jobs |
154
+ | `artcraft_status` | Toolchain health check: which of the 13 CLIs resolved, config location, control ports, running jobs |
158
155
  | `artcraft_cli` | Run any CLI subcommand synchronously (`photocraft-cli run/batch`, `wordcraft-cli convert`, …) |
159
156
  | `artcraft_control` | One command over the JSON control channel of a *running* app (filmcraft 9876 / effectcraft 9877 / vectorcraft 7979 / lightcraft 7980, or pass `port`) |
160
157
  | `artcraft_fs` | Bridged file ops — list / stat / read / write / mkdir at caller-decided absolute paths |
@@ -198,7 +195,7 @@ Full route list:
198
195
  | `POST /artcraft/api/control` | Synchronous control-channel call (`app` or `port`) |
199
196
  | `GET /artcraft/api/apps[?id=…]` | Family capability catalog (13 apps + command-family stats) |
200
197
  | `GET /artcraft/api/qc?path=…[&platform=…][&kind=…]` | Delivery QC: platform-spec checks with fix commands |
201
- | `GET /artcraft/api/skills` | Bundled skill pack listing (9 skills + their reference files) |
198
+ | `GET /artcraft/api/skills` | Bundled skill pack listing (11 skills + their reference files) |
202
199
  | `GET /artcraft/api/live[?ports=app:port,…]` | Control-channel liveness (which apps are running) |
203
200
  | `POST /artcraft/api/discover` | Family install discovery + config self-repair |
204
201
  | `GET /artcraft/api/update/check` · `POST /artcraft/api/update/apply` | The plugin's own update |
@@ -332,22 +329,7 @@ explicit approval.
332
329
 
333
330
  ## License
334
331
 
335
- **This plugin (`@ninkch/dsh-artcraft`): Apache-2.0** — see [LICENSE](LICENSE). It ships none of the
336
- ArtCraft apps' code — it only drives their public automation surfaces (headless CLI + JSON
337
- control channel).
338
-
339
- **The ArtCraft apps themselves** are *not* OSI open source: they are distributed under the
340
- **ArtCraft License (WIP)**, a "fair source" license ([verbatim text](NOTICE.md)). The short
341
- version for anyone building on them:
342
-
343
- - ✅ free to use; back up, copy, modify and compile for private purposes
344
- - ✅ **every piece of media you create with the apps is yours** — your rendered episodes are
345
- commercial assets, full stop
346
- - ❌ no selling the apps as your own software, no competing products built from their code
347
- - ❌ no stripping community/donation links from a fork; no using the ArtCraft name, logo or
348
- mascots to promote a business without permission
349
- - 🤝 the team's public promise: if the business ever ends, the software transitions to an
350
- OSI-approved open-source license
351
-
352
- Practical reading for an AI short-drama studio: run the apps locally, leave their community
353
- links alone, and sell your films — not the apps.
332
+ This plugin (`@ninkch/dsh-artcraft`): **Apache-2.0** — see [LICENSE](LICENSE). It ships none of the
333
+ ArtCraft apps' code; it only drives their public automation surfaces (headless CLI + JSON control
334
+ channel). The ArtCraft apps themselves are separate projects by the ArtCraft team — the apps' own
335
+ licenses apply to the apps.
package/README.zh-CN.md CHANGED
@@ -25,7 +25,7 @@ Adobe 对标工具,共 **13 个应用**:**PhotoCraft**(Photoshop)、**Ve
25
25
 
26
26
  本插件把这套自动化面接进 DeepSeek Harness,让 AI 不只是"谈论"这些软件,而是真的**操作**它们:
27
27
 
28
- - **对话里** —— 九个 Agent 工具,任何 Harness 会话都能检查工具链、执行 CLI 命令、向运行中的
28
+ - **对话里** —— 十个 Agent 工具,任何 Harness 会话都能检查工具链、执行 CLI 命令、向运行中的
29
29
  App 发控制通道命令、做桥接文件操作、跑交付质检、查每个应用的能力目录。
30
30
  - **随插件分发的技能包** —— 十一个技能(`artcraft-ops`、`artcraft-shot-language`、
31
31
  `artcraft-edit-rhythm`、`artcraft-color-light`、`artcraft-sound-design`、`artcraft-motion-vfx`、
@@ -70,7 +70,7 @@ FilmCraft 剪辑、调色、混音、烧字幕 → 导出 H.264。"生成"之后
70
70
  - **ArtCraft 应用** —— 从 [getartcraft.com](https://getartcraft.com/apps) 或
71
71
  [storytold GitHub Releases](https://github.com/storytold) 按需下载。Windows 与 Linux 的
72
72
  portable/安装包内置 CLI(`photocraft-cli.exe` 等);macOS 的 CLI 是单独的公证 zip。
73
- 已验证版本:PhotoCraft 0.6、FilmCraft 0.5、EffectCraft(早期构建)。
73
+ 已验证版本:PhotoCraft 0.9、FilmCraft 0.8、EffectCraft(早期构建)。
74
74
  - 其他什么都不需要:无 Python、无 FFmpeg —— ArtCraft 自带编解码器。
75
75
 
76
76
  ## 安装
@@ -112,8 +112,8 @@ pnpm install --dir C:/Users/<你>/.dsh/profiles/desktop
112
112
  {
113
113
  "bins": {
114
114
  // 三种写法:目录(自动拼接 <名>-cli 可执行文件)、完整 exe 路径、或走 PATH 的裸命令名
115
- "photocraft": "C:/craft/photocraft-0.6.0-windows-x64-portable",
116
- "filmcraft": "C:/craft/filmcraft-0.5.0-windows-x64-portable",
115
+ "photocraft": "C:/craft/<PhotoCraft 便携目录>",
116
+ "filmcraft": "C:/craft/<FilmCraft 便携目录>",
117
117
  "effectcraft": "C:/Program Files/EffectCraft"
118
118
  },
119
119
  "control": { "filmcraft": 9876, "effectcraft": 9877 }
@@ -124,7 +124,7 @@ pnpm install --dir C:/Users/<你>/.dsh/profiles/desktop
124
124
 
125
125
  ## 在对话里驱动
126
126
 
127
- 插件注册四个工具,agent 自行编排,所以自然语言直接可用:
127
+ 插件注册十个工具,agent 自行编排,所以自然语言直接可用:
128
128
 
129
129
  > *"把 `demo/media` 里的 PNG 都用柔和 S 曲线调色、智能锐化 80,结果放进 `demo/out/graded`。"*
130
130
 
@@ -137,7 +137,7 @@ artcraft_cli { bin:"photocraft", args:["batch","--actions","demo/craft/grade.js
137
137
 
138
138
  | 工具 | 用途 |
139
139
  |---|---|
140
- | `artcraft_status` | 工具体检:12 个 CLI 是否找到、配置目录、控制端口、进行中的任务 |
140
+ | `artcraft_status` | 工具体检:13 个 CLI 是否找到、配置目录、控制端口、进行中的任务 |
141
141
  | `artcraft_cli` | 同步执行任意 CLI 子命令(`photocraft-cli run/batch`、`wordcraft-cli convert` 等) |
142
142
  | `artcraft_control` | 向**运行中**的 App 控制通道发一条命令(filmcraft 9876 / effectcraft 9877 / vectorcraft 7979 / lightcraft 7980,或 port 直连) |
143
143
  | `artcraft_fs` | 桥接文件操作 —— list / stat / 读 / 写 / 建目录,路径由调用方绝对指定 |
@@ -306,16 +306,4 @@ GitHub 上传本仓库即可:`README.md` 英文优先,附
306
306
 
307
307
  ## 许可
308
308
 
309
- **本插件(`@ninkch/dsh-artcraft`):Apache-2.0**(见 [LICENSE](LICENSE))。不包含 ArtCraft 应用的任何代码 —— 只调用其公开自动化面
310
- (无头 CLI + JSON 控制通道)。
311
-
312
- **ArtCraft 各应用本身并非 OSI 开源**:它们采用 **ArtCraft License (WIP)** —— 一种 "fair source"
313
- (公平源代码)许可([全文见 NOTICE.md](NOTICE.md))。给构建在其上的使用者划重点:
314
-
315
- - ✅ 免费使用;可为私人目的备份、复制、修改、编译
316
- - ✅ **用这些应用创作的所有媒体完全归你** —— 渲染出的短剧成片就是你的商业资产,没有附加条件
317
- - ❌ 不得把应用当作自己的软件出售;不得用其代码开发竞品
318
- - ❌ 不得在 fork 中移除社区/捐赠链接;未经许可不得用 ArtCraft 名称、Logo 或吉祥物做商业宣传
319
- - 🤝 团队公开承诺:若业务终结,软件将转为 OSI 认可的开源许可
320
-
321
- 对 AI 短剧工作室的务实解读:本地随便用,别动应用里的社区链接,卖你的片子——而不是卖应用。
309
+ **本插件(`@ninkch/dsh-artcraft`):Apache-2.0**(见 [LICENSE](LICENSE))。不包含 ArtCraft 应用的任何代码——只调用其公开自动化面(无头 CLI + JSON 控制通道)。ArtCraft 各应用本身是 ArtCraft 团队的独立项目,应用自身的条款以其许可为准。
package/apps/catalog.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "note": "ArtCraft 家族 12 应用的自动化能力目录。来源:官方 getartcraft.com/apps、各应用 GitHub 仓库(storytold/*)、本机 12 个 <app>-cli --help 实测(0.2.9 时点)。要拿某应用的实时命令注册表,用 artcraft_cli 跑该应用的 commands 子命令。",
3
+ "note": "ArtCraft 家族 13 应用的自动化能力目录。来源:官方 getartcraft.com/apps、各应用 GitHub 仓库(storytold/*)、本机 13 个 <app>-cli --help 实测(2026-10 时点)。要拿某应用的实时命令注册表,用 artcraft_cli 跑该应用的 commands 子命令。",
4
4
  "controlProtocol": "家族共用 JSON-lines 控制协议(127.0.0.1:<port>,请求 {\"id\",\"method\",\"params\"},方法如 engine.execute / engine.commands / ui.inspect / ui.screenshot)。App 需以 --control 启动。artcraft_control 已代理有固定默认端口的应用;其余应用端口动态(app --port 启动时指定),可用 artcraft_control 的 port 参数直连。",
5
5
  "apps": [
6
6
  {
@@ -325,21 +325,21 @@
325
325
  }
326
326
  ],
327
327
  "capabilityStats": {
328
- "note": "2026-10 实测:本机 13 个成员 CLI 的命令注册表规模与主要命令族。JSON 注册表入口(filmcraft / effectcraft / photocraft / gridcraft / wordcraft / figcraft 用 commands --json)为精确条目数,其余为 id 扫描值(近似)。用 artcraft_cli 跑 commands 可随时复核。",
328
+ "note": "2026-10-21 实测(家族全量更新后:photocraft 0.11.1 / vectorcraft 0.14.0 / filmcraft 0.10.0 / lightcraft 0.10.0 / pdfcraft 0.10.1 / effectcraft 0.13.0 / designcraft 0.10.0 / wordcraft 0.9.0 / deckcraft 0.9.0 / gridcraft 0.9.0 / cadcraft 0.10.0 / soundcraft 0.10.0 / figcraft 0.8.0)。JSON 注册表入口(filmcraft / effectcraft / photocraft / gridcraft / wordcraft / figcraft 用 commands --json)为精确条目数,其余为 id 扫描值(近似)。用 artcraft_cli 跑 commands 可随时复核。",
329
329
  "apps": {
330
- "photocraft": { "commands": 364, "topFamilies": ["filter 62(gallery 47 / blur 11 / stylize 9 / distort 9 / render 9)", "edit 31", "layer 26", "select 19", "file.automate 18", "channel 18", "actions 14", "image.adjustments 9"] },
331
- "vectorcraft": { "commands": 385, "topFamilies": ["object 71", "perspective 24", "select 18", "file 17", "swatch 15", "document 12", "layer 11", "path 11", "symbol 10", "dataset 10"] },
330
+ "photocraft": { "commands": 918, "topFamilies": ["filter 62(gallery 47 / blur 11 / stylize 9 / distort 9 / render 9)", "image.adjustments 9", "layer 26", "edit 31", "select 19", "paint 12", "brush 13", "gradient 12", "type 9", "shape 9", "path 9", "pattern 10", "file.automate 18", "channel 18", "actions 14", "swatches 9", "history 3", "slice 6", "jobs 2", "plugin 5"] },
331
+ "vectorcraft": { "commands": 401, "topFamilies": ["object 71", "perspective 24", "select 18", "text 10", "variable 9", "brush 9", "library 9", "print 9", "pdf.preset 5", "flattener 6", "swatch 15", "document 12", "layer 11", "path 11", "symbol 10", "dataset 10", "shaper 4"] },
332
332
  "filmcraft": { "commands": 701, "topFamilies": ["graphics 82", "clip 57", "file 57", "timeline 56", "sequence 45", "project 40", "edit 39", "multicam 35", "markers 32", "trim 24", "captions 22", "mixer 20", "export 19", "effects 16", "transcript 14", "masks 12", "essentialSound 9", "lumetri 7", "tts 7", "lut 4"] },
333
- "lightcraft": { "commands": 192, "developControls": 122, "topFamilies": ["library 20", "faces 17", "denoise 16", "develop 16(122 个控制 / 14 分区)", "photo 14", "mask 12", "keyword 12", "preset 9", "crop 6", "stack 6"] },
334
- "pdfcraft": { "commands": 71, "topFamilies": ["edit 13", "page 10", "measure 7", "a11y 5", "export 4", "ocr 3", "form 3", "comment 3", "protect 2", "sign 2"] },
335
- "effectcraft": { "commands": 731, "effects": 307, "topFamilies": ["layer 121", "view 78", "file 61", "keys 36", "comp 31", "edit 27", "track 22", "essential 22", "renderQueue 20", "effect 19", "camera 19", "prop 18", "mask 17", "time 17", "roto 14", "text 13", "puppet 10"], "exportFormats": ["H264", "Hevc", "Av1", "ProRes", "Uncompressed", "WebM", "PngSequence", "JpegSequence", "TiffSequence", "ExrSequence", "Gif", "Wav", "Aiff"], "expressions": true, "scripting": true },
336
- "designcraft": { "commands": 279, "topFamilies": ["object 22", "style 17", "file 15", "transform 10", "data 10", "type 10", "library 8", "layout 7", "book 7", "edit 7", "text 7", "layer 7", "table 7", "article 6"] },
337
- "wordcraft": { "commands": 299, "topFamilies": ["para 28", "format 25", "file 18", "review 16", "equation 15", "insert 15", "table 14", "view 13", "select 12", "picture 11", "styles 11", "references 10", "mailings 9"] },
338
- "deckcraft": { "commands": 165, "topFamilies": ["format 32", "shape 19", "slide 15", "file 13", "animation 10", "text 10", "edit 9", "media 7", "insert 7", "arrange 7", "design 5", "transition 4"] },
339
- "gridcraft": { "commands": 115, "topFamilies": ["home 12", "pivot 11", "insert 10", "data 10", "view 9", "sheet 8", "edit 7", "file 7", "selection 6", "formulas 5", "chart 3", "slicer 3"] },
340
- "cadcraft": { "commands": 139, "topFamilies": ["table 11", "arc 10", "zoom 9", "dimstyle 7", "blocks 6", "grip 6", "layout 6", "layerstate 5", "vports 5", "circle 5", "dimtedit 5"] },
341
- "soundcraft": { "commands": 478, "topFamilies": ["view 96", "edit 93", "track 65", "event 35", "options 35", "clip 31", "mix 29", "setup 20", "file 17", "transport 13", "session 11(含 audio_health)", "automation 10"] },
342
- "figcraft": { "commands": 552, "topFamilies": ["text 52", "view 48", "vector 40", "object 27", "tool 21", "select 21", "component 21", "collab 20", "file 20", "proto 20", "library 18", "variable 18", "edit 15", "comment 14", "plugin 11", "style 10"] }
333
+ "lightcraft": { "commands": 227, "developControls": 122, "topFamilies": ["print 17(打印版式模板:cell/layout/template)", "slideshow.export", "library 20", "faces 17", "denoise 16", "develop 16(122 个控制 / 14 分区)", "photo 14", "mask 12", "keyword 12", "preset 9", "crop 6", "stack 6"] },
334
+ "pdfcraft": { "commands": 77, "topFamilies": ["edit 13", "page 10", "measure 7", "a11y 5", "export 4", "ocr 3", "form 3", "comment 3", "protect 2", "sign 2", "create 1(新建 PDF)", "text_edit 1"] },
335
+ "effectcraft": { "commands": 731, "effects": 307, "topFamilies": ["layer 121", "view 78", "file 61", "keys 36", "comp 31", "edit 27", "track 22", "essential 22", "renderQueue 20", "effect 19", "camera 19", "prop 18(0.13.0 起属性读写统一走 prop.get/set,effect.setParam 已移除)", "mask 17", "time 17", "roto 14", "text 13", "puppet 10", "face 5(0.13 新增)", "learn 5(0.13 新增)"], "exportFormats": ["H264", "Hevc", "Av1", "ProRes", "Uncompressed", "WebM", "PngSequence", "JpegSequence", "TiffSequence", "ExrSequence", "Gif", "Wav", "Aiff"], "expressions": true, "scripting": true },
336
+ "designcraft": { "commands": 309, "topFamilies": ["object 22", "style 17", "file 15", "transform 10", "data 10", "type 10", "toc 3(目录)", "footnote 4(脚注)", "xref 3(交叉引用)", "index 3(索引)", "preflight.run(印前检查)", "condition 5(条件样式)", "flex 5", "layout 7", "book 7", "article 6"] },
337
+ "wordcraft": { "commands": 633, "topFamilies": ["para 28", "format 25", "file 18", "review 16", "caret 7", "edit 10", "outline 8", "layout 7", "fields 6", "arrange 9", "draw 9", "canvas 4", "chart 3", "shape 6", "equation 15", "insert 15", "table 14", "styles 11", "references 10"] },
338
+ "deckcraft": { "commands": 209, "topFamilies": ["format 32", "shape 19", "slide 15", "file 13", "animation 10", "text 10", "picture 9", "comment 7", "review 7", "table 5", "chart 3", "design 5", "transition 4", "handout 1", "master 2"] },
339
+ "gridcraft": { "commands": 341, "topFamilies": ["home 12", "pivot 11", "insert 10", "data 10", "cell 2", "range 1", "table 3", "object 2", "link 1", "draw 4", "arrange 3", "review 2", "formulas 5", "chart 3", "window 1"] },
340
+ "cadcraft": { "commands": 139, "topFamilies": ["table 11", "arc 10", "zoom 9", "dimstyle 7", "blocks 6", "grip 6", "layout 6", "layerstate 5", "vports 5", "circle 5", "dimtedit 5", "compare 2", "quickcalc 1"] },
341
+ "soundcraft": { "commands": 480, "topFamilies": ["view 96", "edit 93", "track 65", "event 35", "options 35", "clip 31", "mix 29", "setup 20", "file 17", "transport 13", "session 11(含 audio_health)", "automation 10", "midi 6(0.10 新增)", "video 3(0.10 新增)", "audiosuite 1"] },
342
+ "figcraft": { "commands": 569, "topFamilies": ["text 52", "view 48", "vector 40", "object 27", "tool 21", "select 21", "component 21", "collab 20", "file 20", "proto 20", "library 18", "variable 18", "edit 15", "comment 14", "plugin 11", "style 10"] }
343
343
  }
344
344
  }
345
345
  }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "bins": {
3
- "photocraft": "D:/craft/photocraft-0.6.0/photocraft-0.6.0-windows-x64-portable",
3
+ "photocraft": "C:/craft/<PhotoCraft portable folder>",
4
4
  "vectorcraft": "C:/Program Files/VectorCraft",
5
- "filmcraft": "D:/craft/filmcraft-0.5.0/filmcraft-0.5.0-windows-x64-portable",
5
+ "filmcraft": "C:/craft/<FilmCraft portable folder>",
6
6
  "lightcraft": "C:/Program Files/LightCraft",
7
7
  "pdfcraft": "C:/Program Files/PdfCraft",
8
8
  "effectcraft": "C:/Program Files/EffectCraft",
package/client.js CHANGED
@@ -118,6 +118,29 @@ window.__ModuleLoader__.load({
118
118
  finally { if (alive.current) setBusy(''); }
119
119
  }, []);
120
120
 
121
+ // 一键自动探测(AC-04):POST /discover 做缺失项填空 + 失效路径纠正;
122
+ // 用户显式配置有效则原样不动(服务端保证),失败/无动作都有明确文案,不静默。
123
+ const runDiscover = useCallback(async () => {
124
+ setBusy('discover'); setOut(''); setDone(false);
125
+ try {
126
+ const r = await api('/discover', { method: 'POST', headers: { 'content-type': 'application/json' }, body: '{}' });
127
+ if (!alive.current) return;
128
+ const applied = r.applied ?? {};
129
+ const appliedNames = Object.keys(applied).map((k) => LABELS[k] || k);
130
+ setOut(
131
+ (r.note || '') + '\n' +
132
+ (appliedNames.length
133
+ ? '本次写入配置:' + appliedNames.join('、') + '\n'
134
+ : '没有需要更新的家族程序(已有配置均有效)\n') +
135
+ '已探测到本机安装:' + (Object.keys(r.discovered ?? {}).map((k) => LABELS[k] || k).join('、') || '(无)') + '\n' +
136
+ '配置文件:' + (r.configPath || '(未知)'),
137
+ );
138
+ loadStatus(); // 探测写盘后立即重读 bins 状态,灯色即变
139
+ } catch (e) {
140
+ if (alive.current) setOut('自动探测失败:' + String(e.message || e) + '(可检查插件是否注册、或手动编辑 artcraft.config.json)');
141
+ } finally { if (alive.current) setBusy(''); }
142
+ }, [loadStatus]);
143
+
121
144
  useEffect(() => { loadStatus(); checkUpdate(); }, [loadStatus, checkUpdate]);
122
145
 
123
146
  const bins = status?.bins ?? {};
@@ -153,6 +176,9 @@ window.__ModuleLoader__.load({
153
176
  (upd?.pendingRestart ? '(磁盘已是 v' + (upd.pendingVersion ?? upd.diskVersion ?? '?') + ',待重启)' : '') +
154
177
  (upd ? ' · npm latest v' + (upd.latest ?? '—') : '') +
155
178
  (upd?.mode ? '(' + (upd.mode === 'git' ? 'git 仓库' + (upd.gitClean === false ? ' · 有本地改动' : '') : 'npm 安装') + ')' : '')),
179
+ h('button', { className: 'dshac-btn', onClick: runDiscover, disabled: busy !== '',
180
+ title: '自动探测本机 ArtCraft 家族安装位置:缺失项填入配置,已失效的路径被纠正;你的显式有效配置不会被覆盖' },
181
+ busy === 'discover' ? '探测中…' : '自动探测'),
156
182
  h('button', { className: 'dshac-btn primary', onClick: checkUpdate, disabled: busy !== '' },
157
183
  busy === 'check' ? '检查中…' : '检查更新'),
158
184
  h('button', {
package/index.js CHANGED
@@ -55,7 +55,7 @@ import crypto from 'node:crypto';
55
55
  import { fileURLToPath } from 'node:url';
56
56
 
57
57
  const NAME = 'artcraft';
58
- const VERSION = '0.3.1';
58
+ const VERSION = '0.3.2';
59
59
  const HERE = path.dirname(fileURLToPath(import.meta.url));
60
60
 
61
61
  const BINS = [
@@ -183,11 +183,13 @@ function resolveCallerPath(p) {
183
183
  let s = String(p ?? '').trim();
184
184
  if (!s) throw new Error('缺少路径参数');
185
185
  if (s === '~' || s.startsWith('~/') || s.startsWith('~\\')) s = path.join(os.homedir(), s.slice(1));
186
- const abs = path.resolve(s);
187
- if (!path.isAbsolute(abs)) {
188
- throw new Error('需要绝对路径 —— 对话调用传当前工作空间下的绝对路径,画布传项目目录下的绝对路径(或用 base + 相对路径组合)');
186
+ if (!path.isAbsolute(s)) {
187
+ throw new Error(
188
+ `需要绝对路径,收到相对路径 "${s}" —— 本插件不持有数据目录,不会按进程 cwd 解析;`
189
+ + '请改传绝对 path=<绝对路径>,或用 base=<绝对目录> + rel=<相对路径>。',
190
+ );
189
191
  }
190
- return abs;
192
+ return path.normalize(s);
191
193
  }
192
194
 
193
195
  function resolveBaseRel(base, rel) {
@@ -364,7 +366,7 @@ async function statOutputs(outputs, cwd) {
364
366
  try {
365
367
  abs = base ? path.resolve(base, spec) : resolveCallerPath(spec);
366
368
  } catch {
367
- out.push({ rel: spec, exists: false, dir: false, size: null, mtime: null });
369
+ out.push({ rel: spec, exists: false, dir: false, size: null, mtime: null, reason: 'relative-output-without-cwd' });
368
370
  continue;
369
371
  }
370
372
  try {
@@ -1038,6 +1040,9 @@ async function updateApply() {
1038
1040
  const toolNames = [];
1039
1041
  const toolErrors = [];
1040
1042
 
1043
+ /** 单测钩子:只暴露纯函数,不改运行时行为(scripts/test-fs-paths.mjs 使用) */
1044
+ export const __testables = { resolveCallerPath, resolveBaseRel, statOutputs };
1045
+
1041
1046
  export const inject = ['tools', 'webServer'];
1042
1047
 
1043
1048
  export function apply(ctx) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ninkch/dsh-artcraft",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "type": "module",
5
5
  "description": "Drive the open-source ArtCraft studio suite (13 family apps: PhotoCraft, VectorCraft, FilmCraft, LightCraft, PdfCraft, EffectCraft, DesignCraft, WordCraft, DeckCraft, GridCraft, CADCraft, SoundCraft, FigCraft) from DeepSeek Harness: agent tools, a same-origin HTTP API, a bundled craft skill pack, and plugins-page status with self-update.",
6
6
  "keywords": [
@@ -26,6 +26,9 @@
26
26
  "engines": {
27
27
  "node": ">=18"
28
28
  },
29
+ "scripts": {
30
+ "selftest": "node scripts/selftest.mjs"
31
+ },
29
32
  "exports": {
30
33
  ".": "./index.js",
31
34
  "./client": "./client.js",
@@ -41,6 +44,7 @@
41
44
  "artcraft.config.json.example",
42
45
  "apps",
43
46
  "recipes",
47
+ "CHANGELOG.md",
44
48
  "README.md",
45
49
  "README.zh-CN.md",
46
50
  "NOTICE.md"
@@ -16,7 +16,7 @@ description: 影调与调色决策——一级(曝光/对比/白平衡/饱和
16
16
  | 3 | 白平衡(色温/色调) | 矢量示波器:肤色线附近 | 偏黄/偏青不察 |
17
17
  | 4 | 饱和 / 自然饱和度 | 矢量示波器不越界 | 过饱和→溢出结块 |
18
18
 
19
- **LightCraft 落点(122 控制 / 14 分区)**——标准冲洗顺序:
19
+ **LightCraft 落点(122 控制 / 14 分区,0.10 未变)**——标准冲洗顺序:
20
20
 
21
21
  ```
22
22
  profile.amount → wb.temp / wb.tint → light.exposure / light.contrast /
@@ -32,6 +32,8 @@ geometry.*(透视/旋转/裁切)→ effects.texture/clarity/dehaze → grain
32
32
 
33
33
  **PhotoCraft 落点**:`image.adjustments.exposure/levels/curves/vibrance/desaturate`;RAW 走 `filter.cameraRaw`;批量一致性用 `actions.record → actions.save → file.automate.batch`。
34
34
 
35
+ **打印版式(LightCraft 0.10 新增)**:`print.template.list/apply/save` + `print.cell.*` + `print.layout`——把冲洗结果按版式模板排进打印页;`slideshow.export` 直接出幻灯片。
36
+
35
37
  ## 二、二级校色与局部
36
38
 
37
39
  | 手法 | 何时用 | 落点 |
@@ -44,13 +44,16 @@
44
44
  | 交付物 | 检查项 | 命令 |
45
45
  |---|---|---|
46
46
  | PDF(阅读) | 无障碍(标签/阅读顺序/替代文本) | `pdfcraft run a11y.check` · `a11y.report` · `a11y.alt_text` |
47
- | PDF(印刷) | 出血、裁切标记、CMYK、尺寸 | FigCraft `export --bleed 3mm --crop-marks --cmyk`;DesignCraft `layout/type` |
47
+ | PDF(新建) | 0.10 新增 `create`:从零生成 PDF | `pdfcraft-cli run create …`(先 `pdfcraft-cli tools` 查参数) |
48
+ | PDF(文本勘误) | 直接改文本层 | `pdfcraft run text_edit`(0.10 新增)/ `edit.edit_text` |
49
+ | PDF(印刷) | 出血、裁切标记、CMYK、尺寸;**印前检查** | FigCraft `export --bleed 3mm --crop-marks --cmyk`;DesignCraft `layout/type` + **`preflight.run`**(0.10 新增) |
48
50
  | PDF(长期存档) | PDF/A 合规 | `pdfcraft run standards.pdfa` |
49
51
  | PDF(传输) | 体积 | `pdfcraft run optimize.reduce`(或 `optimize.advanced`) |
50
52
  | PDF(安全) | 口令/权限 | `pdfcraft protect.password` / `protect.remove` |
51
53
  | Word 文档 | 无障碍、批注、修订、文献 | `wordcraft run --cmd file.accessibility` · `review.changes` · `references.bibliography` |
52
54
  | 表格 | 数据校验、公式、图表 | `gridcraft data.validate` / `data.validation` · `formulas.evaluate` |
53
- | 演示 | 转场/动画时长、备注 | `deckcraft transition.set` · `animation.timing` |
55
+ | 演示 | 转场/动画时长、备注;讲义/母版 | `deckcraft transition.set` · `animation.timing` · `handout`(0.9 新增)/ `master` |
56
+ | 矢量印刷交付 | 打印预设与拼版 | VectorCraft `print.setup` · `print.tiling` · `pdf.preset.*`(0.14 新增) |
54
57
 
55
58
  ## 五、命名与目录约定
56
59
 
@@ -36,7 +36,7 @@ description: 动效与特效选择——何时在剪辑内做效果(FilmCraft
36
36
  | Time | 8 | 时间重映射、残影、像素运动模糊 | 变速优先在剪辑层做 |
37
37
  | 3D Channel / Expression Controls / Matte / Text / Utility / Obsolete | 8/9/6/2/9/9 | 深度合成、表达式控制、遮罩工具 | Obsolete 类避免新项目使用 |
38
38
 
39
- **查询**:`artcraft_cli { bin:"effectcraft", args:["commands","--json"] }` 取全部 id;`exec app.capabilities` 看效果总数与导出格式;`effect.apply {layer, effect}` 施加;`effect.setParam` 调参。
39
+ **查询**:`artcraft_cli { bin:"effectcraft", args:["commands","--json"] }` 取全部 id;`exec app.capabilities` 看效果总数与导出格式;`effect.apply {layer, effect}` 施加;调参用 **`prop.set`**(0.13.0 起 `effect.setParam` 已移除,属性读写统一走 `prop.get/set/toggleAnimation/addKey`,参数路径形如 `effects/#1/<param>`)。
40
40
 
41
41
  ## 三、关键帧与缓动(动效"贵不贵"就看这里)
42
42
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 效果 id 来自官方注册表(`ec.<类别>.<名称>`),共 307 个;完整清单见同目录 `effect-catalogue.md`。
4
4
  > 用法:`artcraft_cli { bin:"effectcraft", args:["exec","effect.apply","--params","{\"layer\":N,\"effect\":\"<id>\"}"] }`
5
- > 参数走 `effect.setParam {clip|layer, effect, param, value}`;参数 id 形如 `effects/#1/<param>`。
5
+ > 参数走 **`prop.set`**(0.13.0 起 `effect.setParam` 已移除):`artcraft_cli { bin:"effectcraft", args:["exec","prop.set","--params","{\"layer\":N,\"property\":\"effects/#1/<param>\",\"value\":…}"] }`;读用 `prop.get`,打点用 `prop.addKey`,表达式用 `prop.setExpression`。
6
6
  > 表中 id 均为**已验证存在**;没有把握的不要写死,先 `describe` 或查目录。
7
7
 
8
8
  ## 一、光效与氛围
@@ -1,6 +1,6 @@
1
1
  # ArtCraft 13 成员命令族总表(实测)
2
2
 
3
- > 来源:2026-10 在本机对 13 个成员 CLI 的 `commands` 注册表实测。
3
+ > 来源:2026-10-21 在本机对 13 个成员 CLI 的 `commands` 注册表实测(家族全量更新后版本,见规模总览)。
4
4
  > 精确条目数来自 JSON 注册表(`commands --json`:filmcraft / effectcraft / photocraft / gridcraft / wordcraft / figcraft),其余为 id 扫描值(近似)。
5
5
  > 随时复核:`artcraft_cli { bin:"<app>", args:["commands","--json"] }`(不支持 `--json` 的成员直接 `commands`)。
6
6
 
@@ -8,37 +8,37 @@
8
8
 
9
9
  | 成员 | 命令数 | 版本实测 | 定位 |
10
10
  |---|---:|---|---|
11
- | EffectCraft | 731(含 **307 效果**) | 0.10.0 | 合成 / 动效 / VFX |
12
- | FilmCraft | 701 | 0.8.0 | 剪辑 / 字幕 / 调色 / 混音 |
13
- | FigCraft | 552 | — | 界面设计与原型 |
14
- | SoundCraft | 478 | 0.7.0 | 音频后期 / 混音 |
15
- | VectorCraft | 385 | 0.11.0 | 矢量插画 |
16
- | PhotoCraft | 364(**62 滤镜**) | 0.9.0 | 图像 / 影调 |
17
- | WordCraft | 299 | 0.7.0 | 写作 / 文档 |
18
- | DesignCraft | 279 | 0.8.0 | 页面排版 / 出版 |
19
- | LightCraft | 192(**122 develop 控制**) | 0.8.0 | 照片 / RAW 冲洗 |
20
- | DeckCraft | 165 | 0.7.0 | 演示 / 幻灯片 |
21
- | CADCraft | 139 | 0.7.0 | 制图 |
22
- | GridCraft | 115 | 0.7.0 | 表格 / 数据 |
23
- | PdfCraft | 71(**86 个可运行工具**) | 0.8.0 | PDF / 文档质检 |
11
+ | EffectCraft | 731(含 **307 效果**;**`effect.setParam` 已移除,属性读写走 `prop.*`**) | 0.13.0 | 合成 / 动效 / VFX |
12
+ | PhotoCraft | 918(**62 滤镜**;0.11 编辑器命令大量上引擎) | 0.11.1 | 图像 / 影调 |
13
+ | FigCraft | 569 | 0.8.0 | 界面设计与原型 |
14
+ | WordCraft | 633 | 0.9.0 | 写作 / 文档 |
15
+ | SoundCraft | 480(**0.10 新增 `midi.*`/`video.*`/`audiosuite`**) | 0.10.0 | 音频后期 / 混音 |
16
+ | VectorCraft | 401(**0.14 新增 `text`/`variable`/`pdf.preset`/`print`**) | 0.14.0 | 矢量插画 |
17
+ | FilmCraft | 701 | 0.10.0 | 剪辑 / 字幕 / 调色 / 混音 |
18
+ | LightCraft | 227(**122 develop 控制**;**0.10 新增 `print.*` 模板与 `slideshow.export`**) | 0.10.0 | 照片 / RAW 冲洗 |
19
+ | DesignCraft | 309(**0.10 新增 `toc`/`footnote`/`xref`/`index`/`preflight`**) | 0.10.0 | 页面排版 / 出版 |
20
+ | DeckCraft | 209 | 0.9.0 | 演示 / 幻灯片 |
21
+ | PdfCraft | 77(**86 个可运行工具**;新增 `create`/`text_edit`) | 0.10.1 | PDF / 文档质检 |
22
+ | CADCraft | 139 | 0.10.0 | 制图 |
23
+ | GridCraft | 341 | 0.9.0 | 表格 / 数据 |
24
24
 
25
25
  ## 各成员主要命令族
26
26
 
27
27
  | 成员 | 主要族(数量) |
28
28
  |---|---|
29
29
  | FilmCraft | `graphics` 82 · `clip` 57 · `file` 57 · **`timeline` 56** · `sequence` 45 · `project` 40 · `edit` 39 · **`multicam` 35** · `markers` 32 · **`trim` 24** · **`captions` 22** · `mixer` 20 · `export` 19 · `effects` 16 · **`transcript` 14** · `masks` 12 · `essentialSound` 9 · **`lumetri` 7** · **`tts` 7** · `lut` 4 · `scopes` 1 · `color` 1 |
30
- | EffectCraft | `layer` 121 · `view` 78 · `file` 61 · **`keys` 36** · `comp` 31 · `edit` 27 · **`track` 22** · **`essential` 22** · `renderQueue` 20 · `effect` 19 · **`camera` 19** · `prop` 18 · `mask` 17 · `time` 17 · **`roto` 14** · `text` 13 · `footage` 12 · **`puppet` 10** |
30
+ | EffectCraft | `layer` 121 · `view` 78 · `file` 61 · **`keys` 36** · `comp` 31 · `edit` 27 · **`track` 22** · **`essential` 22** · `renderQueue` 20 · `effect` 19 · **`camera` 19** · **`prop` 18(替代已移除的 `effect.setParam`)** · `mask` 17 · `time` 17 · **`roto` 14** · `text` 13 · `footage` 12 · **`puppet` 10** · `face` 5(0.13 新增) · `learn` 5(0.13 新增) |
31
31
  | FigCraft | `text` 52 · `view` 48 · `vector` 40 · `object` 27 · `tool` 21 · `select` 21 · **`component` 21** · `collab` 20 · `file` 20 · **`proto` 20** · `library` 18 · **`variable` 18** · `edit` 15 · `comment` 14 · `plugin` 11 · **`style` 10** · `version` 8 · `instance` 8 · `annotation` 8 · `branch` 7 |
32
- | SoundCraft | `view` 96 · `edit` 93 · **`track` 65** · `event` 35(含 **`beat_detective`/`identify_beat`/`extract_chords`**) · `options` 35 · `clip` 31 · **`mix` 29** · `setup` 20 · `file` 17(**`bounce_mix`/`bounce_stems`**) · `transport` 13 · **`session` 11(含 `audio_health`)** · **`automation` 10** |
33
- | VectorCraft | **`object` 71** · **`perspective` 24** · `select` 18 · `file` 17 · `swatch` 15 · `document` 12 · `layer` 11 · `path` 11 · **`symbol` 10** · **`dataset` 10** |
34
- | PhotoCraft | **`filter` 62**(gallery 47 / blur 11 / stylize 9 / distort 9 / render 9 / pixelate 7 / blurGallery 5 / noise 5 / sharpen 5 …) · `edit` 31 · `layer` 26 · `select` 19 · `file.automate` 18 · `channel` 18 · **`actions` 14** · `brush` 13 · `paint` 12 · `gradient` 12 · **`image.adjustments` 9** |
35
- | WordCraft | `para` 28 · `format` 25 · `file` 18(含 `accessibility`) · **`review` 16** · `equation` 15 · `insert` 15 · `table` 14 · `view` 13 · `select` 12 · `picture` 11 · `styles` 11 · **`references` 10** · `mailings` 9 |
36
- | DesignCraft | `object` 22 · **`style` 17** · `file` 15 · `transform` 10 · `data` 10 · `type` 10 · `library` 8 · `layout` 7 · `book` 7 · `article` 6 · `table` 7 |
37
- | LightCraft | `library` 20 · **`faces` 17** · **`denoise` 16** · **`develop` 16(122 控制 / 14 分区)** · `photo` 14 · `mask` 12 · `keyword` 12 · `preset` 9 · `crop` 6 · `stack` 6 · `version` 5 · `history` 5 |
38
- | DeckCraft | `format` 32 · `shape` 19 · `slide` 15 · `file` 13 · **`animation` 10** · `text` 10 · `edit` 9 · `media` 7 · `insert` 7 · `arrange` 7 · **`design` 5** · **`transition` 4** |
39
- | CADCraft | `table` 11 · `arc` 10 · `zoom` 9 · **`dimstyle` 7** · `blocks` 6 · `grip` 6 · `layout` 6 · `layerstate` 5 · `vports` 5 · `circle` 5 |
40
- | GridCraft | `home` 12 · **`pivot` 11** · `insert` 10 · **`data` 10** · `view` 9 · `sheet` 8 · `edit` 7 · `file` 7 · `selection` 6 · **`formulas` 5** · `chart` 3 · `slicer` 3 |
41
- | PdfCraft | `edit` 13 · `page` 10 · **`measure` 7** · **`a11y` 5** · `export` 4 · `ocr` 3 · `form` 3 · `comment` 3 · `protect` 2 · `sign` 2(另有 86 个可 `run` 的工具,含 `a11y.check`/`a11y.report`/`measure.info`/`optimize.reduce`/`standards.pdfa`/`doc.compare`) |
32
+ | SoundCraft | `view` 96 · `edit` 93 · **`track` 65** · `event` 35(含 **`beat_detective`/`identify_beat`/`extract_chords`**) · `options` 35 · `clip` 31 · **`mix` 29** · `setup` 20 · `file` 17(**`bounce_mix`/`bounce_stems`**) · `transport` 13 · **`session` 11(含 `audio_health`)** · **`automation` 10** · **`midi` 6 · `video` 3 · `audiosuite` 1(0.10 新增)** |
33
+ | VectorCraft | **`object` 71** · **`perspective` 24** · `select` 18 · `file` 17 · `swatch` 15 · `document` 12 · **`text` 10 · `variable` 9 · `brush` 9 · `library` 9 · `print` 9(0.14 新增)** · `layer` 11 · `path` 11 · **`symbol` 10** · **`dataset` 10** · **`pdf.preset` 5 · `flattener` 6(0.14 新增)** |
34
+ | PhotoCraft | **`filter` 62**(gallery 47 / blur 11 / stylize 9 / distort 9 / render 9 / pixelate 7 / blurGallery 5 / noise 5 / sharpen 5 …) · `edit` 31 · `layer` 26 · `select` 19 · `file.automate` 18 · `channel` 18 · **`actions` 14** · `brush` 13 · `paint` 12 · `gradient` 12 · **`image.adjustments` 9** · **0.11 新增引擎化:`type` 9 · `shape` 9 · `path` 9 · `pattern` 10 · `swatches` 9 · `slice` 6 · `variables`/`jobs`/`plugin`** |
35
+ | WordCraft | `para` 28 · `format` 25 · `file` 18(含 `accessibility`) · **`review` 16** · `equation` 15 · `insert` 15 · `table` 14 · **0.9 新增:`edit` 10 · `outline` 8 · `caret` 7 · `layout` 7 · `arrange` 9 · `draw` 9 · `shape` 6 · `canvas` 4 · `fields` 6 · `design` 4 · `hf` 3 · `developer` 3** |
36
+ | DesignCraft | `object` 22 · **`style` 17** · `file` 15 · `transform` 10 · `data` 10 · `type` 10 · **0.10 新增:`toc` 3 · `footnote` 4 · `xref` 3 · `index` 3 · `preflight.run` · `condition` 5 · `flex` 5 · `xml` 4 · `variables` 4 · `spelling` 3 · `hyperlink` 4** · `layout` 7 · `book` 7 · `article` 6 |
37
+ | LightCraft | `library` 20 · **`faces` 17** · **`denoise` 16** · **`develop` 16(122 控制 / 14 分区,未变)** · **0.10 新增:`print` 17(版式模板 cell/layout/template)· `slideshow.export`** · `photo` 14 · `mask` 12 · `keyword` 12 · `preset` 9 · `crop` 6 · `stack` 6 · `version` 5 · `history` 5 |
38
+ | DeckCraft | `format` 32 · `shape` 19 · `slide` 15 · `file` 13 · **`animation` 10** · `text` 10 · **0.9 新增:`picture` 9 · `comment` 7 · `review` 7 · `table` 5 · `chart` 3 · `master` 2 · `handout` 1** · `media` 7 · `insert` 7 · `arrange` 7 · **`design` 5** · **`transition` 4** |
39
+ | CADCraft | `table` 11 · `arc` 10 · `zoom` 9 · **`dimstyle` 7** · `blocks` 6 · `grip` 6 · `layout` 6 · `layerstate` 5 · `vports` 5 · `circle` 5 · **0.10 新增:`compare` 2 · `quickcalc` · `revcloud` 2 · `constraints` 2** |
40
+ | GridCraft | `home` 12 · **`pivot` 11** · `insert` 10 · **`data` 10** · **0.9 新增:`cell` 2 · `range` · `table` 3 · `object` 2 · `link` · `draw` 4 · `review` 2 · `window`** · `view` 9 · `sheet` 8 · `edit` 7 · `file` 7 · `selection` 6 · **`formulas` 5** · `chart` 3 |
41
+ | PdfCraft | `edit` 13 · `page` 10 · **`measure` 7** · **`a11y` 5** · `export` 4 · `ocr` 3 · `form` 3 · `comment` 3 · `protect` 2 · `sign` 2 · **0.10 新增:`create`(新建 PDF)· `text_edit` · `form_fields` · `standards`**(另有 86+ 个可 `run` 的工具,含 `a11y.check`/`a11y.report`/`measure.info`/`optimize.reduce`/`standards.pdfa`/`doc.compare`) |
42
42
 
43
43
  ## 自发现三件套
44
44