@ninkch/dsh-artcraft 0.2.10 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/README.md +38 -13
  2. package/README.zh-CN.md +33 -10
  3. package/apps/catalog.json +53 -1
  4. package/artcraft.config.json.example +5 -2
  5. package/client.js +11 -2
  6. package/cordis.patch.yml +4 -0
  7. package/index.js +451 -19
  8. package/package.json +6 -2
  9. package/recipes/recipes.json +315 -32
  10. package/skills/README.md +43 -0
  11. package/skills/artcraft-batch-pipeline/SKILL.md +96 -0
  12. package/skills/artcraft-color-light/SKILL.md +96 -0
  13. package/skills/artcraft-color-light/references/develop-controls.md +43 -0
  14. package/skills/artcraft-color-light/references/lumetri-and-scopes.md +65 -0
  15. package/skills/artcraft-delivery-qc/SKILL.md +105 -0
  16. package/skills/artcraft-delivery-qc/references/platform-specs.md +74 -0
  17. package/skills/artcraft-edit-rhythm/SKILL.md +110 -0
  18. package/skills/artcraft-edit-rhythm/references/transitions.md +53 -0
  19. package/skills/artcraft-film-study/SKILL.md +109 -0
  20. package/skills/artcraft-motion-vfx/SKILL.md +117 -0
  21. package/skills/artcraft-motion-vfx/references/effect-catalogue.md +429 -0
  22. package/skills/artcraft-motion-vfx/references/scene-to-effect.md +103 -0
  23. package/skills/artcraft-multicam/SKILL.md +79 -0
  24. package/skills/artcraft-ops/SKILL.md +116 -0
  25. package/skills/artcraft-ops/references/command-families.md +57 -0
  26. package/skills/artcraft-shot-language/SKILL.md +112 -0
  27. package/skills/artcraft-shot-language/references/shot-vocabulary.md +98 -0
  28. package/skills/artcraft-sound-design/SKILL.md +95 -0
  29. package/skills/artcraft-sound-design/references/essential-sound.md +77 -0
  30. package/skills/artcraft-style-bible/SKILL.md +84 -0
  31. package/skills.js +84 -0
package/README.md CHANGED
@@ -14,28 +14,38 @@
14
14
 
15
15
  ## Why this exists
16
16
 
