[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6HQM0PZQNWHFMPVCQVMC2S7":3,"skill-same:01M6HQM0PZQNWHFMPVCQVMC2S7":79},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":29,"publishedAt":51,"linkOnly":52,"markdownContent":53,"markdownBody":54,"frontMatter":55,"refName":56,"commitSha":57,"skillDirectory":58,"forksCount":59,"repositoryHtmlUrl":60,"repositoryHomepageUrl":61,"ownerHtmlUrl":62,"ownerBlogUrl":63,"ownerDescription":6,"updatedAt":64,"install":65,"resources":78},"01M6HQM0PZQNWHFMPVCQVMC2S7","craft-studio",null,"Router for the ArtCraft craft apps (PhotoCraft, VectorCraft, FilmCraft, LightCraft, PdfCraft, EffectCraft, DesignCraft, FigCraft, WordCraft, SoundCraft, DeckCraft, CADCraft, GridCraft) driven headless via pi-craft. Use to choose which app fits a job and run the discover-execute-save-verify loop - \"which craft app should I use\", \"edit a video\u002Faudio\u002Fimage\u002FPDF headless\", \"make a title card\".","BlackBeltTechnology\u002Fpi-agent-dashboard","BlackBeltTechnology","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F8101592?v=4","01M6HQDX7QAJA0QP4NYRYBMJ8A","BlackBelt Technology","01M6HQDXCC7719N9YDMQVH9JS6",348,"MIT","https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology\u002Fpi-agent-dashboard\u002Fblob\u002Fdevelop\u002Fpackages\u002Fcraft-apps\u002F.pi\u002Fskills\u002Fcraft-studio\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50],"craft studio","studio","craft","discover","title","cadcraft","headless","which","make","card","apps","app","PDF","router","edit","choose","loop","Audio","Video","run","image","2026-11-10 10:12:30",false,"---\nname: craft-studio\ndescription: Router for the ArtCraft craft apps (PhotoCraft, VectorCraft, FilmCraft, LightCraft, PdfCraft, EffectCraft, DesignCraft, FigCraft, WordCraft, SoundCraft, DeckCraft, CADCraft, GridCraft) driven headless via pi-craft. Use to choose which app fits a job and run the discover-execute-save-verify loop - \"which craft app should I use\", \"edit a video\u002Faudio\u002Fimage\u002FPDF headless\", \"make a title card\".\n---\n\n# craft-studio — pick the right ArtCraft app, drive it headless, verify the result\n\nArtCraft ships thirteen native creative apps. Each has a headless `\u003Capp>-cli` with a self-describing\ncommand registry (≈6 000 commands in total) and a stdio MCP server. `pi-craft` provisions those CLIs on\nfirst use (checksum-verified, no desktop app, nothing installed system-wide) and gives you one command\nsurface for all of them. **This skill chooses the app and owns the loop; each app has its own skill\nfor its dialect, traps and recipes — read it before running anything in that app.**\n\n```bash\npi-craft apps                 # the 13 apps (offline)\npi-craft status               # what is installed, cache size, active source (never downloads)\npi-craft install soundcraft filmcraft     # optional pre-provisioning; every \u003Capp> command also provisions on demand\npi-craft \u003Capp> exec \u003Cargs…>   # run \u003Capp>-cli with \u003Cargs…> verbatim — the bash route\npi-craft verify \u003Cfile> …      # mechanical output checks (below)\n```\n\n## Which app for which job\n\n| App | Use it for | Reads \u002F writes | Skill |\n|---|---|---|---|\n| `photocraft` | raster editing: crop, resize, colour, masks, layers, content-aware fill; pairs with `pi-nano-banana` | png jpg webp tif psd | `photocraft` |\n| `lightcraft` | RAW development, exposure\u002Fcolour grading, denoise, HDR\u002Fpanorama merge | dng\u002Fraw → jpg png tif | `lightcraft` |\n| `vectorcraft` | vector illustration, logos, icons, SVG\u002FPDF export | svg pdf png | `vectorcraft` |\n| `figcraft` | UI\u002Finterface design: frames, components, export of assets | fig, svg png pdf | `figcraft` |\n| `designcraft` | page layout \u002F DTP: stories, styles, multi-page PDF | pdf png | `designcraft` |\n| `filmcraft` | video editing: import, sequence, timeline, h264 export | mp4 mov (in) → mp4 | `filmcraft` |\n| `effectcraft` | motion graphics: comps, animated text, effects, **alpha** renders | project → mov ProRes 4444 \u002F mp4 \u002F png | `effectcraft` |\n| `soundcraft` | audio editing, mixing, gain, bounce with loudness\u002Fpeak report | wav aiff (in\u002Fout) | `soundcraft` |\n| `pdfcraft` | PDF combine, split, extract, edit, render, text, audit | pdf → pdf png txt | `pdfcraft` |\n| `wordcraft` | word processing: DOCX\u002FODT\u002FRTF documents, conversion, PDF export | docx odt rtf html md pdf | `wordcraft` |\n| `deckcraft` | presentations: slides, shapes, tables, export | pptx → pdf png | `deckcraft` |\n| `gridcraft` | spreadsheets: formulas, evaluation, conversion | xlsx csv | `gridcraft` |\n| `cadcraft` | 2D CAD drawings: entities, layers, export | dxf dwg → pdf png svg | `cadcraft` |\n\nPicking rules: one app per file format family; if two apps could do it, take the one whose *native*\nformat the input already has (a DOCX goes to WordCraft, never through DeckCraft). Cross-app jobs\n(title card over a video, narration under a clip) are a chain of single-app steps with the hand-off\nformats below — no app embeds another.\n\n## Workflow skills — chains of apps for whole jobs\n\nWhen a job spans several apps or sibling skills, use a workflow skill instead of improvising the chain. Each\none has a step table (input → output), a `pi-craft verify` gate after every artefact step, a step 0 that checks\nwhich sibling skills are available, and the **Craft jobs** convention below for resuming.\n\n| Workflow skill | Use it for | Drives |\n|---|---|---|\n| `craft-video-post` | footage \u002F Veo clips → (redaction) → assembly with alpha overlays → captions from an SRT → mix → mp4 delivery | FilmCraft, SoundCraft, EffectCraft |\n| `craft-beat-cut` | cut footage on the music's downbeats with camera punches on the hits (`music-hits\u002F1`) | FilmCraft, SoundCraft |\n| `craft-podcast-master` | recording → per-speaker tracks, cleanup, loudness-targeted master, optional chapters | SoundCraft (+ FilmCraft mux) |\n| `craft-motion-titles` | names \u002F lines from an SRT or speaker-id → lower-third \u002F title alpha overlays on a video | EffectCraft, FilmCraft |\n| `craft-brand-kit` | a logo (svg, or a raster traced to vector) → colour\u002Fmono variants, png\u002Ftiff export set, one-page brand sheet, pdf package | VectorCraft, PhotoCraft, DesignCraft, PdfCraft |\n| `craft-doc-publish` | Markdown + frontmatter + the company template → templated DOCX and PDF with TOC, images and Mermaid, optional package\u002Fprotect | `pi-craft doc prepare`, WordCraft, PdfCraft |\n| `craft-deck` | an outline → DeckCraft slides (+ transition previews) → pdf handout; or an HTML deck with `deck3d` instead | DeckCraft, PdfCraft |\n| `craft-photo-pipeline` | RAW\u002Fphoto → LightCraft develop + denoise → PhotoCraft retouch → web\u002Fprint export set | LightCraft, PhotoCraft |\n| `craft-data-visual` | data → GridCraft workbook with a formula-error read-back → chart → infographic → slide | GridCraft, VectorCraft, DesignCraft, DeckCraft |\n\nTwo splits to remember:\n\n- **FilmCraft vs HyperFrames.** FilmCraft edits footage on a timeline (cuts, tracks, captions, audio, export).\n  HyperFrames (`hyperframes-showreel`, package `video-production`) is HTML\u002Fcode-driven motion composition.\n  `craft-video-post` never re-authors a HyperFrames composition: it overlays the render when it has alpha\n  (`npx hyperframes render . --format mov`), otherwise places it as a full-frame segment.\n- **`craft-beat-cut` vs `hyperframes-showreel`.** Beat-synced cuts of a *footage timeline* → `craft-beat-cut`\n  (FilmCraft). A composition-driven showreel with scenes on the beat grid → `hyperframes-showreel`.\n\n- **`craft-doc-publish` vs `document-converter`.** Markdown → a templated DOCX\u002FPDF is `craft-doc-publish` by default (no\n  Docker; it keeps the template's cover, headers and footers). `document-converter` stays the choice for ingest and OCR of\n  existing PDF\u002FDOCX\u002FPPTX\u002FXLSX, round-trip editing (extract a DOCX to Markdown, edit, merge back), PlantUML and table-width\n  profiles — and is the fallback renderer when WordCraft cannot be provisioned.\n- **`craft-deck` renderers.** DeckCraft (`pptx`\u002F`pdf`) or `deck3d` (an HTML deck) — alternatives, never converted into each other.\n\nWorkflows reference sibling skills softly: if a sibling is not installed they name the package that provides\nit and either offer a degraded path or stop.\n\n## Hand-off formats between apps\n\n| From → to | Format | Why |\n|---|---|---|\n| audio → video editor | `wav` or `aiff` (PCM) | lossless, every app reads it |\n| motion graphics with transparency → video editor | `mov` **ProRes 4444** with `rgba` channels | the only common container that keeps alpha |\n| finished video (delivery) | `mp4` h264 + aac | what players and `pi-craft verify` expect |\n| raster image | `png` (lossless, alpha) or `tiff` | never re-compress through `jpg` between steps |\n| vector artwork | `svg`, or `pdf` for print | |\n| document | `pdf` for output, `docx`\u002F`odt` for editable hand-off | |\n\n## The loop — every step, every app\n\n1. **Plan** the file that this step must produce and the property that proves it is right (duration, size, alpha, page count…).\n2. **Discover** — never guess ids. `pi-craft \u003Capp> exec commands \u003Cword>` lists real ids and parameter schemas (the filter is `--filter`, `--search` or positional depending on the app — the app skill says which; PdfCraft uses `tools`; `describe \u003Cid>` exists for some apps). Ids change between alpha releases.\n3. **Execute** with `pi-craft \u003Capp> exec …` (bash route). A run that fails on one line can still leave a valid-looking but *wrong* result (a mistyped id in a FilmCraft script silently placed media at the wrong time and produced a 10 s file instead of 5 s).\n4. **Save** the project file (`--save`, `--save-as`, `--project`, `.scraft`, `.ecproj`, `.fcproj`… per app skill) so the next invocation continues from it — most CLIs keep no state between runs.\n5. **Verify** mechanically with `pi-craft verify` before using the output as the next step's input.\n\n```bash\npi-craft verify final.mp4 --duration 5±0.1 --has-video --has-audio --size 1920x1080\npi-craft verify title.mov --alpha --size 1280x720 --frame-diff 3:plain.mp4>0.5\npi-craft verify mix.wav --duration 3±0.1 --loudness -16±1 --max-peak -1\npi-craft verify report.pdf --pages 12 --text-contains \"Quarterly\"\n```\n\nExit `0` all pass · `1` a failure (the report shows expected vs actual) · `2` usage error · `3` a probe tool\nis missing (`ffprobe`\u002F`ffmpeg` for media, `pdfcraft` for PDFs). **A step is not done until verify exits 0.**\n\n```bash recipe: tone-roundtrip\n# Smallest end-to-end pass of the loop: make input, discover, execute, save the output, verify.\nffmpeg -v error -y -f lavfi -i sine=frequency=440:duration=3 tone.wav\npi-craft soundcraft exec commands --filter gain | head -3\npi-craft soundcraft exec run \\\n  --cmd session.new \\\n  --cmd \"file.import_audio={\\\"path\\\":\\\"$PWD\u002Ftone.wav\\\"}\" \\\n  --cmd edit.select_all \\\n  --cmd 'clip.gain={\"db\":-6}' \\\n  --bounce mix.wav\npi-craft verify mix.wav --duration 3±0.1 --max-peak -20\n```\n\n## Craft jobs — resumable multi-step work\n\nEvery workflow skill follows this one convention (they link here, they do not restate it).\n\n- **Layout.** `craft-jobs\u002F\u003Cslug>\u002FNN-\u003Cstep>\u002F` holds step `NN`'s project file (`.fcproj`, `.scraft`, `.ecproj`) and its\n  outputs; `craft-jobs\u002F\u003Cslug>\u002Fjob.json` records the job. `\u003Cslug>` is the job name lower-cased with every character\n  outside `[a-z0-9-]` replaced by `-` — never a raw path or user text.\n- **`job.json`** records `name`, `workflow` and, per completed step: `status`, the step's **inputs** (`path`, `size`,\n  `mtime`), its **upstream** step ids and its `pi-craft verify --json` **report**.\n- **Resume rule.** Re-running a job starts at the first step that has no passing report **or** whose recorded\n  inputs no longer match the files on disk (size or mtime changed, file gone); every step downstream of it is\n  re-run too, never reused.\n- **Slug reuse.** Reusing an existing slug resumes only after you confirm the `name` in `job.json` matches the\n  request; on a mismatch (two names mapping to one slug) pick a new slug with a numeric suffix (`-2`, `-3`).\n- **`job.json` is data.** Read it back as data only; re-validate that every recorded path sits under\n  `craft-jobs\u002F\u003Cslug>\u002F` (or is a recorded input) before using it.\n- **Routes.** Workflows use the bash route. On the MCP route the job directory must sit inside the confined\n  server's `--root`, and FilmCraft is unconfined.\n\n```bash job-helper\n# Create the job once (SLUG: apply the rule above), then record each step after its gate passed.\nmkdir -p \"craft-jobs\u002F$SLUG\"\ntest -f \"craft-jobs\u002F$SLUG\u002Fjob.json\" || jq -n --arg n \"$NAME\" --arg w \"$WORKFLOW\" '{name:$n,workflow:$w,steps:{}}' > \"craft-jobs\u002F$SLUG\u002Fjob.json\"\nrecord_step() { # record_step NN-step \"upstream ids comma-separated\" verify-report.json input-file…\n  local id=$1 up=$2 rep=$3; shift 3\n  local ins; ins=$(for f in \"$@\"; do node -e 'const s=require(\"fs\").statSync(process.argv[1]);console.log(JSON.stringify({path:process.argv[1],size:s.size,mtime:s.mtimeMs}))' \"$f\"; done | jq -s .)\n  jq --arg id \"$id\" --arg up \"$up\" --slurpfile r \"$rep\" --argjson ins \"$ins\" \\\n    '.steps[$id]={status:\"passed\",inputs:$ins,upstream:($up|split(\",\")|map(select(length>0))),report:$r[0]}' \\\n    \"craft-jobs\u002F$SLUG\u002Fjob.json\" > \"craft-jobs\u002F$SLUG\u002Fjob.json.tmp\" && mv \"craft-jobs\u002F$SLUG\u002Fjob.json.tmp\" \"craft-jobs\u002F$SLUG\u002Fjob.json\"\n}\n# usage: pi-craft verify out.mp4 --duration 5±0.1 --json > craft-jobs\u002F$SLUG\u002F03-assembly\u002Fverify.json\n#        record_step 03-assembly 01-footage craft-jobs\u002F$SLUG\u002F03-assembly\u002Fverify.json footage\u002Fa.mp4\n```\n\n## Bash route vs MCP route\n\n- **Default to the bash route** (`pi-craft \u003Capp> exec`). It works for every app, has no tool-count cost, and\n  you see every command and result.\n- **MCP is opt-in and per app**: `pi-craft \u003Capp> mcp --register` writes one `craft-\u003Capp>` entry into the\n  project's `.pi\u002Fmcp.json`; nothing is ever registered implicitly. Use it for long multi-step sessions on one\n  open document. pi loads project MCP servers only for a trusted project started in the project root.\n- **Confinement.** Six servers advertise path confinement (PhotoCraft, VectorCraft, EffectCraft, WordCraft,\n  SoundCraft, PdfCraft) and run confined to the project directory (`--root`). The other seven (FilmCraft,\n  LightCraft, DesignCraft, FigCraft, DeckCraft, CADCraft, GridCraft) can read and write any path the user\n  can, so `mcp` and `mcp --register` refuse them without `--allow-unconfined`. Say so to the user before using it.\n- **Tool budget.** LightCraft (330 tools) and PdfCraft (163) would flood the model context. Prefer the bash\n  route, or register with `--compact` (only helper tools are listed; every command stays reachable).\n- Issue MCP tool calls one at a time and wait for each result.\n\n## Out of scope\n\nDriving the desktop GUIs (`--bridge`, `--connect`, `ui_*` tools, `app` subcommands) is not supported: the\nproxy rejects those options and you must never launch a desktop app to \"see\" a result — verify files\ninstead. The one exception is a document the user has **open and visible in a dashboard editor pane**:\nthe `craft_control` tool (skill `craft-live-edit`, shipped with the craft-web plugin) edits that live tab; it\nnever launches anything and never opens a file. For any file that is not open, use `pi-craft`. Image\u002Fvideo *generation* belongs to ArtCraft Studio and `pi-nano-banana`, not to these apps.\n\n## Setup notes\n\n- Env: `\u003CAPP>_VERSION` pins a release (e.g. `FILMCRAFT_VERSION=0.8.0`), `\u003CAPP>_BIN` uses your own\n  binary, `CRAFT_HOME` moves the cache, `CRAFT_SOURCE=managed|launcher|auto`, `GITHUB_TOKEN` avoids API rate limits.\n- Linux needs glibc ≥ 2.35 (not musl\u002FAlpine). macOS and Windows: nothing extra. `ffmpeg`\u002F`ffprobe` are\n  optional system tools needed only by `pi-craft verify` media checks.\n- The ArtCraft *Craft Launcher* installs desktop apps only (no CLI), so the default `managed` source is the one that works headless.\n","# craft-studio — pick the right ArtCraft app, drive it headless, verify the result\n\nArtCraft ships thirteen native creative apps. Each has a headless `\u003Capp>-cli` with a self-describing\ncommand registry (≈6 000 commands in total) and a stdio MCP server. `pi-craft` provisions those CLIs on\nfirst use (checksum-verified, no desktop app, nothing installed system-wide) and gives you one command\nsurface for all of them. **This skill chooses the app and owns the loop; each app has its own skill\nfor its dialect, traps and recipes — read it before running anything in that app.**\n\n```bash\npi-craft apps                 # the 13 apps (offline)\npi-craft status               # what is installed, cache size, active source (never downloads)\npi-craft install soundcraft filmcraft     # optional pre-provisioning; every \u003Capp> command also provisions on demand\npi-craft \u003Capp> exec \u003Cargs…>   # run \u003Capp>-cli with \u003Cargs…> verbatim — the bash route\npi-craft verify \u003Cfile> …      # mechanical output checks (below)\n```\n\n## Which app for which job\n\n| App | Use it for | Reads \u002F writes | Skill |\n|---|---|---|---|\n| `photocraft` | raster editing: crop, resize, colour, masks, layers, content-aware fill; pairs with `pi-nano-banana` | png jpg webp tif psd | `photocraft` |\n| `lightcraft` | RAW development, exposure\u002Fcolour grading, denoise, HDR\u002Fpanorama merge | dng\u002Fraw → jpg png tif | `lightcraft` |\n| `vectorcraft` | vector illustration, logos, icons, SVG\u002FPDF export | svg pdf png | `vectorcraft` |\n| `figcraft` | UI\u002Finterface design: frames, components, export of assets | fig, svg png pdf | `figcraft` |\n| `designcraft` | page layout \u002F DTP: stories, styles, multi-page PDF | pdf png | `designcraft` |\n| `filmcraft` | video editing: import, sequence, timeline, h264 export | mp4 mov (in) → mp4 | `filmcraft` |\n| `effectcraft` | motion graphics: comps, animated text, effects, **alpha** renders | project → mov ProRes 4444 \u002F mp4 \u002F png | `effectcraft` |\n| `soundcraft` | audio editing, mixing, gain, bounce with loudness\u002Fpeak report | wav aiff (in\u002Fout) | `soundcraft` |\n| `pdfcraft` | PDF combine, split, extract, edit, render, text, audit | pdf → pdf png txt | `pdfcraft` |\n| `wordcraft` | word processing: DOCX\u002FODT\u002FRTF documents, conversion, PDF export | docx odt rtf html md pdf | `wordcraft` |\n| `deckcraft` | presentations: slides, shapes, tables, export | pptx → pdf png | `deckcraft` |\n| `gridcraft` | spreadsheets: formulas, evaluation, conversion | xlsx csv | `gridcraft` |\n| `cadcraft` | 2D CAD drawings: entities, layers, export | dxf dwg → pdf png svg | `cadcraft` |\n\nPicking rules: one app per file format family; if two apps could do it, take the one whose *native*\nformat the input already has (a DOCX goes to WordCraft, never through DeckCraft). Cross-app jobs\n(title card over a video, narration under a clip) are a chain of single-app steps with the hand-off\nformats below — no app embeds another.\n\n## Workflow skills — chains of apps for whole jobs\n\nWhen a job spans several apps or sibling skills, use a workflow skill instead of improvising the chain. Each\none has a step table (input → output), a `pi-craft verify` gate after every artefact step, a step 0 that checks\nwhich sibling skills are available, and the **Craft jobs** convention below for resuming.\n\n| Workflow skill | Use it for | Drives |\n|---|---|---|\n| `craft-video-post` | footage \u002F Veo clips → (redaction) → assembly with alpha overlays → captions from an SRT → mix → mp4 delivery | FilmCraft, SoundCraft, EffectCraft |\n| `craft-beat-cut` | cut footage on the music's downbeats with camera punches on the hits (`music-hits\u002F1`) | FilmCraft, SoundCraft |\n| `craft-podcast-master` | recording → per-speaker tracks, cleanup, loudness-targeted master, optional chapters | SoundCraft (+ FilmCraft mux) |\n| `craft-motion-titles` | names \u002F lines from an SRT or speaker-id → lower-third \u002F title alpha overlays on a video | EffectCraft, FilmCraft |\n| `craft-brand-kit` | a logo (svg, or a raster traced to vector) → colour\u002Fmono variants, png\u002Ftiff export set, one-page brand sheet, pdf package | VectorCraft, PhotoCraft, DesignCraft, PdfCraft |\n| `craft-doc-publish` | Markdown + frontmatter + the company template → templated DOCX and PDF with TOC, images and Mermaid, optional package\u002Fprotect | `pi-craft doc prepare`, WordCraft, PdfCraft |\n| `craft-deck` | an outline → DeckCraft slides (+ transition previews) → pdf handout; or an HTML deck with `deck3d` instead | DeckCraft, PdfCraft |\n| `craft-photo-pipeline` | RAW\u002Fphoto → LightCraft develop + denoise → PhotoCraft retouch → web\u002Fprint export set | LightCraft, PhotoCraft |\n| `craft-data-visual` | data → GridCraft workbook with a formula-error read-back → chart → infographic → slide | GridCraft, VectorCraft, DesignCraft, DeckCraft |\n\nTwo splits to remember:\n\n- **FilmCraft vs HyperFrames.** FilmCraft edits footage on a timeline (cuts, tracks, captions, audio, export).\n  HyperFrames (`hyperframes-showreel`, package `video-production`) is HTML\u002Fcode-driven motion composition.\n  `craft-video-post` never re-authors a HyperFrames composition: it overlays the render when it has alpha\n  (`npx hyperframes render . --format mov`), otherwise places it as a full-frame segment.\n- **`craft-beat-cut` vs `hyperframes-showreel`.** Beat-synced cuts of a *footage timeline* → `craft-beat-cut`\n  (FilmCraft). A composition-driven showreel with scenes on the beat grid → `hyperframes-showreel`.\n\n- **`craft-doc-publish` vs `document-converter`.** Markdown → a templated DOCX\u002FPDF is `craft-doc-publish` by default (no\n  Docker; it keeps the template's cover, headers and footers). `document-converter` stays the choice for ingest and OCR of\n  existing PDF\u002FDOCX\u002FPPTX\u002FXLSX, round-trip editing (extract a DOCX to Markdown, edit, merge back), PlantUML and table-width\n  profiles — and is the fallback renderer when WordCraft cannot be provisioned.\n- **`craft-deck` renderers.** DeckCraft (`pptx`\u002F`pdf`) or `deck3d` (an HTML deck) — alternatives, never converted into each other.\n\nWorkflows reference sibling skills softly: if a sibling is not installed they name the package that provides\nit and either offer a degraded path or stop.\n\n## Hand-off formats between apps\n\n| From → to | Format | Why |\n|---|---|---|\n| audio → video editor | `wav` or `aiff` (PCM) | lossless, every app reads it |\n| motion graphics with transparency → video editor | `mov` **ProRes 4444** with `rgba` channels | the only common container that keeps alpha |\n| finished video (delivery) | `mp4` h264 + aac | what players and `pi-craft verify` expect |\n| raster image | `png` (lossless, alpha) or `tiff` | never re-compress through `jpg` between steps |\n| vector artwork | `svg`, or `pdf` for print | |\n| document | `pdf` for output, `docx`\u002F`odt` for editable hand-off | |\n\n## The loop — every step, every app\n\n1. **Plan** the file that this step must produce and the property that proves it is right (duration, size, alpha, page count…).\n2. **Discover** — never guess ids. `pi-craft \u003Capp> exec commands \u003Cword>` lists real ids and parameter schemas (the filter is `--filter`, `--search` or positional depending on the app — the app skill says which; PdfCraft uses `tools`; `describe \u003Cid>` exists for some apps). Ids change between alpha releases.\n3. **Execute** with `pi-craft \u003Capp> exec …` (bash route). A run that fails on one line can still leave a valid-looking but *wrong* result (a mistyped id in a FilmCraft script silently placed media at the wrong time and produced a 10 s file instead of 5 s).\n4. **Save** the project file (`--save`, `--save-as`, `--project`, `.scraft`, `.ecproj`, `.fcproj`… per app skill) so the next invocation continues from it — most CLIs keep no state between runs.\n5. **Verify** mechanically with `pi-craft verify` before using the output as the next step's input.\n\n```bash\npi-craft verify final.mp4 --duration 5±0.1 --has-video --has-audio --size 1920x1080\npi-craft verify title.mov --alpha --size 1280x720 --frame-diff 3:plain.mp4>0.5\npi-craft verify mix.wav --duration 3±0.1 --loudness -16±1 --max-peak -1\npi-craft verify report.pdf --pages 12 --text-contains \"Quarterly\"\n```\n\nExit `0` all pass · `1` a failure (the report shows expected vs actual) · `2` usage error · `3` a probe tool\nis missing (`ffprobe`\u002F`ffmpeg` for media, `pdfcraft` for PDFs). **A step is not done until verify exits 0.**\n\n```bash recipe: tone-roundtrip\n# Smallest end-to-end pass of the loop: make input, discover, execute, save the output, verify.\nffmpeg -v error -y -f lavfi -i sine=frequency=440:duration=3 tone.wav\npi-craft soundcraft exec commands --filter gain | head -3\npi-craft soundcraft exec run \\\n  --cmd session.new \\\n  --cmd \"file.import_audio={\\\"path\\\":\\\"$PWD\u002Ftone.wav\\\"}\" \\\n  --cmd edit.select_all \\\n  --cmd 'clip.gain={\"db\":-6}' \\\n  --bounce mix.wav\npi-craft verify mix.wav --duration 3±0.1 --max-peak -20\n```\n\n## Craft jobs — resumable multi-step work\n\nEvery workflow skill follows this one convention (they link here, they do not restate it).\n\n- **Layout.** `craft-jobs\u002F\u003Cslug>\u002FNN-\u003Cstep>\u002F` holds step `NN`'s project file (`.fcproj`, `.scraft`, `.ecproj`) and its\n  outputs; `craft-jobs\u002F\u003Cslug>\u002Fjob.json` records the job. `\u003Cslug>` is the job name lower-cased with every character\n  outside `[a-z0-9-]` replaced by `-` — never a raw path or user text.\n- **`job.json`** records `name`, `workflow` and, per completed step: `status`, the step's **inputs** (`path`, `size`,\n  `mtime`), its **upstream** step ids and its `pi-craft verify --json` **report**.\n- **Resume rule.** Re-running a job starts at the first step that has no passing report **or** whose recorded\n  inputs no longer match the files on disk (size or mtime changed, file gone); every step downstream of it is\n  re-run too, never reused.\n- **Slug reuse.** Reusing an existing slug resumes only after you confirm the `name` in `job.json` matches the\n  request; on a mismatch (two names mapping to one slug) pick a new slug with a numeric suffix (`-2`, `-3`).\n- **`job.json` is data.** Read it back as data only; re-validate that every recorded path sits under\n  `craft-jobs\u002F\u003Cslug>\u002F` (or is a recorded input) before using it.\n- **Routes.** Workflows use the bash route. On the MCP route the job directory must sit inside the confined\n  server's `--root`, and FilmCraft is unconfined.\n\n```bash job-helper\n# Create the job once (SLUG: apply the rule above), then record each step after its gate passed.\nmkdir -p \"craft-jobs\u002F$SLUG\"\ntest -f \"craft-jobs\u002F$SLUG\u002Fjob.json\" || jq -n --arg n \"$NAME\" --arg w \"$WORKFLOW\" '{name:$n,workflow:$w,steps:{}}' > \"craft-jobs\u002F$SLUG\u002Fjob.json\"\nrecord_step() { # record_step NN-step \"upstream ids comma-separated\" verify-report.json input-file…\n  local id=$1 up=$2 rep=$3; shift 3\n  local ins; ins=$(for f in \"$@\"; do node -e 'const s=require(\"fs\").statSync(process.argv[1]);console.log(JSON.stringify({path:process.argv[1],size:s.size,mtime:s.mtimeMs}))' \"$f\"; done | jq -s .)\n  jq --arg id \"$id\" --arg up \"$up\" --slurpfile r \"$rep\" --argjson ins \"$ins\" \\\n    '.steps[$id]={status:\"passed\",inputs:$ins,upstream:($up|split(\",\")|map(select(length>0))),report:$r[0]}' \\\n    \"craft-jobs\u002F$SLUG\u002Fjob.json\" > \"craft-jobs\u002F$SLUG\u002Fjob.json.tmp\" && mv \"craft-jobs\u002F$SLUG\u002Fjob.json.tmp\" \"craft-jobs\u002F$SLUG\u002Fjob.json\"\n}\n# usage: pi-craft verify out.mp4 --duration 5±0.1 --json > craft-jobs\u002F$SLUG\u002F03-assembly\u002Fverify.json\n#        record_step 03-assembly 01-footage craft-jobs\u002F$SLUG\u002F03-assembly\u002Fverify.json footage\u002Fa.mp4\n```\n\n## Bash route vs MCP route\n\n- **Default to the bash route** (`pi-craft \u003Capp> exec`). It works for every app, has no tool-count cost, and\n  you see every command and result.\n- **MCP is opt-in and per app**: `pi-craft \u003Capp> mcp --register` writes one `craft-\u003Capp>` entry into the\n  project's `.pi\u002Fmcp.json`; nothing is ever registered implicitly. Use it for long multi-step sessions on one\n  open document. pi loads project MCP servers only for a trusted project started in the project root.\n- **Confinement.** Six servers advertise path confinement (PhotoCraft, VectorCraft, EffectCraft, WordCraft,\n  SoundCraft, PdfCraft) and run confined to the project directory (`--root`). The other seven (FilmCraft,\n  LightCraft, DesignCraft, FigCraft, DeckCraft, CADCraft, GridCraft) can read and write any path the user\n  can, so `mcp` and `mcp --register` refuse them without `--allow-unconfined`. Say so to the user before using it.\n- **Tool budget.** LightCraft (330 tools) and PdfCraft (163) would flood the model context. Prefer the bash\n  route, or register with `--compact` (only helper tools are listed; every command stays reachable).\n- Issue MCP tool calls one at a time and wait for each result.\n\n## Out of scope\n\nDriving the desktop GUIs (`--bridge`, `--connect`, `ui_*` tools, `app` subcommands) is not supported: the\nproxy rejects those options and you must never launch a desktop app to \"see\" a result — verify files\ninstead. The one exception is a document the user has **open and visible in a dashboard editor pane**:\nthe `craft_control` tool (skill `craft-live-edit`, shipped with the craft-web plugin) edits that live tab; it\nnever launches anything and never opens a file. For any file that is not open, use `pi-craft`. Image\u002Fvideo *generation* belongs to ArtCraft Studio and `pi-nano-banana`, not to these apps.\n\n## Setup notes\n\n- Env: `\u003CAPP>_VERSION` pins a release (e.g. `FILMCRAFT_VERSION=0.8.0`), `\u003CAPP>_BIN` uses your own\n  binary, `CRAFT_HOME` moves the cache, `CRAFT_SOURCE=managed|launcher|auto`, `GITHUB_TOKEN` avoids API rate limits.\n- Linux needs glibc ≥ 2.35 (not musl\u002FAlpine). macOS and Windows: nothing extra. `ffmpeg`\u002F`ffprobe` are\n  optional system tools needed only by `pi-craft verify` media checks.\n- The ArtCraft *Craft Launcher* installs desktop apps only (no CLI), so the default `managed` source is the one that works headless.\n",{"name":5,"description":7},"develop","fb9a5af356f540de4839ef851ebbe14bcce64c0f","packages\u002Fcraft-apps\u002F.pi\u002Fskills\u002Fcraft-studio",55,"https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology\u002Fpi-agent-dashboard","https:\u002F\u002Fpi-dashboard.dev\u002F","https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology","https:\u002F\u002Fwww.blackbelt.hu","2026-11-11 22:13:06",{"source":8,"skillName":5,"commands":66,"prompt":76,"zipAvailable":77},[67,70,73],{"tool":68,"command":69},"npx","npx skills add BlackBeltTechnology\u002Fpi-agent-dashboard --skill craft-studio",{"tool":71,"command":72},"bunx","bunx skills add BlackBeltTechnology\u002Fpi-agent-dashboard --skill craft-studio",{"tool":74,"command":75},"pnpm","pnpm dlx skills add BlackBeltTechnology\u002Fpi-agent-dashboard --skill craft-studio","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology\u002Fpi-agent-dashboard\u002Fblob\u002Fdevelop\u002Fpackages\u002Fcraft-apps\u002F.pi\u002Fskills\u002Fcraft-studio\u002FSKILL.md",true,[],[80,108,138,161,183,206],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":87,"publishedAt":51},"01M6HQYQ5B82AM5T9Y299S9CFY","youtube-srt","Download YouTube subtitles (SRT + timestamped TXT) for a channel, playlist or video via yt-dlp, no media download; optionally mine them into a categorized catalog (e.g. AI models by function, open weights, local runnability, hardware tier). Use on \"download the srt of this video\", \"transcripts of channel X for the last N months\", \"catalog the models AI Search talked about\", \"update docs\u002Fmodels\".","https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology\u002Fpi-agent-dashboard\u002Fblob\u002Fdevelop\u002Fpackages\u002Fvideo-transcription\u002F.pi\u002Fskills\u002Fyoutube-srt\u002FSKILL.md",[86],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[88,89,90,91,92,93,94,48,95,96,97,98,99,100,101,102,103,104,105,106,107],"youtube","srt","youtube srt","update","search","subtitles","dlp","Media","open","catalog","use","update docs","yt-dlp","local","mine","via","ai models","last","for","media download",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":118,"publishedAt":51},"01M6HQYJBKSXR55T5RSYNJQG4D","video-transcription","Transcribe video and audio files to SRT subtitles with speaker diarization using the Soniox (default) or AssemblyAI API. Use when the user wants to transcribe meetings, videos, or audio files. Supports MKV, MP4, MOV, M4A, MP3. Triggers on \"\u002Ftranscribe\", \"transcribe my meetings\", \"transcribe videos in ~\u002FMovies\", or any request to convert audio\u002Fvideo to text.","https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology\u002Fpi-agent-dashboard\u002Fblob\u002Fdevelop\u002Fpackages\u002Fvideo-transcription\u002F.pi\u002Fskills\u002Fvideo-transcription\u002FSKILL.md",[114,117],{"categoryNo":115,"categoryName":116,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[48,119,120,121,93,122,47,123,124,125,126,98,127,128,129,130,131,132,133,89,134,135,136,137],"transcription","video transcription","transcribe","api","convert","mp4","text","meetings","files","default","mp3","triggers","with","videos","assemblyai","my","srt subtitles","request","when",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":144,"publishedAt":51},"01M6HQYECMVDC5TDHHW22VC5RX","speaker-id","Name anonymous diarized SRT speakers from a persistent local voiceprint library and repair speaker drift; local, CPU-only, no API key. Triggers \"who is speaker 2\", \"put names on the transcript\", \"label the meeting SRT\", \"the diarization split one person into three\", \"enroll my voice\". Backed by the pi-voiceid CLI.","https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology\u002Fpi-agent-dashboard\u002Fblob\u002Fdevelop\u002Fpackages\u002Fvideo-transcription\u002F.pi\u002Fskills\u002Fspeaker-id\u002FSKILL.md",[],[145,146,147,148,122,149,150,151,152,153,154,101,130,155,156,157,158,89,159,160],"id","speaker id","cli","transcript","voice","pi","only","three","drift","repair","name","CPU","meeting","anonymous","split","person",{"skillNo":162,"name":163,"nameZh":6,"description":164,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":165,"categories":166,"keywords":168,"publishedAt":51},"01M6HQYAZWDXE9QJEG592E5PXK","veo-showreel-production-kit","Turn a video timeline + voiceover into a reproducible, sliceable Veo 3.1 prompt package with a consistency anchor and AI storyboard sketches.","https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology\u002Fpi-agent-dashboard\u002Fblob\u002Fdevelop\u002Fpackages\u002Fvideo-production\u002F.pi\u002Fskills\u002Fveo-showreel-production-kit\u002FSKILL.md",[167],{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},[169,170,171,172,173,174,175,48,176,177,178,179,131,180,181,182],"Production","veo","kit","veo showreel production kit","package","Reproducible","timeline","prompt","voiceover","storyboard","anchor","consistency","veo 3","2026",{"skillNo":184,"name":185,"nameZh":6,"description":186,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":187,"categories":188,"keywords":191,"publishedAt":51},"01M6HQY6TJ0X1ADDKYPMVJY6NV","veo-generator","Render a scripted video project into mp4 clips with the Google Veo 3.1 API. Reads a project's shot package (shots\u002F*.md), one clip per camera cut, reusing each shot's prompt and sketch — world anchor only with `--with-reference`, seed unless `--no-seed`. Use on \"render the Veo video for \u003Cproject>\", \"generate the videos from the shot scripts\", \"make the clips with Veo\".","https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology\u002Fpi-agent-dashboard\u002Fblob\u002Fdevelop\u002Fpackages\u002Fvideo-production\u002F.pi\u002Fskills\u002Fveo-generator\u002FSKILL.md",[189,190],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},[170,192,193,194,195,173,122,48,124,176,98,196,151,197,198,199,200,201,179,202,203,38,204,131,205,106,181],"generator","veo generator","google","generate","clip","sketch","camera","world","seed","project","cut","scripts","render","google veo",{"skillNo":207,"name":208,"nameZh":6,"description":209,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":210,"categories":211,"keywords":212,"publishedAt":51},"01M6HQY1K2NZJ3B2YHSJJPPVAF","hyperframes-showreel","Turn real screen and site footage into a rhythmic showreel rendered with HyperFrames: sampling, edit script, redacted clips, a generated composition, Veo only as additive FX, music edit + camera punches, delivery render and export QA. Use on \"make a showreel from these recordings\", \"build the HyperFrames video\", \"assemble the footage edit\", \"render and QA the showreel\".","https:\u002F\u002Fgithub.com\u002FBlackBeltTechnology\u002Fpi-agent-dashboard\u002Fblob\u002Fdevelop\u002Fpackages\u002Fvideo-production\u002F.pi\u002Fskills\u002Fhyperframes-showreel\u002FSKILL.md",[],[213,214,215,48,216,44,217,98,218,219,220,151,221,222,223,224,225,204,131,226],"hyperframes","hyperframes showreel","qa","Composition","generated","assemble","export","sampling","build","delivery","as","fx","screen","script"]