@ninkch/dsh-artcraft 0.3.1 → 0.3.3
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 +158 -0
- package/NOTICE.md +4 -69
- package/README.md +11 -29
- package/README.zh-CN.md +7 -19
- package/apps/catalog.json +14 -14
- package/artcraft.config.json.example +2 -2
- package/client.js +26 -0
- package/index.js +11 -6
- package/package.json +5 -1
- package/skills/README.md +2 -1
- package/skills/artcraft-color-light/SKILL.md +3 -1
- package/skills/artcraft-delivery-qc/references/platform-specs.md +5 -2
- package/skills/artcraft-director-lens/SKILL.md +79 -0
- package/skills/artcraft-director-lens/references/director-styles/01_spielberg.md +81 -0
- package/skills/artcraft-director-lens/references/director-styles/02_hitchcock.md +81 -0
- package/skills/artcraft-director-lens/references/director-styles/03_kubrick.md +81 -0
- package/skills/artcraft-director-lens/references/director-styles/04_kurosawa.md +81 -0
- package/skills/artcraft-director-lens/references/director-styles/05_scorsese.md +81 -0
- package/skills/artcraft-director-lens/references/director-styles/06_fellini.md +81 -0
- package/skills/artcraft-director-lens/references/director-styles/07_bergman.md +81 -0
- package/skills/artcraft-director-lens/references/director-styles/08_tarkovsky.md +81 -0
- package/skills/artcraft-director-lens/references/director-styles/09_wong_kar_wai.md +81 -0
- package/skills/artcraft-director-lens/references/director-styles/10_nolan.md +81 -0
- package/skills/artcraft-director-lens/references/director-styles/11_villeneuve.md +81 -0
- package/skills/artcraft-director-lens/references/director-styles/12_fincher.md +81 -0
- package/skills/artcraft-director-lens/references/director-styles/13_refn.md +81 -0
- package/skills/artcraft-director-lens/references/director-styles/14_bi_gan.md +81 -0
- package/skills/artcraft-director-lens/references/director-styles/15_zhang_yimou.md +81 -0
- package/skills/artcraft-director-lens/references/director-styles/16_hou_hsiao_hsien.md +81 -0
- package/skills/artcraft-director-lens/references/director-styles/17_park_chan_wook.md +81 -0
- package/skills/artcraft-director-lens/references/director-styles/18_malick.md +81 -0
- package/skills/artcraft-director-lens/references/director-styles/19_michael_mann.md +81 -0
- package/skills/artcraft-director-lens/references/director-styles/20_coen_brothers.md +81 -0
- package/skills/artcraft-motion-vfx/SKILL.md +1 -1
- package/skills/artcraft-motion-vfx/references/scene-to-effect.md +1 -1
- package/skills/artcraft-ops/references/command-families.md +25 -25
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/NOTICE.md
CHANGED
|
@@ -1,72 +1,7 @@
|
|
|
1
1
|
# Third-party notices
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
- **ArtCraft family apps** (getartcraft.com, built by the ArtCraft team): this plugin ships none
|
|
4
|
+
of their code — it drives the apps through their public automation surfaces (headless CLI +
|
|
5
|
+
JSON control channel). The apps' own license terms apply to the apps themselves.
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
**ArtCraft License (WIP)** — a "fair source" license. The text below is reproduced **verbatim** as
|
|
7
|
-
published by the project (~ Brandon Thomas). This plugin contains **no ArtCraft code**; it only
|
|
8
|
-
drives the apps' public automation surfaces (headless CLI + JSON control channel).
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## ArtCraft License (WIP)
|
|
13
|
-
|
|
14
|
-
(Warning: This isn't a real lawyery license full of legitimate legalese yet, but we'll take care of that ASAP.)
|
|
15
|
-
|
|
16
|
-
ArtCraft is a form of "fair source" software. It's like free beer in that we give you the code, but there are a few small limitations on what you can do with it.
|
|
17
|
-
|
|
18
|
-
First, what you can do with ArtCraft:
|
|
19
|
-
|
|
20
|
-
You do not have to pay us to use ArtCraft. It's free.
|
|
21
|
-
|
|
22
|
-
You can back up, copy, modify, compile, and use the code for your own private personal purposes.
|
|
23
|
-
|
|
24
|
-
You can do anything you want with the media you create with ArtCraft. Generated assets are yours.
|
|
25
|
-
|
|
26
|
-
What you can't do with ArtCraft:
|
|
27
|
-
|
|
28
|
-
You cannot sell the ArtCraft software commercially (eg. as your own software).
|
|
29
|
-
|
|
30
|
-
You cannot use the ArtCraft code to develop a competing business or product (eg. selling AI image and video tools).
|
|
31
|
-
|
|
32
|
-
You cannot fork ArtCraft and remove ArtCraft community, donation links, or paid model services. We intend to make money to improve ArtCraft for everyone.
|
|
33
|
-
|
|
34
|
-
You cannot use the ArtCraft name, logo, or mascot characters to promote your business without permission.
|
|
35
|
-
|
|
36
|
-
This license means you can see what we're doing and not be at risk of having the rug pulled out from under you (eg. if our founders die, if our business collapses, if zombies or space aliens invade). It also gives you a really great way to customize the software or lend a hand in reporting (or even fixing) bugs.
|
|
37
|
-
|
|
38
|
-
Our desire is to support artists, designers, and filmmakers. We want to help you build your own creative studios and businesses. We want to give you creative software you can use forever.
|
|
39
|
-
|
|
40
|
-
ArtCraft is free. We do offer models available through us where you can pay us and support our development, but we also offer the ability for you to use other providers - and we'll keep adding more options so you have maximum flexibility.
|
|
41
|
-
|
|
42
|
-
### Our Promise
|
|
43
|
-
|
|
44
|
-
All development and business plans will be communicated openly with the community.
|
|
45
|
-
|
|
46
|
-
Except for minor test scripts or a few small places where we might need to use licensed 3rd party code, all of our engineering efforts will live in a single publicly available monorepo. You can see everything we do and even benefit from using it for personal use. We plan on building a lot more than what you see today, and you'll get all of it.
|
|
47
|
-
|
|
48
|
-
We will not "rug pull" our users. If our business shuts down, gets acquired, or otherwise changes, the tools we create will always continue to function in the same way.
|
|
49
|
-
|
|
50
|
-
If the business ends and our founders quit working in this space, we'll make it so the software transitions to an OSI-approved open source license. (We don't intend to quit!)
|
|
51
|
-
|
|
52
|
-
### Why not OSI Open Source?
|
|
53
|
-
|
|
54
|
-
Philosophical answer: The OSI is an industry body led by hyperscalers. They poach from open source all the time, yet hyperscaler systems and code (AWS, GCP, YouTube, etc.) remain closed source. The tiniest nuggets are open, but the vast machinery surrounding it - systems, user behaviors, funnels, at-scale moneymakers - is totally closed.
|
|
55
|
-
|
|
56
|
-
Practical answer: OSI licenses make it exceptionally challenging to grow big things commercially. And many of the licenses leave room for hyperscalers to reach in and cherry-pick pieces for themselves that they can better commercialize than the original authors.
|
|
57
|
-
|
|
58
|
-
Then there's completely open source software that doesn't even attempt to be a business.
|
|
59
|
-
|
|
60
|
-
We love software like Blender, but (1) developing ArtCraft is our full-time job, (2) we want to build something at scale that is much bigger than what you presently see, and (3) this will eventually become much more capital intensive than just writing code - we want to train novel models that work directly in conjunction with the user interface.
|
|
61
|
-
|
|
62
|
-
If and when we do get to scale, we intend to keep every bit of our work in the open, including the models. Available for use, inspection, learning, fitting onto consumer GPU hardware, and more.
|
|
63
|
-
|
|
64
|
-
Not having a way to make money is unfortunately what killed Stability.ai. Stability.ai walked so that others could eventually run. (Black Forest Labs, et al.) We're not egotistical enough to count ourselves in that party yet, but we believe in the original Stability.ai ethos and that their model can work with a few tweaks.
|
|
65
|
-
|
|
66
|
-
We want to build big and incredible tools the world hasn't seen before. We want to keep them free and entirely source available. You don't have to pay us, but if you do, all of your investment goes right back into the engineering and the tools. We're writing code you can clone and keep.
|
|
67
|
-
|
|
68
|
-
### Inspiration
|
|
69
|
-
|
|
70
|
-
We took inspiration for this from Fair Source, Fair Code, the Defold License, and Hacker News discussions. The folks at Obsidian have some pretty good thoughts on this as well.
|
|
71
|
-
|
|
72
|
-
~ Brandon Thomas
|
|
7
|
+
This repository itself is **Apache-2.0** — see [LICENSE](LICENSE).
|
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** —
|
|
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.
|
|
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
|
|
131
|
-
"filmcraft": "C:/craft
|
|
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
|
|
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
|
|
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 (
|
|
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
|
-
|
|
336
|
-
ArtCraft apps' code
|
|
337
|
-
|
|
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
|
-
- **对话里** ——
|
|
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.
|
|
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
|
|
116
|
-
"filmcraft": "C:/craft
|
|
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
|
-
|
|
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` | 工具体检:
|
|
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 家族
|
|
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
|
|
328
|
+
"note": "2026-10-25 实测(家族全量更新后:photocraft 0.15.1 / vectorcraft 0.16.0 / filmcraft 0.12.0 / lightcraft 0.13.0 / pdfcraft 0.13.0 / effectcraft 0.16.0 / designcraft 0.12.0 / wordcraft 0.10.0 / deckcraft 0.10.0 / gridcraft 0.11.1 / cadcraft 0.12.0 / soundcraft 0.12.1 / figcraft 0.10.0)。JSON 注册表入口(filmcraft / effectcraft / photocraft / gridcraft / wordcraft / figcraft 用 commands --json)为精确条目数,其余为 id 扫描值(近似)。用 artcraft_cli 跑 commands 可随时复核。",
|
|
329
329
|
"apps": {
|
|
330
|
-
"photocraft": { "commands":
|
|
331
|
-
"vectorcraft": { "commands":
|
|
330
|
+
"photocraft": { "commands": 935, "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", "slice 6", "select.refineEdge(0.15 参数化选择与遮罩)"] },
|
|
331
|
+
"vectorcraft": { "commands": 404, "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":
|
|
334
|
-
"pdfcraft": { "commands":
|
|
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":
|
|
337
|
-
"wordcraft": { "commands":
|
|
338
|
-
"deckcraft": { "commands":
|
|
339
|
-
"gridcraft": { "commands":
|
|
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":
|
|
342
|
-
"figcraft": { "commands":
|
|
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": 79, "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": 311, "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": 638, "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": 346, "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": "
|
|
3
|
+
"photocraft": "C:/craft/<PhotoCraft portable folder>",
|
|
4
4
|
"vectorcraft": "C:/Program Files/VectorCraft",
|
|
5
|
-
"filmcraft": "
|
|
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.
|
|
58
|
+
const VERSION = '0.3.3';
|
|
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
|
-
|
|
187
|
-
|
|
188
|
-
|
|
186
|
+
if (!path.isAbsolute(s)) {
|
|
187
|
+
throw new Error(
|
|
188
|
+
`需要绝对路径,收到相对路径 "${s}" —— 本插件不持有数据目录,不会按进程 cwd 解析;`
|
|
189
|
+
+ '请改传绝对 path=<绝对路径>,或用 base=<绝对目录> + rel=<相对路径>。',
|
|
190
|
+
);
|
|
189
191
|
}
|
|
190
|
-
return
|
|
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.
|
|
3
|
+
"version": "0.3.3",
|
|
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"
|
package/skills/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ArtCraft craft skill pack (bundled with @ninkch/dsh-artcraft)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Twelve skills ship inside this plugin. They are registered through the plugin's own skill
|
|
4
4
|
provider (`@ninkch/dsh-artcraft/skills`) and load on demand — you never install them separately.
|
|
5
5
|
|
|
6
6
|
Skill bodies are written in Chinese (the maintainer's language and the language of the rest of the
|
|
@@ -20,6 +20,7 @@ so you know which skill to open.
|
|
|
20
20
|
| `artcraft-film-study` | Shot-by-shot film study: 8-step method, shot-table schema, emotion-score criteria, traceable conclusions, report template | Analysing an existing film (review/research) |
|
|
21
21
|
| `artcraft-batch-pipeline` | Batch and pipeline work: headless batch formats, HTTP job queue, in-app queues, proxies and cache, media health/relink, incremental and resumable runs, retries, QC hook-up | Dozens/hundreds of files, a whole season |
|
|
22
22
|
| `artcraft-multicam` | Multicam: build sources, align, grid browsing, `selectCamera*` vs `cutToCamera*`, live switching, audio-follows-video, cross-camera matching, switching rhythm | Interviews, concerts, live cuts |
|
|
23
|
+
| `artcraft-director-lens` | 20 director lenses (Spielberg…Wong Kar-wai, Zhang Yimou, Bi Gan…): each maps a director's working method to ArtCraft parameters — ASL targets, transition bias, light ratio, palette→mixer channels, sound rules, QC hooks. | "Cut/grade this like <director>", style bible references a lens |
|
|
23
24
|
|
|
24
25
|
## Reference files (loaded with a skill)
|
|
25
26
|
|
|
@@ -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
|
| 手法 | 何时用 | 落点 |
|