17
- [ArtCraft](https://getartcraft.com/apps) is a family of **twelve** free, fair-source reinventions
17
+ [ArtCraft](https://getartcraft.com/apps) is a family of **thirteen** free, fair-source reinventions
18
18
  of Adobe's studio tools, written from scratch in pure Rust: **PhotoCraft** (Photoshop),
19
19
  **VectorCraft** (Illustrator), **FilmCraft** (Premiere Pro), **LightCraft** (Lightroom),
20
20
  **PdfCraft** (Acrobat), **EffectCraft** (After Effects), **DesignCraft** (InDesign),
21
- **WordCraft** (Word), **DeckCraft** (PowerPoint), **GridCraft** (Excel), **CADCraft** (AutoCAD)
22
- and **SoundCraft** (Pro Tools). They share one superpower that most desktop apps don't have:
23
- **every menu item, slider and dialog is a command**, and the exact same commands can be driven
24
- from a headless CLI, a JSON control channel, or an MCP server. The apps were built for agents
25
- from day one.
21
+ **WordCraft** (Word), **DeckCraft** (PowerPoint), **GridCraft** (Excel), **CADCraft** (AutoCAD),
22
+ **SoundCraft** (Pro Tools) and **FigCraft** (Figma). They share one superpower that most desktop
23
+ apps don't have: **every menu item, slider and dialog is a command**, and the exact same commands
24
+ can be driven from a headless CLI, a JSON control channel, or an MCP server. The apps were built
25
+ for agents from day one.
26
26
 
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** — eight agent tools let any Harness session check the toolchain, run CLI commands,
31
- send control-channel commands to a running app, do bridged file operations, and consult a
32
- per-app capability catalog.
30
+ - **In chat** — nine agent tools let any Harness session check the toolchain, run CLI commands,
31
+ send control-channel commands to a running app, do bridged file operations, run delivery QC,
32
+ and consult a per-app capability catalog.
33
+ - **A bundled craft skill pack** — eleven skills (`artcraft-ops`, `artcraft-shot-language`,
34
+ `artcraft-edit-rhythm`, `artcraft-color-light`, `artcraft-sound-design`, `artcraft-motion-vfx`,
35
+ `artcraft-delivery-qc`, `artcraft-style-bible`, `artcraft-film-study`, `artcraft-batch-pipeline`,
36
+ `artcraft-multicam`) teach the agent *how* to drive the suite fluently, which effect to reach for,
37
+ how to design shot language, pacing, grade and sound, how to lock a consistent look across
38
+ episodes, how to break a film down into evidence, how to run batches, and how to cut multicam.
39
+ They ship inside the plugin and load on demand (English index: `skills/README.md`).
33
40
  - **In the browser** — a same-origin HTTP API (`/artcraft/api/*`) that any Harness web UI can call,
34
41
  no CORS, no keys. It was built for [无限画布 / infinite-canvas](../dsh-infinite_canvas/README.md),
35
42
  a node-based AI short-drama storyboard canvas, but any front end can use it.
36
43
  - **Paths belong to the caller** — this plugin is a bridge and owns no data directory. Files read
37
44
  or written go wherever the caller points: chat invocations default to the current conversation
38
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.
39
49
 
40
50
  A typical AI short-drama loop looks like this: generate storyboard frames with a model →
41
51
  batch color-grade and sharpen them in PhotoCraft → render an animated title in EffectCraft →
@@ -149,8 +159,10 @@ artcraft_cli { bin:"photocraft", args:["batch","--actions","demo/craft/grade.js
149
159
  | `artcraft_control` | One command over the JSON control channel of a *running* app (filmcraft 9876 / effectcraft 9877 / vectorcraft 7979 / lightcraft 7980, or pass `port`) |
150
160
  | `artcraft_fs` | Bridged file ops — list / stat / read / write / mkdir at caller-decided absolute paths |
151
161
  | `artcraft_discover` | Family install auto-discovery: fills missing paths, auto-corrects stale ones |
152
- | `artcraft_apps` | Capability catalog for all 12 apps: CLI subcommands, control ports, MCP, repo/docs links |
153
- | `artcraft_recipes` | Built-in expert recipes: 8 cross-app professional workflows |
162
+ | `artcraft_apps` | Capability catalog for all 13 apps: CLI subcommands, control ports, MCP, repo/docs links, plus measured command-family stats |
163
+ | `artcraft_qc` | Delivery QC: family probe + platform-spec checks returning ok/warn/fail/manual with fix commands (video/audio/image/pdf/doc/sheet/deck/fig/cad) |
164
+ | `artcraft_live` | Control-channel liveness: which apps are running right now (ready for live tuning) |
165
+ | `artcraft_recipes` | Built-in expert recipes (8 workflows) **and 14 task→skill→command chains** (short-drama episode, script→storyboard, RAW batch, film study, audio post, composite shot, design system, document delivery, batch vertical reframe, cover/thumbnail pack, multilingual subtitles, cleanup/restore, social pack, long-form clips) |
154
166
  | `artcraft_update` | The plugin's own update (check / apply) |
155
167
 
156
168
  ## Driving it from the browser
@@ -184,7 +196,10 @@ Full route list:
184
196
  | `GET /artcraft/api/file?path=…` | Download a file — streamed, up to 2 GB |
185
197
  | `POST /artcraft/api/job` · `GET ?id=…` · `POST /artcraft/api/job/cancel` | Job lifecycle with output statting and tail logs |
186
198
  | `POST /artcraft/api/control` | Synchronous control-channel call (`app` or `port`) |
187
- | `GET /artcraft/api/apps[?id=…]` | Family capability catalog (12 apps) |
199
+ | `GET /artcraft/api/apps[?id=…]` | Family capability catalog (13 apps + command-family stats) |
200
+ | `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) |
202
+ | `GET /artcraft/api/live[?ports=app:port,…]` | Control-channel liveness (which apps are running) |
188
203
  | `POST /artcraft/api/discover` | Family install discovery + config self-repair |
189
204
  | `GET /artcraft/api/update/check` · `POST /artcraft/api/update/apply` | The plugin's own update |
190
205
 
@@ -240,6 +255,16 @@ The two plugins are decoupled — they meet only on HTTP and the disk layout. Th
240
255
  If you're building a similar front end, mirror that contract: project slug as folder name, keep
241
256
  the `media · craft · out` triad, and everything composes.
242
257
 
258
+ **Endpoints a front end can use directly:**
259
+
260
+ | Endpoint | Use it for |
261
+ |---|---|
262
+ | `GET /artcraft/api/apps` | 13-app capability catalog + command-family stats (a "capabilities" panel) |
263
+ | `GET /artcraft/api/skills` | The 11 bundled skills with their reference files (a "skills" section) |
264
+ | `GET /artcraft/api/live` | Control-channel liveness (live tuning vs headless runs) |
265
+ | `GET /artcraft/api/qc?path=…&platform=…` | Artefact QC — chain it right after an export and show a PASS/WARN badge; on failure surface `checks[].fix` verbatim |
266
+ | `POST /artcraft/api/job` + `GET ?id=` | Long-job lifecycle (render/export/batch) |
267
+
243
268
  ## Recipes
244
269
 
245
270
  **Uniform grading across storyboard frames** — `demo/craft/grade.json`:
@@ -283,7 +308,7 @@ a web UI.
283
308
 
284
309
  The HTTP surface has **no authentication** and rides on the Harness web server, which listens on
285
310
  loopback only — treat the port as trusted-local and don't expose it to a network; put a reverse
286
- proxy with auth in front if you must. Child processes are locked to the twelve allow-listed
311
+ proxy with auth in front if you must. Child processes are locked to the thirteen allow-listed
287
312
  family CLIs; the control channel only ever dials `127.0.0.1`.
288
313
 
289
314
  ## Publishing
package/README.zh-CN.md CHANGED
@@ -15,18 +15,24 @@
15
15
  ## 为什么做这个
16
16
 
17
17
  [ArtCraft](https://getartcraft.com/apps) 是一套用纯 Rust 从零重写的免费公平源代码(fair source)
18
- Adobe 对标工具,共 **12 个应用**:**PhotoCraft**(Photoshop)、**VectorCraft**(Illustrator)、
18
+ Adobe 对标工具,共 **13 个应用**:**PhotoCraft**(Photoshop)、**VectorCraft**(Illustrator)、
19
19
  **FilmCraft**(Premiere Pro)、**LightCraft**(Lightroom)、**PdfCraft**(Acrobat)、
20
20
  **EffectCraft**(After Effects)、**DesignCraft**(InDesign)、**WordCraft**(Word)、
21
21
  **DeckCraft**(PowerPoint)、**GridCraft**(Excel)、**CADCraft**(AutoCAD)、**SoundCraft**
22
- (Pro Tools)。它们有一个大多数桌面软件都不具备的共同基因:**每个菜单项、滑块、对话框都是一条
23
- 命令**,而同一套命令既能从无头 CLI 调用,也能走 JSON 控制通道或 MCP——这些 App 从第一天起
24
- 就是为 agent 设计的。
22
+ (Pro Tools)、**FigCraft**(Figma)。它们有一个大多数桌面软件都不具备的共同基因:**每个菜单项、
23
+ 滑块、对话框都是一条命令**,而同一套命令既能从无头 CLI 调用,也能走 JSON 控制通道或 MCP——
24
+ 这些 App 从第一天起就是为 agent 设计的。
25
25
 
26
26
  本插件把这套自动化面接进 DeepSeek Harness,让 AI 不只是"谈论"这些软件,而是真的**操作**它们:
27
27
 
28
- - **对话里** —— 八个 Agent 工具,任何 Harness 会话都能检查工具链、执行 CLI 命令、向运行中的
29
- App 发控制通道命令、做桥接文件操作、查每个应用的能力目录。
28
+ - **对话里** —— 九个 Agent 工具,任何 Harness 会话都能检查工具链、执行 CLI 命令、向运行中的
29
+ App 发控制通道命令、做桥接文件操作、跑交付质检、查每个应用的能力目录。
30
+ - **随插件分发的技能包** —— 十一个技能(`artcraft-ops`、`artcraft-shot-language`、
31
+ `artcraft-edit-rhythm`、`artcraft-color-light`、`artcraft-sound-design`、`artcraft-motion-vfx`、
32
+ `artcraft-delivery-qc`、`artcraft-style-bible`、`artcraft-film-study`、`artcraft-batch-pipeline`、
33
+ `artcraft-multicam`)教 agent 怎么调得顺、什么时候用哪种效果、镜头语言与节奏怎么设计、
34
+ 影调/声音/交付怎么把关、跨集一致性怎么锁、怎么把一部片拆成可回溯的证据、怎么做批量流水线、
35
+ 怎么剪多机位。随包内置、按需加载(英文索引见 `skills/README.md`)。
30
36
  - **浏览器里** —— 同源 HTTP API(`/artcraft/api/*`),任何 Harness 前端都能直接调用:无 CORS、
31
37
  无密钥。它为 [无限画布 / infinite-canvas](../dsh-infinite_canvas/README.md)(节点式 AI 短剧
32
38
  分镜画布)而建,但任何前端都可用。
@@ -136,8 +142,10 @@ artcraft_cli { bin:"photocraft", args:["batch","--actions","demo/craft/grade.js
136
142
  | `artcraft_control` | 向**运行中**的 App 控制通道发一条命令(filmcraft 9876 / effectcraft 9877 / vectorcraft 7979 / lightcraft 7980,或 port 直连) |
137
143
  | `artcraft_fs` | 桥接文件操作 —— list / stat / 读 / 写 / 建目录,路径由调用方绝对指定 |
138
144
  | `artcraft_discover` | 家族安装自动探测:填充缺失路径、自动纠正失效路径 |
139
- | `artcraft_apps` | 12 应用能力目录:每个应用的 CLI 子命令、控制端口、MCP、仓库/文档链接 |
140
- | `artcraft_recipes` | 内置专家处理方案:8 套跨应用专业工作流配方 |
145
+ | `artcraft_apps` | 13 应用能力目录:每个应用的 CLI 子命令、控制端口、MCP、仓库/文档链接 + 实测命令族统计 |
146
+ | `artcraft_qc` | 交付质检:家族探针 + 平台规格核对,返回 ok/warn/fail/manual 与修复命令(video/audio/image/pdf/doc/sheet/deck/fig/cad) |
147
+ | `artcraft_live` | 控制通道活性探测:哪些 App 正开着(可直接"边看边调") |
148
+ | `artcraft_recipes` | 内置专家配方(8 套)**与 14 条「任务→技能→命令链」编排**(短剧成片、剧本到分镜、RAW 冲洗、拉片分析、音频后期、合成镜头、设计系统、文档交付、批量横转竖、封面包装、多语言字幕、素材清理修复、社交分包、长素材切片) |
141
149
  | `artcraft_update` | 插件自身更新(检查 / 应用) |
142
150
 
143
151
  ## 在浏览器里驱动
@@ -170,7 +178,10 @@ POST /artcraft/api/job/cancel { "id":"7f2c…" }
170
178
  | `GET /artcraft/api/file?path=…` | 下载文件 —— 流式,上限 2 GB |
171
179
  | `POST /artcraft/api/job` · `GET ?id=…` · `POST /artcraft/api/job/cancel` | 任务生命周期,含产物探测与日志尾部 |
172
180
  | `POST /artcraft/api/control` | 控制通道同步调用(`app` 或 `port`) |
173
- | `GET /artcraft/api/apps[?id=…]` | 家族能力目录(12 应用) |
181
+ | `GET /artcraft/api/apps[?id=…]` | 家族能力目录(13 应用 + 命令族统计) |
182
+ | `GET /artcraft/api/qc?path=…[&platform=…][&kind=…]` | 交付质检:平台规格核对 + 修复建议 |
183
+ | `GET /artcraft/api/skills` | 内置技能包清单(11 技能 + 各自参考文件) |
184
+ | `GET /artcraft/api/live[?ports=app:port,…]` | 控制通道活性(哪些 App 正开着) |
174
185
  | `POST /artcraft/api/discover` | 家族安装探测 + 配置自动修复 |
175
186
  | `GET /artcraft/api/update/check` · `POST /artcraft/api/update/apply` | 插件自更新 |
176
187
 
@@ -222,6 +233,18 @@ EffectCraft 同族协议,端口默认 9877;VectorCraft 默认 7979、LightCr
222
233
  如果你要做类似的前端,照此契约即可:项目名作文件夹名、保持 `media · craft · out` 三件套,
223
234
  一切自然组合。
224
235
 
236
+ **前端可直接用的新端点**(画布/自建 UI 都能调):
237
+
238
+ | 端点 | 用途 |
239
+ |---|---|
240
+ | `GET /artcraft/api/apps` | 13 应用能力目录 + 命令族统计(做"能力面板") |
241
+ | `GET /artcraft/api/skills` | 内置 11 个技能清单(做"技能"区块) |
242
+ | `GET /artcraft/api/live` | 控制通道活性(哪些 App 正开着,决定"实时调"还是"无头跑") |
243
+ | `GET /artcraft/api/qc?path=…&platform=…` | 产物质检(交付前自动把规格核对挂在导出流程后) |
244
+ | `POST /artcraft/api/job` + `GET ?id=` | 长任务生命周期(渲染/导出/批处理) |
245
+
246
+ 建议的前端流程:导出完成 → 调 `/api/qc` 展示 PASS/WARN 徽标 → 不通过时把 `checks[].fix` 直接展示给用户。
247
+
225
248
  ## 常用配方
226
249
 
227
250
  **分镜图统一调色** —— `demo/craft/grade.json`:
@@ -262,7 +285,7 @@ NVENC 硬编)、ProRes、DNxHR,附 EBU R128 响度归一与字幕烧录。
262
285
  ## 安全与信任模型
263
286
 
264
287
  HTTP 面无鉴权,挂在 Harness Web 服务之下(仅回环监听)—— 把端口当本机可信处理,**不要暴露
265
- 到网络**;确需远程请加带鉴权的反向代理。子进程锁定 12 个白名单家族 CLI;控制通道只会拨
288
+ 到网络**;确需远程请加带鉴权的反向代理。子进程锁定 13 个白名单家族 CLI;控制通道只会拨
266
289
  `127.0.0.1`。
267
290
 
268
291
  ## 发布
package/apps/catalog.json CHANGED
@@ -288,6 +288,58 @@
288
288
  { "name": "plugins", "usage": "plugins", "summary": "内置插件清单" },
289
289
  { "name": "mcp", "usage": "mcp [--connect PORT] [--demo]", "summary": "stdio MCP" }
290
290
  ]
291
+ },
292
+ {
293
+ "id": "figcraft",
294
+ "name": "FigCraft",
295
+ "tagline": "界面设计与原型",
296
+ "ref": "Figma",
297
+ "stage": "in development",
298
+ "repo": "https://github.com/storytold/figcraft",
299
+ "docs": "https://getartcraft.com/apps/figcraft",
300
+ "cli": "figcraft-cli",
301
+ "control": null,
302
+ "controlNote": "控制通道端口动态(mcp --attach PORT 桥接运行中的 app)",
303
+ "mcp": true,
304
+ "global": ["--no-system-fonts(或 FIGCRAFT_NO_SYSTEM_FONTS=1,只用内置字体,保证跨机渲染一致)"],
305
+ "subcommands": [
306
+ { "name": "info", "usage": "info <file> [--json]", "summary": "文件摘要(.figcraft / .json / .fig 尽力导入并列出未导入项 / SVG / 位图)" },
307
+ { "name": "export", "usage": "export <file> -o <out> [--format png|jpg|svg|webp|pdf|fig] [--scale N] [--page NAME] [--node ID|NAME] [--bleed LENGTH] [--crop-marks] [--bleed-marks] [--cmyk]", "summary": "导出:每个顶层 frame 一个文件,或用图像扩展名/--node 出单个;PDF 支持出血与印刷标记" },
308
+ { "name": "convert", "usage": "convert <in> <out>", "summary": "格式转换" },
309
+ { "name": "render", "usage": "render <file> -o <out.png> [--scale N] [--page NAME]", "summary": "渲染页面为 PNG" },
310
+ { "name": "run", "usage": "run <script.json|script.jsonl> [--in <file>] [--out <file>]", "summary": "无头执行命令脚本(每步一行 JSON 结果)" },
311
+ { "name": "commands", "usage": "commands [--json] [--filter TEXT]", "summary": "命令清单(552 条,含 params / shortcut / undoable)" },
312
+ { "name": "mcp", "usage": "mcp [--attach PORT]", "summary": "stdio MCP 服务器" },
313
+ { "name": "plugin publish", "usage": "plugin publish <folder> --server ws://host:port/[?key=KEY]", "summary": "向 figcraft-server 发布插件(密钥可走 FIGCRAFT_SERVER_KEY 环境变量)" },
314
+ { "name": "perf", "usage": "perf [--layers N[,N...]] [--instances N[,N...]]", "summary": "性能基准(图层/实例规模)" }
315
+ ],
316
+ "commandFamilies": [
317
+ { "name": "component", "count": 21, "note": "组件系统:create / createMultiple / combineVariants / addVariant / exposeInstance / makeSlot / detach / resetInstance / resetOverride / goToMain" },
318
+ { "name": "instance", "count": 8, "note": "实例:create / place / exposed / slotInsert / resetSlot / swap / swapAt / setProperties" },
319
+ { "name": "variable", "count": 18, "note": "变量:createCollection / addMode / setMode / renameMode / create / set / bind / update —— 主题、多语言、多尺寸差异" },
320
+ { "name": "style", "count": 10, "note": "样式:create / apply / bind / update / detach / duplicate / move / renameFolder(设计系统锁)" },
321
+ { "name": "proto", "count": 20, "note": "原型:interaction.add/set/clear/remove + flow.add/rename/remove + settings + present/preview/presentOptions" },
322
+ { "name": "codeConnect + devResource + inspect", "count": 13, "note": "Dev 交付:codeConnect.set/export/import、devResource.add/edit/list、inspect.code/readyForDev/componentCode" },
323
+ { "name": "annotation + measure + grid + layout", "count": 19, "note": "标注与版式:annotation.*(含分类)、measure.distances/padding、grid.add/remove/move、layout.add/remove/suggest/setTrack" }
324
+ ]
325
+ }
326
+ ],
327
+ "capabilityStats": {
328
+ "note": "2026-10 实测:本机 13 个成员 CLI 的命令注册表规模与主要命令族。JSON 注册表入口(filmcraft / effectcraft / photocraft / gridcraft / wordcraft / figcraft 用 commands --json)为精确条目数,其余为 id 扫描值(近似)。用 artcraft_cli 跑 commands 可随时复核。",
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"] },
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"] }
291
343
  }
292
- ]
344
+ }
293
345
  }
@@ -11,10 +11,13 @@
11
11
  "deckcraft": "C:/Program Files/DeckCraft",
12
12
  "gridcraft": "C:/Program Files/GridCraft",
13
13
  "cadcraft": "C:/Program Files/CADCraft",
14
- "soundcraft": "C:/Program Files/SoundCraft"
14
+ "soundcraft": "C:/Program Files/SoundCraft",
15
+ "figcraft": "C:/Program Files/FigCraft"
15
16
  },
16
17
  "control": {
17
18
  "filmcraft": 9876,
18
- "effectcraft": 9877
19
+ "effectcraft": 9877,
20
+ "vectorcraft": 7979,
21
+ "lightcraft": 7980
19
22
  }
20
23
  }
package/client.js CHANGED
@@ -15,7 +15,7 @@ window.__ModuleLoader__.load({
15
15
 
16
16
  const NS = 'artcraft';
17
17
  const API = '/artcraft/api';
18
- const LABELS = { photocraft: 'PhotoCraft', vectorcraft: 'VectorCraft', filmcraft: 'FilmCraft', lightcraft: 'LightCraft', pdfcraft: 'PdfCraft', effectcraft: 'EffectCraft', designcraft: 'DesignCraft', wordcraft: 'WordCraft', deckcraft: 'DeckCraft', gridcraft: 'GridCraft', cadcraft: 'CADCraft', soundcraft: 'SoundCraft' };
18
+ const LABELS = { photocraft: 'PhotoCraft', vectorcraft: 'VectorCraft', filmcraft: 'FilmCraft', lightcraft: 'LightCraft', pdfcraft: 'PdfCraft', effectcraft: 'EffectCraft', designcraft: 'DesignCraft', wordcraft: 'WordCraft', deckcraft: 'DeckCraft', gridcraft: 'GridCraft', cadcraft: 'CADCraft', soundcraft: 'SoundCraft', figcraft: 'FigCraft' };
19
19
 
20
20
  const CSS = `
21
21
  .dshac-card { border: 1px solid var(--dsw-border-primary, rgba(128,128,128,.35)); border-radius: 10px; padding: 12px; font-size: 13px; line-height: 1.5; }
@@ -58,6 +58,7 @@ window.__ModuleLoader__.load({
58
58
  const [busy, setBusy] = useState('');
59
59
  const [out, setOut] = useState('');
60
60
  const [done, setDone] = useState(false);
61
+ const [skills, setSkills] = useState(null);
61
62
  const alive = useRef(true);
62
63
  useEffect(() => () => { alive.current = false; }, []);
63
64
 
@@ -73,6 +74,11 @@ window.__ModuleLoader__.load({
73
74
  } catch { /* 旧版无此路由 → 静默跳过 */ }
74
75
  const s = await api('/status');
75
76
  if (alive.current) { setStatus(s); setStatusErr(null); }
77
+ // 技能包清单(旧版无此路由 → 静默跳过,不影响状态展示)
78
+ try {
79
+ const sk = await api('/skills');
80
+ if (alive.current) setSkills(sk);
81
+ } catch { /* 忽略 */ }
76
82
  } catch (e) { if (alive.current) setStatusErr(String(e.message || e)); }
77
83
  finally { if (alive.current) setBusy(''); }
78
84
  }, []);
