@gitruck/cli 1.3.10 → 1.3.12
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/AGENT.md +52 -3
- package/CHANGELOG.md +47 -0
- package/README.en.md +10 -2
- package/README.md +10 -2
- package/assets/composite-kit/kit.js +36 -7
- package/assets/composite-kit/stage.html +23 -2
- package/dist/index.js +354 -338
- package/docs/reference.en.md +86 -13
- package/docs/reference.md +87 -15
- package/package.json +79 -79
- package/skills/gtrk-ai-drama/SKILL.md +19 -15
- package/skills/gtrk-ai-drama/scripts/validate-storyboard.mjs +4 -0
- package/skills/gtrk-composite/SKILL.md +11 -6
- package/skills/gtrk-cover/SKILL.md +18 -13
- package/skills/gtrk-cover/references/workbench-guide.md +4 -3
- package/skills/gtrk-matrix/SKILL.md +90 -9
- package/skills/gtrk-mg/SKILL.md +404 -406
- package/skills/gtrk-music-visualizer/SKILL.md +8 -4
- package/skills/gtrk-oralcut/SKILL.md +9 -8
- package/skills/gtrk-ref-reading/SKILL.md +5 -0
- package/skills/gtrk-splitter/SKILL.md +313 -311
- package/skills/gtrk-style-maker/SKILL.md +13 -0
- package/skills/gtrk-style-maker/references/craft-output-spec.md +2 -0
- package/skills/gtrk-tools/SKILL.md +5 -1
- package/skills/gtrk-transcript/SKILL.md +8 -4
package/package.json
CHANGED
|
@@ -1,79 +1,79 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@gitruck/cli",
|
|
3
|
-
"version": "1.3.
|
|
4
|
-
"description": "同合云成片流水线 CLI —— agent 驱动云端任务、产物拉回本地、三方工程文件(客户端/剪映/PR)互通。",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"author": "Gitruck (同合云)",
|
|
7
|
-
"repository": {
|
|
8
|
-
"type": "git",
|
|
9
|
-
"url": "git+https://github.com/Gitruck/cli.git"
|
|
10
|
-
},
|
|
11
|
-
"homepage": "https://github.com/Gitruck/cli#readme",
|
|
12
|
-
"bugs": {
|
|
13
|
-
"url": "https://github.com/Gitruck/cli/issues"
|
|
14
|
-
},
|
|
15
|
-
"type": "module",
|
|
16
|
-
"bin": {
|
|
17
|
-
"gtrk": "dist/index.js"
|
|
18
|
-
},
|
|
19
|
-
"files": [
|
|
20
|
-
"dist",
|
|
21
|
-
"assets",
|
|
22
|
-
"skills",
|
|
23
|
-
"contracts",
|
|
24
|
-
"AGENT.md",
|
|
25
|
-
"README.md",
|
|
26
|
-
"README.en.md",
|
|
27
|
-
"docs/reference.md",
|
|
28
|
-
"docs/reference.en.md",
|
|
29
|
-
"docs/workflow.md",
|
|
30
|
-
"docs/workflow.en.md",
|
|
31
|
-
"docs/development.md",
|
|
32
|
-
"docs/development.en.md",
|
|
33
|
-
"LICENSE",
|
|
34
|
-
"CHANGELOG.md"
|
|
35
|
-
],
|
|
36
|
-
"engines": {
|
|
37
|
-
"node": ">=20.6"
|
|
38
|
-
},
|
|
39
|
-
"publishConfig": {
|
|
40
|
-
"access": "public",
|
|
41
|
-
"registry": "https://registry.npmjs.org/"
|
|
42
|
-
},
|
|
43
|
-
"keywords": [
|
|
44
|
-
"gitruck",
|
|
45
|
-
"同合云",
|
|
46
|
-
"video",
|
|
47
|
-
"oral-cut",
|
|
48
|
-
"口播剪辑",
|
|
49
|
-
"cli",
|
|
50
|
-
"jianying",
|
|
51
|
-
"剪映",
|
|
52
|
-
"agent"
|
|
53
|
-
],
|
|
54
|
-
"scripts": {
|
|
55
|
-
"gtrk": "bun run src/index.ts",
|
|
56
|
-
"test:purify": "esbuild src/commands/purify.ts --bundle --platform=node --format=esm --external:bun:sqlite --outfile=.test-build/purify-cmd.mjs && node --test test/purify-cmd.test.mjs",
|
|
57
|
-
"build": "bun build ./src/index.ts --target=node --minify --outfile dist/index.js",
|
|
58
|
-
"typecheck": "tsc --noEmit",
|
|
59
|
-
"prepublishOnly": "node scripts/plugin-manifest-check.mjs && npm run typecheck && npm test && bun run build",
|
|
60
|
-
"test": "node scripts/workspace-pollution-gate.mjs --snapshot && esbuild src/lib/compliance-notice.ts src/lib/config.ts src/lib/crash-report.ts src/lib/usage-analytics.ts src/lib/log.ts src/lib/read-json.ts src/lib/sidecar-write.ts src/lib/user-config.ts src/lib/enum-catalog.ts src/lib/first-run-tutorial.ts src/lib/desktop-client-hint.ts src/lib/command-path.ts src/lib/user-path.ts src/lib/runtime-channel.ts src/lib/self-install.ts src/lib/chunk-upload.ts src/lib/upload-cache.ts src/lib/upload-submit.ts src/lib/render.ts src/lib/cloud.ts src/lib/materialize.ts src/lib/jianying.ts src/lib/clip-brief.ts src/lib/media.ts src/lib/projection.ts src/lib/reproject.ts src/lib/splitdoc.ts src/lib/gtrk-writeback.ts src/lib/project-background.ts src/lib/client-only-state.ts src/lib/gtrk-patch.ts src/lib/frame-domain.ts src/lib/clock-adapter.ts src/lib/gtrk-invariants.ts src/lib/clip-speed.ts src/lib/clip-keyframes.ts src/lib/column-config.ts src/lib/third-party-catalog.ts src/lib/mg-adopt.ts src/lib/mg-registry.ts src/lib/matrix.ts src/lib/online-broll-client.ts src/lib/online-search-journal.ts src/lib/matrix-material.ts src/lib/matrix-fetch.ts src/lib/matrix-lay.ts src/lib/arrange-metering.ts src/lib/arrange-wire.ts src/lib/arrange-apply.ts src/lib/arrange-client.ts src/lib/arrange-gate.ts src/lib/arrange-decision-pin.ts src/lib/arrange-qc.ts src/lib/arrange-qc-bind.ts src/lib/rate-limit-wait.ts src/lib/embed-client.ts src/lib/describe.ts src/lib/highlight-rubric.ts src/lib/highlight-input.ts src/lib/local-index.ts src/lib/character-input.ts src/lib/index-decode.ts src/lib/local-search.ts src/lib/qc.ts src/lib/alignment-qc.ts src/lib/bgm-history.ts src/lib/image-move.ts src/lib/cloud-render-guard.ts src/lib/outdir-guard.ts src/lib/landing-wait.ts src/lib/material-integrity.ts src/lib/project-health.ts src/lib/contact-sheet.ts src/lib/media-transcript.ts src/lib/media-grid.ts src/lib/media-ffmpeg.ts src/lib/solid-png.ts src/lib/mask-raster.ts src/lib/mg-lint.ts src/lib/mg-visual-job.ts src/lib/mg-track-identity.ts src/lib/particle-identity.ts src/lib/text-ir/compile.ts src/lib/text-ir/validate.ts src/lib/text-ir/compile-local.ts src/lib/text-templates.ts src/lib/text-ir-client.ts src/lib/mg-lay.ts src/lib/mg-render.ts src/lib/particle-qtrle.ts src/lib/composite-particle.ts src/lib/composite-lay.ts src/lib/composite-lint.ts src/lib/composite-browser.ts src/lib/composite-plan.ts src/lib/composite-shots.ts src/lib/composite-resolve.ts src/lib/composite-profile.ts src/lib/composite-scene.ts src/lib/composite-bake-plan.ts src/lib/composite-bake.ts src/lib/composite-export.ts src/lib/tool-descriptors.ts src/lib/tool-runner.ts src/lib/tool-batch.ts src/lib/tool-pricing.ts src/lib/transcript.ts src/lib/runtime-assets.ts src/lib/subtitle-lay.ts src/lib/caption-align.ts src/lib/subtitle-line-split-client.ts src/lib/audio-align.ts src/lib/audio-tighten.ts src/lib/cut-snap.ts src/lib/mg-coverage.ts src/lib/ai-drama-lay.ts src/lib/ai-drama-pack.ts src/lib/desk-locate.ts src/lib/pip-lay.ts --bundle --platform=node --format=esm --external:bun:sqlite --outdir=.test-build --out-extension:.js=.mjs && esbuild src/lib/text-ir/compile.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/text-ir-compile.mjs && esbuild src/commands/split.ts --bundle --platform=node --external:bun:sqlite --format=esm --outdir=.test-build --out-extension:.js=.mjs && esbuild src/commands/patch.ts --bundle --platform=node --external:bun:sqlite --format=esm --external:commander --outfile=.test-build/patch-cmd.mjs && esbuild src/commands/matrix.ts --bundle --platform=node --format=esm --external:bun:sqlite --outfile=.test-build/matrix-cmd.mjs && esbuild src/commands/mg.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/mg-cmd.mjs && esbuild src/commands/mg-text.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/mg-text-cmd.mjs && esbuild src/commands/tool.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/tool-cmd.mjs && esbuild src/commands/transcript.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/transcript-cmd.mjs && esbuild src/commands/project.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/project-cmd.mjs && esbuild src/commands/audio.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/audio-cmd.mjs && esbuild src/commands/subtitle.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/subtitle-cmd.mjs && esbuild src/commands/ai-drama.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/ai-drama-cmd.mjs && esbuild src/commands/feedback.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/feedback-cmd.mjs && esbuild src/commands/music-visualizer.ts --bundle --platform=node --external:bun:sqlite --format=esm --external:commander --outfile=.test-build/music-visualizer-cmd.mjs && esbuild src/commands/long2short.ts --bundle --platform=node --external:bun:sqlite --format=esm --external:commander --outfile=.test-build/long2short-cmd.mjs && esbuild src/commands/oralcut.ts --bundle --platform=node --external:bun:sqlite --format=esm --external:commander --outfile=.test-build/oralcut-cmd.mjs && esbuild src/commands/oralcut-result.ts --bundle --platform=node --external:bun:sqlite --format=esm --external:commander --outfile=.test-build/oralcut-result-cmd.mjs && esbuild src/commands/skills.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/skills-cmd.mjs && esbuild src/commands/qc.ts --bundle --platform=node --format=esm --external:commander --external:bun:sqlite --outfile=.test-build/qc-cmd.mjs && esbuild src/commands/media.ts --bundle --platform=node --format=esm --external:commander --external:bun:sqlite --outfile=.test-build/media-cmd.mjs && esbuild src/commands/doctor.ts --bundle --platform=node --external:bun:sqlite --format=esm --external:commander --outfile=.test-build/doctor-cmd.mjs && esbuild src/lib/convert/ir_to_jsx.ts src/lib/convert/ir_to_am.ts src/lib/convert/ir_to_nv.ts src/lib/convert/am_parse.ts src/lib/convert/nv_parse.ts src/lib/convert/parse.ts src/lib/convert/download.ts src/lib/convert/bake_ops.ts --bundle --platform=node --external:bun:sqlite --format=esm --outdir=.test-build/convert --out-extension:.js=.mjs && esbuild src/lib/mad/selector.ts src/lib/mad/techniques.ts src/lib/mad/beat.ts src/lib/mad/scan.ts src/lib/mad/data.ts src/lib/mad/pool.ts src/lib/mad/cloud-beat.ts src/lib/mad/mad.ts --bundle --platform=node --external:bun:sqlite --format=esm --outdir=.test-build/mad --out-extension:.js=.mjs && esbuild src/commands/composite.ts --bundle --platform=node --format=esm --external:bun:sqlite --external:commander --outfile=.test-build/composite-cmd.mjs && esbuild src/commands/purify.ts --bundle --platform=node --format=esm --external:bun:sqlite --outfile=.test-build/purify-cmd.mjs && node --import ./test/helpers/test-home.mjs --test \"test/*.test.mjs\" && node scripts/workspace-pollution-gate.mjs --verify",
|
|
61
|
-
"test:linux": "node scripts/test-linux.mjs",
|
|
62
|
-
"openspec:gate": "node openspec/gate.mjs",
|
|
63
|
-
"mg-registry:snapshot": "node scripts/mg-registry-snapshot.mjs",
|
|
64
|
-
"text-template:snapshot": "node scripts/text-template-snapshot.mjs",
|
|
65
|
-
"text-ir:parity": "node scripts/text-ir-parity.mjs",
|
|
66
|
-
"text-ir:sync": "node scripts/text-ir-sync.mjs"
|
|
67
|
-
},
|
|
68
|
-
"devDependencies": {
|
|
69
|
-
"@xmldom/xmldom": "^0.9.6",
|
|
70
|
-
"bun-types": "^1.1.0",
|
|
71
|
-
"commander": "^12.1.0",
|
|
72
|
-
"esbuild": "^0.28.1",
|
|
73
|
-
"typescript": "^5.6.0"
|
|
74
|
-
},
|
|
75
|
-
"dependencies": {
|
|
76
|
-
"hash-wasm": "^4.12.0",
|
|
77
|
-
"jszip": "^3.10.1"
|
|
78
|
-
}
|
|
79
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@gitruck/cli",
|
|
3
|
+
"version": "1.3.12",
|
|
4
|
+
"description": "同合云成片流水线 CLI —— agent 驱动云端任务、产物拉回本地、三方工程文件(客户端/剪映/PR)互通。",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Gitruck (同合云)",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/Gitruck/cli.git"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/Gitruck/cli#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/Gitruck/cli/issues"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"bin": {
|
|
17
|
+
"gtrk": "dist/index.js"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"assets",
|
|
22
|
+
"skills",
|
|
23
|
+
"contracts",
|
|
24
|
+
"AGENT.md",
|
|
25
|
+
"README.md",
|
|
26
|
+
"README.en.md",
|
|
27
|
+
"docs/reference.md",
|
|
28
|
+
"docs/reference.en.md",
|
|
29
|
+
"docs/workflow.md",
|
|
30
|
+
"docs/workflow.en.md",
|
|
31
|
+
"docs/development.md",
|
|
32
|
+
"docs/development.en.md",
|
|
33
|
+
"LICENSE",
|
|
34
|
+
"CHANGELOG.md"
|
|
35
|
+
],
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=20.6"
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public",
|
|
41
|
+
"registry": "https://registry.npmjs.org/"
|
|
42
|
+
},
|
|
43
|
+
"keywords": [
|
|
44
|
+
"gitruck",
|
|
45
|
+
"同合云",
|
|
46
|
+
"video",
|
|
47
|
+
"oral-cut",
|
|
48
|
+
"口播剪辑",
|
|
49
|
+
"cli",
|
|
50
|
+
"jianying",
|
|
51
|
+
"剪映",
|
|
52
|
+
"agent"
|
|
53
|
+
],
|
|
54
|
+
"scripts": {
|
|
55
|
+
"gtrk": "bun run src/index.ts",
|
|
56
|
+
"test:purify": "esbuild src/commands/purify.ts --bundle --platform=node --format=esm --external:bun:sqlite --outfile=.test-build/purify-cmd.mjs && node --test test/purify-cmd.test.mjs",
|
|
57
|
+
"build": "bun build ./src/index.ts --target=node --minify --outfile dist/index.js",
|
|
58
|
+
"typecheck": "tsc --noEmit",
|
|
59
|
+
"prepublishOnly": "node scripts/plugin-manifest-check.mjs && npm run typecheck && npm test && bun run build",
|
|
60
|
+
"test": "node scripts/workspace-pollution-gate.mjs --snapshot && esbuild src/lib/compliance-notice.ts src/lib/config.ts src/lib/crash-report.ts src/lib/usage-analytics.ts src/lib/log.ts src/lib/read-json.ts src/lib/sidecar-write.ts src/lib/user-config.ts src/lib/enum-catalog.ts src/lib/first-run-tutorial.ts src/lib/desktop-client-hint.ts src/lib/command-path.ts src/lib/user-path.ts src/lib/runtime-channel.ts src/lib/self-install.ts src/lib/plugin-presence.ts src/lib/chunk-upload.ts src/lib/upload-cache.ts src/lib/upload-submit.ts src/lib/render.ts src/lib/cloud.ts src/lib/materialize.ts src/lib/jianying.ts src/lib/clip-brief.ts src/lib/media.ts src/lib/projection.ts src/lib/reproject.ts src/lib/splitdoc.ts src/lib/gtrk-writeback.ts src/lib/project-background.ts src/lib/client-only-state.ts src/lib/gtrk-patch.ts src/lib/frame-domain.ts src/lib/clock-adapter.ts src/lib/gtrk-invariants.ts src/lib/clip-speed.ts src/lib/clip-keyframes.ts src/lib/clip-audio-fade.ts src/lib/clip-transitions.ts src/lib/transition-catalog.ts src/lib/column-config.ts src/lib/third-party-catalog.ts src/lib/mg-adopt.ts src/lib/mg-registry.ts src/lib/matrix.ts src/lib/online-broll-client.ts src/lib/online-broll-contract.ts src/lib/online-broll-grant.ts src/lib/source-import.ts src/lib/online-search-journal.ts src/lib/matrix-material.ts src/lib/matrix-fetch.ts src/lib/matrix-lay.ts src/lib/matrix-status.ts src/lib/broll-landing.ts src/lib/patch-place.ts src/lib/arrange-metering.ts src/lib/arrange-wire.ts src/lib/arrange-apply.ts src/lib/arrange-client.ts src/lib/arrange-gate.ts src/lib/arrange-decision-pin.ts src/lib/arrange-qc.ts src/lib/arrange-qc-bind.ts src/lib/rate-limit-wait.ts src/lib/embed-client.ts src/lib/describe.ts src/lib/highlight-rubric.ts src/lib/highlight-input.ts src/lib/local-index.ts src/lib/character-input.ts src/lib/index-decode.ts src/lib/local-search.ts src/lib/qc.ts src/lib/alignment-qc.ts src/lib/bgm-history.ts src/lib/image-move.ts src/lib/cloud-render-guard.ts src/lib/outdir-guard.ts src/lib/landing-wait.ts src/lib/material-integrity.ts src/lib/project-health.ts src/lib/contact-sheet.ts src/lib/media-transcript.ts src/lib/media-grid.ts src/lib/media-ffmpeg.ts src/lib/solid-png.ts src/lib/mask-raster.ts src/lib/mg-lint.ts src/lib/mg-visual-job.ts src/lib/mg-track-identity.ts src/lib/particle-identity.ts src/lib/text-ir/compile.ts src/lib/text-ir/validate.ts src/lib/text-ir/compile-local.ts src/lib/text-templates.ts src/lib/text-ir-client.ts src/lib/mg-lay.ts src/lib/mg-render.ts src/lib/particle-qtrle.ts src/lib/composite-particle.ts src/lib/composite-lay.ts src/lib/composite-lint.ts src/lib/composite-browser.ts src/lib/composite-plan.ts src/lib/composite-shots.ts src/lib/composite-resolve.ts src/lib/composite-profile.ts src/lib/composite-scene.ts src/lib/composite-kit-upgrade.ts src/lib/composite-bake-plan.ts src/lib/composite-bake.ts src/lib/composite-export.ts src/lib/tool-descriptors.ts src/lib/tool-runner.ts src/lib/tool-batch.ts src/lib/tool-pricing.ts src/lib/transcript.ts src/lib/runtime-assets.ts src/lib/subtitle-lay.ts src/lib/caption-align.ts src/lib/subtitle-line-split-client.ts src/lib/audio-align.ts src/lib/audio-tighten.ts src/lib/cut-snap.ts src/lib/mg-coverage.ts src/lib/ai-drama-lay.ts src/lib/ai-drama-pack.ts src/lib/desk-locate.ts src/lib/pip-lay.ts src/lib/client-bridge.ts src/lib/client-state.ts src/lib/client-frame.ts --bundle --platform=node --format=esm --external:bun:sqlite --outdir=.test-build --out-extension:.js=.mjs && esbuild src/lib/text-ir/compile.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/text-ir-compile.mjs && esbuild src/commands/split.ts --bundle --platform=node --external:bun:sqlite --format=esm --outdir=.test-build --out-extension:.js=.mjs && esbuild src/commands/patch.ts --bundle --platform=node --external:bun:sqlite --format=esm --external:commander --outfile=.test-build/patch-cmd.mjs && esbuild src/commands/matrix.ts --bundle --platform=node --format=esm --external:bun:sqlite --outfile=.test-build/matrix-cmd.mjs && esbuild src/commands/mg.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/mg-cmd.mjs && esbuild src/commands/mg-text.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/mg-text-cmd.mjs && esbuild src/commands/tool.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/tool-cmd.mjs && esbuild src/commands/transcript.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/transcript-cmd.mjs && esbuild src/commands/project.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/project-cmd.mjs && esbuild src/commands/audio.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/audio-cmd.mjs && esbuild src/commands/subtitle.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/subtitle-cmd.mjs && esbuild src/commands/ai-drama.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/ai-drama-cmd.mjs && esbuild src/commands/feedback.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/feedback-cmd.mjs && esbuild src/commands/music-visualizer.ts --bundle --platform=node --external:bun:sqlite --format=esm --external:commander --outfile=.test-build/music-visualizer-cmd.mjs && esbuild src/commands/long2short.ts --bundle --platform=node --external:bun:sqlite --format=esm --external:commander --outfile=.test-build/long2short-cmd.mjs && esbuild src/commands/oralcut.ts --bundle --platform=node --external:bun:sqlite --format=esm --external:commander --outfile=.test-build/oralcut-cmd.mjs && esbuild src/commands/oralcut-result.ts --bundle --platform=node --external:bun:sqlite --format=esm --external:commander --outfile=.test-build/oralcut-result-cmd.mjs && esbuild src/commands/skills.ts --bundle --platform=node --external:bun:sqlite --format=esm --outfile=.test-build/skills-cmd.mjs && esbuild src/commands/qc.ts --bundle --platform=node --format=esm --external:commander --external:bun:sqlite --outfile=.test-build/qc-cmd.mjs && esbuild src/commands/media.ts --bundle --platform=node --format=esm --external:commander --external:bun:sqlite --outfile=.test-build/media-cmd.mjs && esbuild src/commands/client.ts --bundle --platform=node --format=esm --external:commander --external:bun:sqlite --outfile=.test-build/client-cmd.mjs && esbuild src/commands/doctor.ts --bundle --platform=node --external:bun:sqlite --format=esm --external:commander --outfile=.test-build/doctor-cmd.mjs && esbuild src/lib/convert/ir_to_jsx.ts src/lib/convert/ir_to_am.ts src/lib/convert/ir_to_nv.ts src/lib/convert/am_parse.ts src/lib/convert/nv_parse.ts src/lib/convert/parse.ts src/lib/convert/download.ts src/lib/convert/bake_ops.ts --bundle --platform=node --external:bun:sqlite --format=esm --outdir=.test-build/convert --out-extension:.js=.mjs && esbuild src/lib/mad/selector.ts src/lib/mad/techniques.ts src/lib/mad/beat.ts src/lib/mad/scan.ts src/lib/mad/data.ts src/lib/mad/pool.ts src/lib/mad/cloud-beat.ts src/lib/mad/mad.ts --bundle --platform=node --external:bun:sqlite --format=esm --outdir=.test-build/mad --out-extension:.js=.mjs && esbuild src/commands/composite.ts --bundle --platform=node --format=esm --external:bun:sqlite --external:commander --outfile=.test-build/composite-cmd.mjs && esbuild src/commands/cover.ts --bundle --platform=node --format=esm --external:bun:sqlite --external:commander --outfile=.test-build/cover-cmd.mjs && esbuild src/commands/purify.ts --bundle --platform=node --format=esm --external:bun:sqlite --outfile=.test-build/purify-cmd.mjs && esbuild src/lib/static-delivery/index.ts src/lib/static-delivery/node.ts --bundle --platform=node --format=esm --outdir=.test-build/static-delivery --out-extension:.js=.mjs && node --import ./test/helpers/test-home.mjs --test \"test/*.test.mjs\" && node scripts/workspace-pollution-gate.mjs --verify",
|
|
61
|
+
"test:linux": "node scripts/test-linux.mjs",
|
|
62
|
+
"openspec:gate": "node openspec/gate.mjs",
|
|
63
|
+
"mg-registry:snapshot": "node scripts/mg-registry-snapshot.mjs",
|
|
64
|
+
"text-template:snapshot": "node scripts/text-template-snapshot.mjs",
|
|
65
|
+
"text-ir:parity": "node scripts/text-ir-parity.mjs",
|
|
66
|
+
"text-ir:sync": "node scripts/text-ir-sync.mjs"
|
|
67
|
+
},
|
|
68
|
+
"devDependencies": {
|
|
69
|
+
"@xmldom/xmldom": "^0.9.6",
|
|
70
|
+
"bun-types": "^1.1.0",
|
|
71
|
+
"commander": "^12.1.0",
|
|
72
|
+
"esbuild": "^0.28.1",
|
|
73
|
+
"typescript": "^5.6.0"
|
|
74
|
+
},
|
|
75
|
+
"dependencies": {
|
|
76
|
+
"hash-wasm": "^4.12.0",
|
|
77
|
+
"jszip": "^3.10.1"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gtrk-ai-drama
|
|
3
|
-
description: AI
|
|
3
|
+
description: AI 情景动画分镜稿生成器——把派到 AI_DRAMA 车道的 beat 逐个写成四段描述(故事背景 / 角色 / 分镜 / 原文文稿)+ 视觉基调 + 时长预算,中英双版;默认兼容 gitruck-ai-drama-desk 解析器(落盘前 `gtrk ai-drama validate`),也可拿去任意外部管线出片,导出包用 `gtrk ai-drama lay` 回填独立 AI 轨。栏目视觉从 style.skills 里 produces==AI_DRAMA 的条目注入。当用户想「上 AI 情景动画 / 做 AI 分镜 / AI 动画描述 / 把这段做成 AI 视频 / 给这段配 AI 情景动画」时使用,别手搓。
|
|
4
|
+
metadata:
|
|
5
|
+
in_app_agent: true
|
|
4
6
|
---
|
|
5
7
|
|
|
6
|
-
# AI 情景动画分镜稿生成器(gtrk-ai-drama)
|
|
7
|
-
|
|
8
|
-
用户要求间隔取关键镜头、剩余由实况补齐时,先读 [稀疏关键场景与角色参考](references/sparse-key-scenes.md)。其短 beat 窗口、时基、逐镜参考和留空规则优先于下文针对连续 AI 段落的时长预算;不转入通篇 AI 图纸。
|
|
8
|
+
# AI 情景动画分镜稿生成器(gtrk-ai-drama)
|
|
9
|
+
|
|
10
|
+
用户要求间隔取关键镜头、剩余由实况补齐时,先读 [稀疏关键场景与角色参考](references/sparse-key-scenes.md)。其短 beat 窗口、时基、逐镜参考和留空规则优先于下文针对连续 AI 段落的时长预算;不转入通篇 AI 图纸。
|
|
9
11
|
|
|
10
12
|
把口播派单里分到 **`AI_DRAMA` 车道**的 beat,逐个拆成分镜、为每个 beat 产 **四段朴素描述 + 独立视觉基调 + 时长预算**(中英双版),落到 `<project>/ai-drama/<beat_id>.md`,再交棒 AI Drama Desk 或任意外部平台出片;标准工作台导出包由 CLI 自动回填时间线。
|
|
11
13
|
|
|
@@ -24,7 +26,7 @@ return-v1 标准包由 `gtrk ai-drama lay` 确定性回填;其他平台没有
|
|
|
24
26
|
|
|
25
27
|
**你与 `matrix` 同属第 ③ 步,MUST 在 MG 之前落位。** 理由:**AI 情景片段属于底轨 B-roll 画面家族,不是叠加层**——整条管线里唯一的叠加层是 MG(含 ov)。MG 的排版决策是「因势象形避主体」、**依赖底轨的最终画面构图**;若你的片段在 MG 之后才回铺,底轨构图就变了,先产的 MG 是对着「还没有 AI 画面的底轨」做的避让,你的片段落位后必然被避让错位、甚至被 MG 盖住画面主体。
|
|
26
28
|
|
|
27
|
-
> ⚠️ **工序顺序**:AI 情景片段必须先落位;它属于底轨 B-roll,不是最后叠加的图层。之后再做全局构图检查与 MG。
|
|
29
|
+
> ⚠️ **工序顺序**:AI 情景片段必须先落位;它属于底轨 B-roll,不是最后叠加的图层。之后再做全局构图检查与 MG。
|
|
28
30
|
|
|
29
31
|
**异步等待的口子(你造成的那个)**:你产完描述后,用户要去外部平台出片、抽卡可能数天。严格串行会把 ④⑤ 无限期卡住,故约定:进 ⑤ 的硬门是「**AI 片段已回铺 ∨ 用户明示先跳过**」。走「明示跳过」时,下游 `/gtrk-mg` MUST 把与你的 beat 相邻/重叠区间的 MG 颗粒标记为「AI 回铺后待复查构图」并在收口时复述——**你在交代进度时也要把这个代价说清**,让用户知道跳过意味着将来可能返工那几颗。
|
|
30
32
|
|
|
@@ -37,11 +39,11 @@ return-v1 标准包由 `gtrk ai-drama lay` 确定性回填;其他平台没有
|
|
|
37
39
|
3. **中英双版地位平等,不是主辅。** ①视觉基调、②故事背景、③角色、④分镜四段每一段都给完整的中文版 + 英文版(不是把中文翻一句了事)。中文喂可灵 / 即梦 / Vidu / 通义,英文喂 Veo / Runway / LTX / Luma,用户按目标平台选。**唯独 ⑤ 原文文稿是中文口播原文、不翻译**(它是源真相 + 手动拼接的对位锚,翻译反而失真)。
|
|
38
40
|
4. **内容可移植,Markdown 外壳不可自由改写。** 默认产物 MUST 通过 `gitruck-ai-drama-desk` 的 Markdown 解析契约:标题必须含 `(beat BXX)`;两大块必须叫 `## 一、中文稿…` / `## 二、English Storyboard…`;角色必须用 `#### 角色名(备注)` 标题;中文镜头必须用 `#### 分镜 01 · …`,英文镜头必须用 `#### Shot 01 · …`;元信息必须含 `区间总时长:track_st … → track_ed … ≈ … 秒`。`镜头`、粗体行、项目符号角色、`## 中文` / `## English`、`工程时间位` 都不是等价写法。**人读友好不能牺牲机读契约。**
|
|
39
41
|
|
|
40
|
-
> **产物落点纪律(MUST · 全文见随包 `AGENT.md` 同名一节)**:
|
|
41
|
-
> 交付物 MUST NOT 先写 agent 自有目录再拷进工程;中转本身即违规,体积不是豁免理由。
|
|
42
|
+
> **产物落点纪律(MUST · 全文见随包 `AGENT.md` 同名一节)**:
|
|
43
|
+
> 交付物 MUST NOT 先写 agent 自有目录再拷进工程;中转本身即违规,体积不是豁免理由。
|
|
42
44
|
> 分镜稿只落**工程目录**(`<project>/ai-drama/<beat_id>.md`)或**用户显式指定处**;
|
|
43
45
|
> **MUST NOT** 把用户媒体(毛片 / 成片 / 预览 / 外部平台出的片段)或任何大媒体文件复制到 agent 自有工作目录(如用户文档目录下 agent 产品自建的目录、agent 家目录缓存、会话工作区)——需要引用媒体时**用原路径引用**,不做副本;
|
|
44
|
-
> 临时文件一律放系统 temp 且**用完即删**。交付物直接写入工程目录或用户显式指定的路径;引用媒体用原路径。
|
|
46
|
+
> 临时文件一律放系统 temp 且**用完即删**。交付物直接写入工程目录或用户显式指定的路径;引用媒体用原路径。
|
|
45
47
|
|
|
46
48
|
## 业务分离:栏目 Style Lock 从哪来(关键)
|
|
47
49
|
|
|
@@ -114,7 +116,9 @@ return-v1 标准包由 `gtrk ai-drama lay` 确定性回填;其他平台没有
|
|
|
114
116
|
|
|
115
117
|
**Step 4 · 写四段描述(中英分块)**:先出**中文稿**(② 故事背景末句锁调 → ③ 角色结构化 + 禁变项 + 质感落点,复现理论家 pin 复用同段文字 → ④ 分镜每镜前缀复述基调 + 建议秒数 + 对应原文句 + 蒙太奇级意图 → ⑤ 原文文稿中文逐句不翻译),再整块出 **English Storyboard**(① Style Lock + ②③④ 英文原生化,不含 ⑤)。中英**分两大块、不逐段交错**(craft C)。
|
|
116
118
|
|
|
117
|
-
**Step 5 · 校验后落盘**:先把每个 beat 的候选稿写到系统 temp
|
|
119
|
+
**Step 5 · 校验后落盘**:先把每个 beat 的候选稿写到系统 temp,运行 `gtrk ai-drama validate <候选稿.md>`;退出码为 0 才写到 `<project>/ai-drama/<beat_id>.md`。失败就按输出逐项修正,MUST NOT 把未通过稿件落进工程。校验器不可用时(CLI 版本过旧),至少逐项执行下面「解析器硬契约」与交付前自检。用户直投单段时同样先校验,再落到用户指定的工程路径。临时稿无论成功失败都删掉。
|
|
120
|
+
|
|
121
|
+
> **在即剪内置 AI 里**:写不了系统 temp、也删不了文件——候选稿直接写 `<project>/ai-drama/<beat_id>.md`,紧接着 `gtrk ai-drama validate ai-drama/<beat_id>.md`;不通过就原地逐项改到通过为止,通过之前 MUST NOT 交给工作台、MUST NOT 往下走。交付时在回复里用 `[B03 分镜稿](ai-drama/B03.md)` 这种写法给出文件。
|
|
118
122
|
|
|
119
123
|
## 输出契约(落盘 Markdown 结构 · 中英分块)
|
|
120
124
|
|
|
@@ -133,13 +137,13 @@ return-v1 标准包由 `gtrk ai-drama lay` 确定性回填;其他平台没有
|
|
|
133
137
|
- 蒙太奇分段只写进镜头头的 `|段:…` / `|segment: …` 字段;④ 内不要另插 `#### 蒙太奇段…` / `#### Montage…` 标题,解析器会把它吞进前一镜描述。
|
|
134
138
|
- 中英文镜头序号一一对应;至少一镜;每镜建议秒数写在头部字段,不要藏在正文项目符号里。
|
|
135
139
|
|
|
136
|
-
|
|
140
|
+
校验命令:
|
|
137
141
|
|
|
138
142
|
```bash
|
|
139
|
-
|
|
143
|
+
gtrk ai-drama validate <候选稿.md>
|
|
140
144
|
```
|
|
141
145
|
|
|
142
|
-
通过时输出单行 JSON 并退出 0
|
|
146
|
+
通过时输出单行 JSON 并退出 0;不通过时逐条列出违约项并退出 1(可一次传多份稿,每份一行)。判据与随 skill 分发的 `scripts/validate-storyboard.mjs` 相同;那份脚本只为旧版 CLI 兼容保留一个版本周期,新稿一律用子命令。它校验的是生产端硬契约;工作台仍是最终权威,仓库可用时可再用其 `server/lib/parse.ts` 做回归。
|
|
143
147
|
|
|
144
148
|
```
|
|
145
149
|
# AI 情景动画分镜稿 · [自动标题](beat <beat_id>)
|
|
@@ -224,7 +228,7 @@ face / hair / eyes / wardrobe / signature prop + do-not-change + one line on how
|
|
|
224
228
|
|
|
225
229
|
## 交付前自检
|
|
226
230
|
|
|
227
|
-
- [ ] `
|
|
231
|
+
- [ ] `gtrk ai-drama validate` 已对**每个**候选稿返回 `ok:true`,或在校验器不可用时完成了「解析器硬契约」逐项核对?
|
|
228
232
|
- [ ] 标题、两大块、③角色标题、④分镜标题与区间元信息使用契约原词,没有用“更好看”的同义排版替换?
|
|
229
233
|
- [ ] 五区块齐备(元信息 + ①视觉基调 + ②故事背景 + ③角色 + ④分镜 + ⑤原文文稿)?
|
|
230
234
|
- [ ] 每镜有**明确主语 + 明确动作**?(没有就退回)
|
|
@@ -250,7 +254,7 @@ face / hair / eyes / wardrobe / signature prop + do-not-change + one line on how
|
|
|
250
254
|
|
|
251
255
|
命令自己解析 id → 导出包目录,走两条**确定性**路径:① 工作台服务可达就问它;② 服务没起就读 `~/.gitruck/ai-drama-desk.json` 的落脚点。两条都不通会报错并给出路。
|
|
252
256
|
|
|
253
|
-
> ⚠️ **拿到 id 之后 MUST NOT 去磁盘上找导出包**(`find
|
|
257
|
+
> ⚠️ **拿到 id 之后 MUST NOT 去磁盘上找导出包**(`find`、递归列目录、通配一律禁止)。解析不出来就如实报,请用户启动工作台或直接给路径。
|
|
254
258
|
> 零命中时命令会列出「已查过哪些数据根」:源码部署与打包部署的数据根不同,项目找不到多半是**它在另一个部署里**,不是丢了。
|
|
255
259
|
|
|
256
260
|
已经手上就有目录路径(或用的是非标准平台)时,仍可用 `--package "<exports/aidrama>"`,两者可混用、按路径去重。
|
|
@@ -258,7 +262,7 @@ face / hair / eyes / wardrobe / signature prop + do-not-change + one line on how
|
|
|
258
262
|
命令会先按当刻口播工程重投影 beat 窗口,再把所有镜头复制到 `<gtrk目录>/assets/ai-drama/<slug>/`,共用一条新的 `video_track`;每个 beat 从起点顺排,最后一镜吸收到 beat 终点。既有 A-roll、BGM 与 B-roll 轨零改动。若已铺 AI 轨被用户手调过,缺省拒绝覆盖;只有用户明确同意丢弃手调时才加 `--replace-all`。
|
|
259
263
|
3. **非标准平台才手动回铺**:外部平台没有 return-v1 清单时,才由用户把片段拖回 opencut 的 **AI_DRAMA 车道**,对齐该 beat 的 `track_st→track_ed`。AI 出片仍是外部异步、用户驱动;未拿到完整片段前要停下等用户,别替他假装出片 / 回轨完成。
|
|
260
264
|
4. **回铺齐 ≠ 收口,还有两步**:你的片段回铺齐只意味着 **③ B-roll 底轨阶段**完成。接着 MUST 走 **④ 全局抽帧检查画面构图**(对三源合并后的最终底轨抽帧,看主体位置 / 安全区 / 画面朝向 / 明暗,**停下等用户确认**)→ 过了才交棒 **⑤ `/gtrk-mg`** 把 MG(含 ov)叠上 → 最后才 `gtrk render` 收口。
|
|
261
|
-
⚠️ **MUST NOT 从你这里直接跳到 `render`**;先完成全局构图检查与 MG,再进入字幕和渲染。
|
|
265
|
+
⚠️ **MUST NOT 从你这里直接跳到 `render`**;先完成全局构图检查与 MG,再进入字幕和渲染。
|
|
262
266
|
|
|
263
267
|
> 原则:**agent 替用户跑 CLI / 接力 skill,用户只对话**。但 AI_DRAMA 车道天然有「用户去外部平台出片 + 手动拼回」的手工环节——那部分是外部的手,无法替跑;除此之外的解析、生成、落盘、交代,全由你(脑)一次做完,别让用户自己去拼描述。
|
|
264
268
|
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ⚠️ 兼容保留一个版本周期:请改用 `gtrk ai-drama validate <分镜稿.md>`(link-in-app-agent-capability-shelf D2)。
|
|
4
|
+
* 判据已收进 CLI(`src/lib/storyboard-validate.ts`),两份由 `test/ai-drama-validate.test.mjs` 逐字节对拍——改判据两边同改。
|
|
5
|
+
*/
|
|
2
6
|
|
|
3
7
|
import { readFile } from "node:fs/promises";
|
|
4
8
|
import { basename } from "node:path";
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gtrk-composite
|
|
3
3
|
description: 合成层包装(合成颗粒)——粗剪、B-roll、字幕都定了之后,把选定时间窗做成「合成」:一段时间内的整个画面由一颗代码颗粒接管(画中画拼贴、逐句换画面、对照并排、并列卡片、字幕排版),讲者与 B-roll 作为槽位画进去。三种入口:整片铺满 / 让 AI 判定哪里值得做 / 用户指定区间;候选窗口显示在客户端大纲的 CP 行。当用户想「做合成 / 合成层 / 整片做一下合成包装 / 哪里适合做合成 / 这段做成画中画拼贴 / 11 秒到 32 秒做个合成 / 逐句换画面 / 把字幕排进画面里」时使用本 skill,驱动 `gtrk composite`(plan → review → scaffold → build → lint → lay → bake),别手搓 HTML 铺进工程。
|
|
4
|
+
metadata:
|
|
5
|
+
in_app_agent: true
|
|
4
6
|
---
|
|
5
7
|
|
|
6
8
|
# 合成层包装(gtrk-composite)
|
|
@@ -18,7 +20,7 @@ description: 合成层包装(合成颗粒)——粗剪、B-roll、字幕都
|
|
|
18
20
|
- 字幕最好已上(`gtrk subtitle lay`):合成颗粒可以接管字幕、自己排。
|
|
19
21
|
- `gtrk composite --help` 能跑(CLI 版本含本命令族)。
|
|
20
22
|
|
|
21
|
-
⚠️ **出片口径要先说清**:合成颗粒出片靠本机烘焙(`gtrk composite bake
|
|
23
|
+
⚠️ **出片口径要先说清**:合成颗粒出片靠本机烘焙(`gtrk composite bake`,见「出片:烘焙」一节;客户端导出时自动烘焙)——首次要装烘焙浏览器(约 110 MB),某颗烘焙失败时那一段按粗剪出画。用户要交付成片的话,这件事 MUST 在开工时告诉他。
|
|
22
24
|
|
|
23
25
|
## 入口:三选一(用户已说明就不再问)
|
|
24
26
|
|
|
@@ -36,7 +38,7 @@ description: 合成层包装(合成颗粒)——粗剪、B-roll、字幕都
|
|
|
36
38
|
|
|
37
39
|
### 检查点①(必停):审窗口
|
|
38
40
|
|
|
39
|
-
|
|
41
|
+
写回后客户端会自动重新载入工程(没有自动载入时请用户手动重新载入),请用户看大纲的 **CP 行**:虚线框 = 待审,虚线框加浅底 = 已采纳,悬停能看理由与建议。同时把审稿稿的表格摘给他。他在对话里说哪些要、哪些不要、哪些调起止,你用 `review` 写回:
|
|
40
42
|
|
|
41
43
|
```bash
|
|
42
44
|
gtrk composite review --project <工程> --approve W01,W03 --reject W02 --adjust W04=80,90.9 --add 140,150
|
|
@@ -77,15 +79,18 @@ gtrk composite scaffold --project <工程> # 为已采纳窗口落场
|
|
|
77
79
|
gtrk composite lay --project <工程> # 全量;--only cp-w03 只替换这颗
|
|
78
80
|
```
|
|
79
81
|
|
|
80
|
-
|
|
82
|
+
铺完客户端会自动重新载入(没有自动载入时请用户手动重新载入):CP 行上的提案块变成实色合成块,预览即合成效果。
|
|
81
83
|
|
|
82
84
|
## 出片:烘焙
|
|
83
85
|
|
|
86
|
+
> 这一节是外部 agent(终端里的 Claude Code、Codex 等)的出片步骤。在即剪客户端的 AI 面板里做合成时,铺完轨就告诉用户「导出时会自动烘焙」,不运行 `bake`。
|
|
87
|
+
|
|
84
88
|
铺完、用户确认后、出片前,先在本机把合成烤成视频(`gtrk render` / `gtrk project export` 也会自动先烤,单独跑便于先看结果):
|
|
85
89
|
|
|
86
90
|
```bash
|
|
87
91
|
gtrk deps install --browser # 首次:装钉定版本的烘焙浏览器(约 110 MB)。MUST 先告诉用户再装
|
|
88
92
|
gtrk composite bake --project <工程> # 全部合成;--only cp-w03 只烤这颗
|
|
93
|
+
gtrk composite upgrade-kit --project <工程> # 旧颗粒换上当前工具箱(元数据与场景不动);用户调窗口后边框 / 阴影才跟着走
|
|
89
94
|
```
|
|
90
95
|
|
|
91
96
|
- **缓存即复用**:没改过的颗粒二次运行全部命中;改了场景、素材文件、上游时间线或帧率才重烤。
|
|
@@ -157,10 +162,10 @@ CP.render = (t) => {
|
|
|
157
162
|
- **槽位绑定**:`ref-lane {track}`(某条轨在该时刻的画面,讲者常用);`ref {clip_id}`(某个片段,窗口外定格首末帧);`own {material, src_in_ms, dur_t | dur_f, starts_at: 锚点名 | starts_at_t: 时间线秒}`(自选素材的一段;之前首帧、之后末帧定格);`text`(字幕文本输入,无几何)。
|
|
158
163
|
- **锚点**:`[句 id, 关键词, 第几处(0 起)]`,取关键词首字在时间线上的时刻;场景里 `A("名字")` 得局部秒。关键词所在的字被剪掉时取其后第一个保留的字。匹配时关键词与句子都忽略空格、标点与大小写,英文按整词(`["u0001", "cold brew"]` 直接写;`"tea"` 不会命中 `teas`)。
|
|
159
164
|
- **槽位元素**:`data-slot` 一槽一个;`data-z` 叠放次序;`data-fit` cover / contain;`data-shape` rect / roundrect / circle;`data-crop` 上右下左比例;`data-filter` 只收白名单滤镜。
|
|
160
|
-
- **装饰跟随**:`data-for="<槽位>"` 的元素与槽位同框(`data-pad` 外扩);`.shadow` 在下(背景层),`.frame` / `.ring` 加 `data-layer="front"` 在上——**只给最上层的画面加前景描边**(规则 2
|
|
165
|
+
- **装饰跟随**:`data-for="<槽位>"` 的元素与槽位同框(`data-pad` 外扩);`.shadow` 在下(背景层),`.frame` / `.ring` 加 `data-layer="front"` 在上——**只给最上层的画面加前景描边**(规则 2)。用户在客户端挪、放大窗口后,`data-for` 装饰会跟着覆盖后的窗口走(工具箱 @2 起);所以**围着槽位的边框、阴影、角标一律用 `data-for`**,不要按槽位坐标手摆。场景里自己摆的标签(`place`)要贴着窗口时,用 `CP.boxed("<槽位>", [x, y, w, h])` 取覆盖后的窗口再算位置。旧工程(工具箱 @1 做的颗粒)先跑 `gtrk composite upgrade-kit --project <工程>`,装饰才会跟随。
|
|
161
166
|
- **分层**:缺省是背景层(画在视频之下);`data-layer="front"` 的子树在视频之上(文字、标签、描边、线条)。
|
|
162
167
|
- **定位**:工具箱只给**舞台的直接子元素**绝对定位(`#stage > *`)。放进容器里的子元素(如 `<div id="grid">` 下的一排徽章)不会自动定位,`left` / `top` 不生效、按文档流挤成一列(lint 报 `unpositioned-offset`)——容器内要摆位置的子元素自己写 `position:absolute`,或加工具箱的 `.abs` 类;坐标相对容器(容器自己要写宽高)。
|
|
163
|
-
- **工具箱 `CP`**:`prog(t, 起, 时长, ease)` 进度;`span` 进出;`at(id, [x,y,w,h], 透明度)` 定框;`mix(矩形A, 矩形B, p)` 版式插值;`seq(t, 到点, 下一张到点)` 同一位置逐句换画面的透明度;`place(el, x, y, o)`;`reveal / look / wipe / draw / typeOn`;`caption(el, "subs", t, 高亮词[], 隐藏区间[])`;`cues("subs")` 取字幕条目(局部帧);`fps()`。
|
|
168
|
+
- **工具箱 `CP`**:`boxed(槽位, [x,y,w,h])` 用户窗口覆盖后的框;`prog(t, 起, 时长, ease)` 进度;`span` 进出;`at(id, [x,y,w,h], 透明度)` 定框;`mix(矩形A, 矩形B, p)` 版式插值;`seq(t, 到点, 下一张到点)` 同一位置逐句换画面的透明度;`place(el, x, y, o)`;`reveal / look / wipe / draw / typeOn`;`caption(el, "subs", t, 高亮词[], 隐藏区间[])`;`cues("subs")` 取字幕条目(局部帧);`fps()`。
|
|
164
169
|
- **常用样式**:`.bed`(底色)/ `.bed.dark`;`.kicker` `.h1` `.h2` `.h3` `.body` `.tag` `.num`;`.ptag` / `.ptag.warm`(画面标签);`.cap` / `.cap.dark`(字幕);`.bubble`(对话气泡);`.stamp`(印章);`.card` `.pill` `.rule`。配色与字体都是变量:`--bg --bg2 --ink --muted --line --accent --accent2 --accent3 --alert --font --font-serif`。
|
|
165
170
|
- **纯函数**:场景脚本 MUST NOT 用 `Date`、`Math.random`、`requestAnimationFrame`、`setInterval`、`setTimeout`(lint 会拦)——同一帧号永远画出同一画面,客户端是逐帧 seek 的。
|
|
166
171
|
|
|
@@ -195,7 +200,7 @@ CP.render = (t) => {
|
|
|
195
200
|
| bake 报「找不到可用的浏览器」(退出码 2) | 本机没有钉定浏览器也没有 Chrome / Edge:征得用户同意后 `gtrk deps install --browser` |
|
|
196
201
|
| bake 报「素材缺失:<路径>」 | 素材移动或删除了:恢复文件或重新登记路径后再烤这颗 |
|
|
197
202
|
| lay 报「没铺:时间线上已有同 id 的片段」 | 用户在客户端改过那颗:要重铺先请他在客户端删掉它 |
|
|
198
|
-
| 客户端 CP 行没出现提案块 |
|
|
203
|
+
| 客户端 CP 行没出现提案块 | 请用户重新载入工程(客户端有未保存的改动时不会自动载入外部写入) |
|
|
199
204
|
|
|
200
205
|
## 被图纸快速成片接力调用
|
|
201
206
|
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gtrk-cover
|
|
3
|
-
description:
|
|
3
|
+
description: 封面工作台——两阶段做完一期视频的封面:阶段一出设计诊断与三尺寸中英双版文生图 Prompt(用户拿去任意文生图平台抽图),阶段二收齐背景图,产可拖拽排字的单文件 H5 工作台(`gtrk cover embed` 嵌图),在浏览器里导出多尺寸 PNG。栏目封面审美从栏目配置 style.skills 里 produces=="cover" 的条目注入,绝不硬编某栏目风格。当用户想「做封面 / 出封面 / 封面 prompt / 封面排版 / 封面工作台 / cover」时使用本 skill,别手搓 prompt、别让用户裸排版。
|
|
4
|
+
metadata:
|
|
5
|
+
in_app_agent: true
|
|
4
6
|
---
|
|
5
7
|
|
|
6
8
|
# 封面工作台(gtrk-cover)
|
|
7
9
|
|
|
8
10
|
把一期视频的封面走完两阶段:**阶段一**产设计诊断 + 三尺寸中英双版文生图 Prompt,交棒用户去外部平台抽图;**阶段二**收齐背景图后产**定制化 H5 排字工作台**(单文件 HTML、可拖拽 / 方向键 / 数值 / 滚轮微调、逐尺寸与一键导出原分辨率 PNG),用户在浏览器里排字导出。
|
|
9
11
|
|
|
10
|
-
>
|
|
12
|
+
> **以创作为主的 skill**——主链路「审美诊断 → Prompt → 外部平台抽图 → 用户浏览器拖字导出」里,抽图与排字两个环节的「手」在外部平台和用户手里;**唯一的机械段**(背景图按尺寸压缩 + base64 嵌进工作台)走 `gtrk cover embed`(纯本地、零计费),不要自己写脚本。`.gtrk` 工程没有封面槽位可写回,封面产物不进工程。
|
|
11
13
|
|
|
12
14
|
## 定位:管线外的「第 0 阶段」
|
|
13
15
|
|
|
@@ -19,17 +21,20 @@ description: 封面工作台——把一期视频的封面从「设计诊断 +
|
|
|
19
21
|
2. **两阶段不能合并。** 用户还没抽图就端出工作台 = 盲排(不看背景图排字,等于退回指令稿时代);工作台的价值就在「因势象形地就着背景图排字」。阶段一交付后**停下等图**。
|
|
20
22
|
3. **审美决策由本 skill 做,工作台只暴露微调面。** 工作台暴露给用户的只有:图层位置 / 字号 / 文案 / 显隐、显式声明的装饰件开关、T1 全局样式滑杆(描边 / 发光 / 既定字色选项)、**T1 字体与字重档位(字体列表读用户本机已装字体,默认字仍由本 skill 定)**。色板体系、字体选型、布局拓扑、装饰件组合是审美决策——由你按注入的风格资产做出、交付时说明理由;用户想改审美层,**经对话增量改 HTML**(不推倒重来),别让他在工作台里找不存在的控件。
|
|
21
23
|
|
|
22
|
-
> **产物落点纪律(MUST · 全文见随包 `AGENT.md` 同名一节)**:
|
|
23
|
-
> 交付物 MUST NOT 先写 agent 自有目录再拷进工程;中转本身即违规,体积不是豁免理由。
|
|
24
|
+
> **产物落点纪律(MUST · 全文见随包 `AGENT.md` 同名一节)**:
|
|
25
|
+
> 交付物 MUST NOT 先写 agent 自有目录再拷进工程;中转本身即违规,体积不是豁免理由。
|
|
24
26
|
> Prompt 文本与工作台 HTML 只落**用户显式指定目录**,或有工程上下文时落 `<project>/cover/`;
|
|
25
|
-
> **MUST NOT** 把用户媒体(背景图 / 导出的封面 PNG / 任何大文件)复制到 agent 自有工作目录(如用户文档目录下 agent 产品自建的目录、agent
|
|
26
|
-
>
|
|
27
|
+
> **MUST NOT** 把用户媒体(背景图 / 导出的封面 PNG / 任何大文件)复制到 agent 自有工作目录(如用户文档目录下 agent 产品自建的目录、agent 家目录缓存、会话工作区)——`gtrk cover embed` **从原路径读取**背景图,压缩产物直接以 base64 写进工作台 HTML,不留中间副本。
|
|
28
|
+
> 交付物直接写入工程目录或用户显式指定的路径;引用媒体用原路径。
|
|
29
|
+
>
|
|
30
|
+
> **在即剪内置 AI 里**:只能写当前工程目录,Prompt 与工作台一律落 `<工程>/cover/`。用户抽好的背景图是**拖进对话框的附图**,宿主会在本轮注入里给出它们在工程目录 `agent-uploads/` 下的路径——直接把这些路径交给 `gtrk cover embed`,不要复制。交付时在回复里用 `[名字](相对工程目录的路径)` 给出 Prompt 文件与工作台(面板画成文件卡,工作台带「用浏览器打开」),用 `` 展示采用的背景图。
|
|
27
31
|
|
|
28
32
|
## 业务分离:栏目封面风格从哪来(关键)
|
|
29
33
|
|
|
30
34
|
**封面审美不是本 skill 预设的,是从栏目配置解析出来的。** 解析链路(与 `/gtrk-ai-drama` 的 Style Lock 解析同源):
|
|
31
35
|
|
|
32
|
-
1. **定位有效栏目**:用户 `--column <id>` 口头指定的栏目,或本地 config 的 `defaultColumn`;配置文件在 `~/.gitruck/columns/<id>.json
|
|
36
|
+
1. **定位有效栏目**:用户 `--column <id>` 口头指定的栏目,或本地 config 的 `defaultColumn`;配置文件在 `~/.gitruck/columns/<id>.json`,**直接读这个 JSON 文件**。
|
|
37
|
+
- **在即剪内置 AI 里读不到 `~/.gitruck` 下的栏目配置**:本轮用户在输入区选了「视频风格」时,以那份风格的色板、字体、装饰为封面审美来源(读到什么维度用什么);没选就用下面「中性默认」,不要去猜。
|
|
33
38
|
2. **取封面风格条目**:读 `style.skills[]`,取 `produces` **大小写不敏感归一后 `== "cover"`** 的条目。
|
|
34
39
|
- 命中且未声明 `routing:"none"` → 拿它的 `ref`(指向一个 skill 目录/资源)→ **读该资产的封面风格维度**——色板与情绪轴、字体选型、概念→意象对照、T1 样本、材质与回避清单、平台安全区偏好……**读到什么维度用什么**;缺某维度就只对该维度回落中性默认,不整体放弃注入。
|
|
35
40
|
- 条目声明 `routing:"none"` → 跳过(退役 / 显式停用标记)。
|
|
@@ -58,20 +63,20 @@ description: 封面工作台——把一期视频的封面从「设计诊断 +
|
|
|
58
63
|
|
|
59
64
|
**Step 2 · 出三尺寸 Prompt**(`references/prompt-templates.md`):每尺寸一套**英文主版 + 中文辅版**,构图差异显式化(16:9 主体居中两侧留气 / 4:3 饱满可顶三边留对角气口 / 3:4 主体中段上下舒展)。铁律:**不让生图模型渲染中文字**——字全部由阶段二工作台贴,图里只留气息性软留白。
|
|
60
65
|
|
|
61
|
-
**Step 3 · 阶段一自检**(`references/checklist.md` 阶段一 5 条)→
|
|
66
|
+
**Step 3 · 阶段一自检**(`references/checklist.md` 阶段一 5 条)→ 把诊断与三尺寸 Prompt 写成一份 `cover/<T1>_封面Prompt.md`(有工程上下文时;否则落用户指定目录)→ 结束语明确交棒:「每个尺寸抽到满意的图后传回来,我生成排字工作台」(即剪内置 AI 里写「抽好的图直接拖进对话框发给我」)。**停,等图。**
|
|
62
67
|
|
|
63
68
|
### 🛠️ 阶段二:H5 排字工作台
|
|
64
69
|
|
|
65
70
|
**Step 4 · 收齐背景图后实例化工作台**(`references/workbench-guide.md` + `assets/workbench-template.html`):
|
|
66
|
-
1.
|
|
67
|
-
2.
|
|
71
|
+
1. 按各图宽高比归位到尺寸档(归不上就问,别硬塞;拿不准宽高就 `gtrk media probe <图>`);
|
|
72
|
+
2. 先按下面 3–5 把模板实例化成**源稿** `<T1>_封面排版工作台.src.html`(占位符原样留着),**最后**跑 `gtrk cover embed <源稿> --bg-16x9 <图> --bg-4x3 <图> --bg-3x4 <图> -o <T1>_封面排版工作台.html` 出成品(压缩参数与体积红线见 guide §7;没给图的尺寸占位符保留,命令会提示)。源稿与成品分开:成品里是几百 KB 的 base64,**之后改审美只改源稿、再重跑 embed**,不要去读、去改成品;
|
|
68
73
|
3. 按 **T1 实际字数**实例化 T1 图层(模板 `T1_KEYS` 常量驱动,5 字就 5 个逐字图层,不写死 4 字);
|
|
69
74
|
4. 注入色板 CSS 变量、T1 字体与发光、装饰件、各图层默认坐标(按布局配方 + 实际画面气口微调)、T2/T5/品牌戳等附加图层初始文案;
|
|
70
|
-
5.
|
|
75
|
+
5. 源稿与成品同目录:落用户指定目录或 `<project>/cover/`;交给用户的是成品 `<T1>_封面排版工作台.html`。
|
|
71
76
|
|
|
72
|
-
**Step 5 · 合规检查 +
|
|
77
|
+
**Step 5 · 合规检查 + 交付**:占位符零残留(`gtrk cover embed` 回执的 `pending` 为空)/ 三尺寸 DEFAULTS 齐 / T1 初值两处一致 / `T1_DEFAULT_FONT` 与 CSS `.t1` 一致 / 浏览器打开控制台零报错、三尺寸切换正常(能验就验)。交付时讲清:工作台能做什么(拖拽 / 方向键 / 滚轮微调 / 文案编辑 / 显隐 / 恢复默认 / 换背景 / **换字体与字重(读本机字体)** / 逐尺寸与一键导出)、默认布局按什么选的、审美决策为什么这么做(含默认字的选型理由);补一遍阶段二自检 4 条。
|
|
73
78
|
|
|
74
|
-
**Step 6 · 迭代三分支**:用户自己微调位置字号文案 → 工作台已支持,不用回来;**审美层要改**(换色板 / 换字体 / 去装饰件)→
|
|
79
|
+
**Step 6 · 迭代三分支**:用户自己微调位置字号文案 → 工作台已支持,不用回来;**审美层要改**(换色板 / 换字体 / 去装饰件)→ 对话告诉你,增量改源稿 `.src.html`、重跑 `gtrk cover embed` 重新交付;**换背景图** → 源稿不动,换图重跑 embed;**图要重抽** → 回阶段一只改相关槽位,其余不动。
|
|
75
80
|
|
|
76
81
|
## 中性默认(未绑封面风格资产时)
|
|
77
82
|
|
|
@@ -78,9 +78,10 @@
|
|
|
78
78
|
## 7. 背景图归位与压缩
|
|
79
79
|
|
|
80
80
|
- **归位按宽高比**:`w/h ≥ 1.55 → 16:9`;`≥ 1.15 → 4:3`;否则 `3:4`。同档有多张时显式选择并告知备选(用户可用左栏「上传当前尺寸的背景图」随时换)。归不上任何档就问,别硬塞。
|
|
81
|
-
-
|
|
82
|
-
-
|
|
83
|
-
-
|
|
81
|
+
- **嵌图走命令**:`gtrk cover embed <源稿.src.html> --bg-16x9 <图> --bg-4x3 <图> --bg-3x4 <图> -o <成品.html>`——从**原路径**读用户图,按尺寸压成 JPEG、base64 换进三个占位符,压缩结果经管道回内存、不留任何中间图片。不要再写临时压缩脚本。
|
|
82
|
+
- **压缩参数**(正本在 CLI `src/lib/cover-embed.ts`,以代码为准):16:9 长边 ≤1280 / q82;4:3 ≤1600 / q78;3:4 ≤1400 / q78;只缩不放。纹理极密的图压不动属正常,别为体积牺牲画质。
|
|
83
|
+
- **体积红线**:整份 HTML **>1MB 必须回头处理**(浏览器打开明显变慢:换纹理少一点的图,或先把图缩小再嵌);>600KB 提示一句即可。命令回执的 `warnings` 会直接报。
|
|
84
|
+
- **源稿与成品分开**:占位符留在源稿 `.src.html`,成品带 base64;改排字 / 审美只改源稿再重嵌,不要读、改成品(几百 KB 的 base64 会把上下文撑满)。
|
|
84
85
|
|
|
85
86
|
## 8. 工程注意(踩过的坑)
|
|
86
87
|
|