@@ -137,7 +143,10 @@ window.__ModuleLoader__.load({
137
143
  ? h('div', { className: 'dshac-muted' }, '未连接:' + statusErr + '(插件可能未注册或 Harness 需要重启)')
138
144
  : h('div', null, Object.keys(LABELS).map(binRow),
139
145
  status?.config?.path ? h('div', { className: 'dshac-row dshac-muted' },
140
- '配置目录:', h('span', { className: 'dshac-mono' }, status.config.path)) : null),
146
+ '配置目录:', h('span', { className: 'dshac-mono' }, status.config.path)) : null,
147
+ skills?.count ? h('div', { className: 'dshac-row dshac-muted' },
148
+ '技能包:', h('span', { className: 'dshac-mono' }, skills.count + ' 个'), '(' +
149
+ skills.skills.map((s) => s.name.replace(/^artcraft-/, '')).join(' · ') + ')') : null),
141
150
  h('div', { className: 'dshac-row', style: { marginTop: '10px' } },
142
151
  h('span', { className: 'dshac-muted' },
143
152
  '当前 v' + (status?.version ?? upd?.current ?? '?') +
package/cordis.patch.yml CHANGED
@@ -2,3 +2,7 @@
2
2
  - id: artcraft
3
3
  name: '@ninkch/dsh-artcraft'
4
4
  config: {}
5
+ # 技能提供者单独一行:只依赖 skills 服务,缺失时不影响上面的工具与 HTTP API
6
+ - id: artcraft-skills
7
+ name: '@ninkch/dsh-artcraft/skills'
8
+ config: {}