[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C5KTZ6SPBNAPHDPH2MPK58":3,"skill-same:01M6C5KTZ6SPBNAPHDPH2MPK58":100},{"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":23,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":6,"ownerHtmlUrl":57,"ownerBlogUrl":6,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M6C5KTZ6SPBNAPHDPH2MPK58","comfy-workflow-layout",null,"Auto-layout a ComfyUI workflow JSON with a layered DAG algorithm. Use when a workflow's nodes overlap, are messy or cramped, or were imported and need tidying before use.","laurigates\u002Fclaude-plugins","laurigates","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F13014001?v=4","01M6C59YHWS9C7KMXKSRX1YXNP","Lauri Gates","01M6C59YP2APG9YAM4DWYQYGFJ",59,"MIT","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fcomfyui-plugin\u002Fskills\u002Fcomfy-workflow-layout\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"workflow","comfy","layout","comfy workflow layout","2026","dag","when","layered","with","imported","Nodes","comfyui","auto","use","read","grep","haiku","json","Bash","2026-11-10 10:12:30",false,"---\ncreated: 2026-07-07\nmodified: 2026-10-10\nreviewed: 2026-07-07\nname: comfy-workflow-layout\ndescription: >-\n  Auto-layout a ComfyUI workflow JSON with a layered DAG algorithm. Use when a workflow's nodes overlap, are messy or cramped, or were imported and need tidying before use.\nallowed-tools: Bash, Read, Grep, Glob\nmodel: haiku\neffort: low\n---\n\n# ComfyUI workflow auto-layout\n\n`scripts\u002Flayout_workflow.py` runs a layered (Sugiyama-style) DAG layout\nover the nodes in a workflow JSON: median layering (each node sits at\nthe midpoint between its earliest and latest possible depth, so source\nand sink nodes spread across columns instead of piling up at the edges),\na barycenter sweep within each layer to reduce edge crossings, and a\ngroup-cohesion post-pass that clusters members of the same authored\ngroup contiguously within each column. Group bounding boxes are re-fit\naround their final members. Pure stdlib, no deps. Visual goal is \"the\neditor is readable again with comparable density to a hand-tuned\nlayout\" — link routing is left to ComfyUI.\n\nIn practice on Wan 2.2 workflows in this install, output bounding-box\narea ranges from −13% to +23% of a hand-arranged layout (typically\nwithin ±10%), with 0 node overlaps. Without median layering it would\nbe 2× larger.\n\n## When to Use This Skill\n\n| Use this skill when... | Use instead when... |\n|---|---|\n| A workflow's nodes overlap, are messy\u002Fcramped, or were imported and need tidying | Editing the graph's wiring\u002Flinks -> `comfy-workflow-json` |\n\n## Pipeline (default mode)\n\n1. **Detect group membership** by which nodes' centers sit in each\n   group's authored bounding box. Tie-break to the smallest group.\n2. **Absorb leaf singletons** — ungrouped nodes whose neighbors are\n   ≥2\u002F3 in one group join that group's membership for layout\n   purposes. Single-pass; central hub nodes (whose connections fan out\n   across many groups) stay as singletons.\n3. **Median layering** — each node's column index is the average of\n   its longest-path-from-sources and longest-path-from-sinks depth.\n   Source nodes whose only consumer is at depth 8 land near depth 7,\n   not 0. Sink nodes whose only producer is at depth 1 land near 1.\n4. **Barycenter sweep** within each layer to minimize edge crossings.\n5. **Group-cohesion clustering** — within each layer, re-permute so\n   nodes sharing a group sit contiguously. Cluster order within a\n   layer follows each cluster's median barycenter index.\n6. **Vertically center** each column around the layer band's\n   midpoint so short columns float to center rather than top-align.\n7. **Recompute group bounding boxes** to wrap the final positions\n   (skip with `--no-groups`).\n\n`--strict-groups` switches to a two-level mode where each group becomes\nits own bounded super-node region with a separate outer DAG between\ngroups. Looser packing (typically +30-50% area) but stronger visual\nseparation between groups; reach for it when the user prefers visible\ngroup containers over compactness.\n\n## When to reach for this\n\n- User pulled a workflow from somewhere and the nodes overlap.\n- A workflow grew organically and is now unreadable in the editor.\n- After bulk-editing a graph (added a Phantom tail, swapped sampler\n  versions, refactored loaders) and the layout no longer reflects flow.\n- User says \"auto-arrange\", \"lay out\", \"clean up positions\", or\n  references the script by name.\n\nSkip this for ~5–8 node workflows — hand-arrange is faster and the\nresult will be tidier than what a layered algorithm produces on a tiny\ngraph.\n\n## Default invocation (safe A\u002FB)\n\nFrom the install root, run the script via the venv on the target file:\n\n```\n.venv\u002Fbin\u002Fpython scripts\u002Flayout_workflow.py user\u002Fdefault\u002Fworkflows\u002F2026-05\u002F\u003Cfile>.json\n```\n\nThis writes `\u003Cfile>-laidout.json` next to the original. Open **both** in\nComfyUI side-by-side (or load one, eyeball, then load the other) and\nconfirm the laid-out version is actually better before committing to\noverwrite. ComfyUI picks up the new file on page reload — no service\nrestart needed.\n\nThe script prints a one-line summary on completion\n(`42 nodes (cohesion, 3 absorbed), 13 layers, 7 groups recomputed -> ...`).\nPass `--quiet` to suppress it. In `--strict-groups` mode the summary\nshape is different (`42 nodes in 8 supers (7 group + 1 singleton (3\nabsorbed)), 5 outer layers, ...`).\n\n## Tune the spacing\n\nDefaults are `--col-gap 40` (pixels between layers) and `--row-gap 20`\n(pixels between nodes within a layer). If the output looks cramped,\nraise the gaps. If sparse, lower them.\n\n```\n.venv\u002Fbin\u002Fpython scripts\u002Flayout_workflow.py --col-gap 60 --row-gap 30 \\\n  user\u002Fdefault\u002Fworkflows\u002F2026-05\u002F\u003Cfile>.json\n```\n\nUseful starting points: 30\u002F15 for tight, 40\u002F20 default, 60\u002F30 for roomy,\n80\u002F40 for very large workflows where the user wants whitespace. In\n`--strict-groups` mode the inner gap uses these values; the outer\nbetween-groups gap is fixed at 60×80 (source constants `SUPER_COL_GAP`\n\u002F `SUPER_ROW_GAP`).\n\n## Mode flags\n\n```\n.venv\u002Fbin\u002Fpython scripts\u002Flayout_workflow.py --strict-groups \u003Cfile>.json\n```\n\nTwo-level group-aware layout: each group renders as its own bounded\nregion in a separate outer DAG. Looser packing, stronger group\nseparation. Use when the user wants visible group containers more than\ncompactness.\n\n```\n.venv\u002Fbin\u002Fpython scripts\u002Flayout_workflow.py --no-cohesion \u003Cfile>.json\n```\n\nSkip the group-cohesion pass — group members may scatter across the\nlayer based purely on barycenter. Useful when a workflow has groups\nthat fight DAG topology (e.g. one logical \"group\" spans many depths).\n\n```\n.venv\u002Fbin\u002Fpython scripts\u002Flayout_workflow.py --no-absorb \u003Cfile>.json\n```\n\nDon't absorb ungrouped leaf nodes into adjacent groups. Useful when\nthe user has deliberately placed nodes outside a group and wants the\nlayout to honor that.\n\n```\n.venv\u002Fbin\u002Fpython scripts\u002Flayout_workflow.py --no-groups \u003Cfile>.json\n```\n\nSkip the group bounding-box recompute. Positions still shift, so the\nold bounding boxes will end up wrong — only useful for debugging.\n\n## Commit the result\n\nAfter confirming the laid-out version looks good, two paths:\n\n```\nmv user\u002Fdefault\u002Fworkflows\u002F2026-05\u002F\u003Cfile>-laidout.json \\\n   user\u002Fdefault\u002Fworkflows\u002F2026-05\u002F\u003Cfile>.json\n```\n\nOr re-run with `--in-place` to overwrite directly (no A\u002FB copy\nproduced):\n\n```\n.venv\u002Fbin\u002Fpython scripts\u002Flayout_workflow.py --in-place \\\n  user\u002Fdefault\u002Fworkflows\u002F2026-05\u002F\u003Cfile>.json\n```\n\n`--in-place` and `-o \u002F --output` are mutually exclusive.\n\nPer project `CLAUDE.md`, do not commit workflow JSONs unless asked —\nworkflows under `user\u002Fdefault\u002Fworkflows\u002F` are user data, intentionally\nuntracked.\n\n## Batch a directory\n\nOnce the user confirms one workflow lays out cleanly, the rest in the\nsame bucket usually follow. Batch with `--in-place`:\n\n```\nfor f in user\u002Fdefault\u002Fworkflows\u002F\u003Cbucket>\u002F2026-05\u002F*.json; do\n  case \"$f\" in *-laidout.json) continue ;; esac\n  .venv\u002Fbin\u002Fpython scripts\u002Flayout_workflow.py --in-place --verify \"$f\"\ndone\n```\n\nThe `case` skips already-laid-out outputs left over from earlier A\u002FB\nruns. `--verify` aborts on overlap, which is cheap and reasonable for\nbatch jobs. **Always run on one workflow first**, eyeball it, then\nbatch — unwinding 30 simultaneously-broken layouts is painful.\n\n## What gets preserved vs rewritten\n\n| Preserved | Rewritten |\n|---|---|\n| `id`, `revision`, `last_node_id`, `last_link_id` | `nodes[*].pos` |\n| `links`, `config`, `extra`, `version` | `groups[*].bounding` |\n| `nodes[*].size`, `.order`, `.widgets_values` | |\n| `nodes[*].inputs`, `.outputs` | |\n| `nodes[*].title`, `.properties`, `.flags` | |\n| `nodes[*].mode`, `.color`, `.bgcolor` | |\n| `groups[*].title`, `.color` | |\n\nOnly positions move. Wiring, widget values, sizes, group identities,\nand colors all carry through unchanged. Group **membership** is\ndetected from the original bounding boxes; the new bounding box is\nrewritten to wrap the same members in their final positions.\n\nPass `--verify` to assert no node overlaps in the output before\nwriting. Cheap; reach for it when batching or when iterating on gap\nvalues.\n\n## Known limitations\n\n1. **Reroute nodes** consume a full layer's column width even though\n   they're tiny. Acceptable cost; don't try to special-case them.\n2. **Note placement** is \"above the nearest old neighbor\" using\n   original positions. If multiple Notes share a buddy they stack and\n   may collide with the layer above. Hand-fix in the editor if it\n   bothers you.\n3. **Cycles in the underlying node DAG** abort the script with an\n   error. A valid ComfyUI workflow shouldn't have any; if you hit one,\n   the workflow itself is broken. Cycles in the *super* graph\n   (`--strict-groups` mode, groups feeding each other through\n   different members) are silently broken with a DFS feedback-arc-set\n   pass; the dropped edges only affect outer-layer assignment, not the\n   final node positions or wiring.\n4. **Hand-tuned layouts that overlap groups deliberately** (e.g. two\n   groups sharing a horizontal column with one above the other) won't\n   be reproduced — the algorithm doesn't pack groups in 2D. The\n   default mode comes within ±10% of hand-tuned area on average; the\n   `--strict-groups` mode is typically +30-50% larger because each\n   group claims its own outer cell.\n5. **Workflows where most nodes are ungrouped** still benefit from\n   median layering and cohesion, but the absorption step has nothing\n   to absorb so the singleton spread is whatever it is. Authoring\n   groups around the leaf clusters before running the script gives\n   noticeably better output.\n\n## When NOT to use this\n\n- Small workflows (~5–8 nodes). Hand-arrange is faster.\n- The user deliberately designed a non-DAG layout for visual reasons —\n  e.g. parallel branches arranged top-to-bottom for clarity, or a\n  \"before \u002F after\" comparison stacked vertically. Auto-layout will\n  collapse parallel branches according to their depth.\n- The workflow uses `Note` nodes as section labels with hand-placed\n  positioning. They survive but the placement won't match the user's\n  intent.\n\n## After running\n\nSurface the output path so the user can navigate to it directly. After\noverwriting in place, remind the user to **reload the page** in ComfyUI\nto pick up the new positions — no service restart needed (and don't\nrestart, per project `CLAUDE.md` that would kill any running\ngeneration). After producing `\u003Cstem>-laidout.json`, offer to `mv` it\nover the original once the user confirms the new layout looks good.\n","# ComfyUI workflow auto-layout\n\n`scripts\u002Flayout_workflow.py` runs a layered (Sugiyama-style) DAG layout\nover the nodes in a workflow JSON: median layering (each node sits at\nthe midpoint between its earliest and latest possible depth, so source\nand sink nodes spread across columns instead of piling up at the edges),\na barycenter sweep within each layer to reduce edge crossings, and a\ngroup-cohesion post-pass that clusters members of the same authored\ngroup contiguously within each column. Group bounding boxes are re-fit\naround their final members. Pure stdlib, no deps. Visual goal is \"the\neditor is readable again with comparable density to a hand-tuned\nlayout\" — link routing is left to ComfyUI.\n\nIn practice on Wan 2.2 workflows in this install, output bounding-box\narea ranges from −13% to +23% of a hand-arranged layout (typically\nwithin ±10%), with 0 node overlaps. Without median layering it would\nbe 2× larger.\n\n## When to Use This Skill\n\n| Use this skill when... | Use instead when... |\n|---|---|\n| A workflow's nodes overlap, are messy\u002Fcramped, or were imported and need tidying | Editing the graph's wiring\u002Flinks -> `comfy-workflow-json` |\n\n## Pipeline (default mode)\n\n1. **Detect group membership** by which nodes' centers sit in each\n   group's authored bounding box. Tie-break to the smallest group.\n2. **Absorb leaf singletons** — ungrouped nodes whose neighbors are\n   ≥2\u002F3 in one group join that group's membership for layout\n   purposes. Single-pass; central hub nodes (whose connections fan out\n   across many groups) stay as singletons.\n3. **Median layering** — each node's column index is the average of\n   its longest-path-from-sources and longest-path-from-sinks depth.\n   Source nodes whose only consumer is at depth 8 land near depth 7,\n   not 0. Sink nodes whose only producer is at depth 1 land near 1.\n4. **Barycenter sweep** within each layer to minimize edge crossings.\n5. **Group-cohesion clustering** — within each layer, re-permute so\n   nodes sharing a group sit contiguously. Cluster order within a\n   layer follows each cluster's median barycenter index.\n6. **Vertically center** each column around the layer band's\n   midpoint so short columns float to center rather than top-align.\n7. **Recompute group bounding boxes** to wrap the final positions\n   (skip with `--no-groups`).\n\n`--strict-groups` switches to a two-level mode where each group becomes\nits own bounded super-node region with a separate outer DAG between\ngroups. Looser packing (typically +30-50% area) but stronger visual\nseparation between groups; reach for it when the user prefers visible\ngroup containers over compactness.\n\n## When to reach for this\n\n- User pulled a workflow from somewhere and the nodes overlap.\n- A workflow grew organically and is now unreadable in the editor.\n- After bulk-editing a graph (added a Phantom tail, swapped sampler\n  versions, refactored loaders) and the layout no longer reflects flow.\n- User says \"auto-arrange\", \"lay out\", \"clean up positions\", or\n  references the script by name.\n\nSkip this for ~5–8 node workflows — hand-arrange is faster and the\nresult will be tidier than what a layered algorithm produces on a tiny\ngraph.\n\n## Default invocation (safe A\u002FB)\n\nFrom the install root, run the script via the venv on the target file:\n\n```\n.venv\u002Fbin\u002Fpython scripts\u002Flayout_workflow.py user\u002Fdefault\u002Fworkflows\u002F2026-05\u002F\u003Cfile>.json\n```\n\nThis writes `\u003Cfile>-laidout.json` next to the original. Open **both** in\nComfyUI side-by-side (or load one, eyeball, then load the other) and\nconfirm the laid-out version is actually better before committing to\noverwrite. ComfyUI picks up the new file on page reload — no service\nrestart needed.\n\nThe script prints a one-line summary on completion\n(`42 nodes (cohesion, 3 absorbed), 13 layers, 7 groups recomputed -> ...`).\nPass `--quiet` to suppress it. In `--strict-groups` mode the summary\nshape is different (`42 nodes in 8 supers (7 group + 1 singleton (3\nabsorbed)), 5 outer layers, ...`).\n\n## Tune the spacing\n\nDefaults are `--col-gap 40` (pixels between layers) and `--row-gap 20`\n(pixels between nodes within a layer). If the output looks cramped,\nraise the gaps. If sparse, lower them.\n\n```\n.venv\u002Fbin\u002Fpython scripts\u002Flayout_workflow.py --col-gap 60 --row-gap 30 \\\n  user\u002Fdefault\u002Fworkflows\u002F2026-05\u002F\u003Cfile>.json\n```\n\nUseful starting points: 30\u002F15 for tight, 40\u002F20 default, 60\u002F30 for roomy,\n80\u002F40 for very large workflows where the user wants whitespace. In\n`--strict-groups` mode the inner gap uses these values; the outer\nbetween-groups gap is fixed at 60×80 (source constants `SUPER_COL_GAP`\n\u002F `SUPER_ROW_GAP`).\n\n## Mode flags\n\n```\n.venv\u002Fbin\u002Fpython scripts\u002Flayout_workflow.py --strict-groups \u003Cfile>.json\n```\n\nTwo-level group-aware layout: each group renders as its own bounded\nregion in a separate outer DAG. Looser packing, stronger group\nseparation. Use when the user wants visible group containers more than\ncompactness.\n\n```\n.venv\u002Fbin\u002Fpython scripts\u002Flayout_workflow.py --no-cohesion \u003Cfile>.json\n```\n\nSkip the group-cohesion pass — group members may scatter across the\nlayer based purely on barycenter. Useful when a workflow has groups\nthat fight DAG topology (e.g. one logical \"group\" spans many depths).\n\n```\n.venv\u002Fbin\u002Fpython scripts\u002Flayout_workflow.py --no-absorb \u003Cfile>.json\n```\n\nDon't absorb ungrouped leaf nodes into adjacent groups. Useful when\nthe user has deliberately placed nodes outside a group and wants the\nlayout to honor that.\n\n```\n.venv\u002Fbin\u002Fpython scripts\u002Flayout_workflow.py --no-groups \u003Cfile>.json\n```\n\nSkip the group bounding-box recompute. Positions still shift, so the\nold bounding boxes will end up wrong — only useful for debugging.\n\n## Commit the result\n\nAfter confirming the laid-out version looks good, two paths:\n\n```\nmv user\u002Fdefault\u002Fworkflows\u002F2026-05\u002F\u003Cfile>-laidout.json \\\n   user\u002Fdefault\u002Fworkflows\u002F2026-05\u002F\u003Cfile>.json\n```\n\nOr re-run with `--in-place` to overwrite directly (no A\u002FB copy\nproduced):\n\n```\n.venv\u002Fbin\u002Fpython scripts\u002Flayout_workflow.py --in-place \\\n  user\u002Fdefault\u002Fworkflows\u002F2026-05\u002F\u003Cfile>.json\n```\n\n`--in-place` and `-o \u002F --output` are mutually exclusive.\n\nPer project `CLAUDE.md`, do not commit workflow JSONs unless asked —\nworkflows under `user\u002Fdefault\u002Fworkflows\u002F` are user data, intentionally\nuntracked.\n\n## Batch a directory\n\nOnce the user confirms one workflow lays out cleanly, the rest in the\nsame bucket usually follow. Batch with `--in-place`:\n\n```\nfor f in user\u002Fdefault\u002Fworkflows\u002F\u003Cbucket>\u002F2026-05\u002F*.json; do\n  case \"$f\" in *-laidout.json) continue ;; esac\n  .venv\u002Fbin\u002Fpython scripts\u002Flayout_workflow.py --in-place --verify \"$f\"\ndone\n```\n\nThe `case` skips already-laid-out outputs left over from earlier A\u002FB\nruns. `--verify` aborts on overlap, which is cheap and reasonable for\nbatch jobs. **Always run on one workflow first**, eyeball it, then\nbatch — unwinding 30 simultaneously-broken layouts is painful.\n\n## What gets preserved vs rewritten\n\n| Preserved | Rewritten |\n|---|---|\n| `id`, `revision`, `last_node_id`, `last_link_id` | `nodes[*].pos` |\n| `links`, `config`, `extra`, `version` | `groups[*].bounding` |\n| `nodes[*].size`, `.order`, `.widgets_values` | |\n| `nodes[*].inputs`, `.outputs` | |\n| `nodes[*].title`, `.properties`, `.flags` | |\n| `nodes[*].mode`, `.color`, `.bgcolor` | |\n| `groups[*].title`, `.color` | |\n\nOnly positions move. Wiring, widget values, sizes, group identities,\nand colors all carry through unchanged. Group **membership** is\ndetected from the original bounding boxes; the new bounding box is\nrewritten to wrap the same members in their final positions.\n\nPass `--verify` to assert no node overlaps in the output before\nwriting. Cheap; reach for it when batching or when iterating on gap\nvalues.\n\n## Known limitations\n\n1. **Reroute nodes** consume a full layer's column width even though\n   they're tiny. Acceptable cost; don't try to special-case them.\n2. **Note placement** is \"above the nearest old neighbor\" using\n   original positions. If multiple Notes share a buddy they stack and\n   may collide with the layer above. Hand-fix in the editor if it\n   bothers you.\n3. **Cycles in the underlying node DAG** abort the script with an\n   error. A valid ComfyUI workflow shouldn't have any; if you hit one,\n   the workflow itself is broken. Cycles in the *super* graph\n   (`--strict-groups` mode, groups feeding each other through\n   different members) are silently broken with a DFS feedback-arc-set\n   pass; the dropped edges only affect outer-layer assignment, not the\n   final node positions or wiring.\n4. **Hand-tuned layouts that overlap groups deliberately** (e.g. two\n   groups sharing a horizontal column with one above the other) won't\n   be reproduced — the algorithm doesn't pack groups in 2D. The\n   default mode comes within ±10% of hand-tuned area on average; the\n   `--strict-groups` mode is typically +30-50% larger because each\n   group claims its own outer cell.\n5. **Workflows where most nodes are ungrouped** still benefit from\n   median layering and cohesion, but the absorption step has nothing\n   to absorb so the singleton spread is whatever it is. Authoring\n   groups around the leaf clusters before running the script gives\n   noticeably better output.\n\n## When NOT to use this\n\n- Small workflows (~5–8 nodes). Hand-arrange is faster.\n- The user deliberately designed a non-DAG layout for visual reasons —\n  e.g. parallel branches arranged top-to-bottom for clarity, or a\n  \"before \u002F after\" comparison stacked vertically. Auto-layout will\n  collapse parallel branches according to their depth.\n- The workflow uses `Note` nodes as section labels with hand-placed\n  positioning. They survive but the placement won't match the user's\n  intent.\n\n## After running\n\nSurface the output path so the user can navigate to it directly. After\noverwriting in place, remind the user to **reload the page** in ComfyUI\nto pick up the new positions — no service restart needed (and don't\nrestart, per project `CLAUDE.md` that would kill any running\ngeneration). After producing `\u003Cstem>-laidout.json`, offer to `mv` it\nover the original once the user confirms the new layout looks good.\n",{"name":5,"model":40,"effort":48,"created":49,"modified":50,"reviewed":49,"description":7,"allowed-tools":51},"low",1783382400000,1791590400000,"Bash, Read, Grep, Glob","main","bdd0582f1a2ba53d21061835bfd72d45f2f954f4","comfyui-plugin\u002Fskills\u002Fcomfy-workflow-layout",6,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins","https:\u002F\u002Fgithub.com\u002Flaurigates","Linux enthusiast, cloud engineer, neovim addict, electronics hobbyist.","2026-11-12 03:43:32",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add laurigates\u002Fclaude-plugins --skill comfy-workflow-layout",{"tool":66,"command":67},"bunx","bunx skills add laurigates\u002Fclaude-plugins --skill comfy-workflow-layout",{"tool":69,"command":70},"pnpm","pnpm dlx skills add laurigates\u002Fclaude-plugins --skill comfy-workflow-layout","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fcomfyui-plugin\u002Fskills\u002Fcomfy-workflow-layout\u002FSKILL.md",true,[74,80,84,88,92,96],{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"ADVANCED.md","REFERENCE","参考文档",4329,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-skill-developer\u002FADVANCED.md",{"path":81,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":82,"sourceHtmlUrl":83},"HOOK_MECHANISMS.md",8099,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-skill-developer\u002FHOOK_MECHANISMS.md",{"path":85,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":86,"sourceHtmlUrl":87},"PATTERNS_LIBRARY.md",3347,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-skill-developer\u002FPATTERNS_LIBRARY.md",{"path":89,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":90,"sourceHtmlUrl":91},"SKILL_RULES_REFERENCE.md",8692,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-skill-developer\u002FSKILL_RULES_REFERENCE.md",{"path":93,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":94,"sourceHtmlUrl":95},"TRIGGER_TYPES.md",7769,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-skill-developer\u002FTRIGGER_TYPES.md",{"path":97,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":98,"sourceHtmlUrl":99},"TROUBLESHOOTING.md",10076,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-skill-developer\u002FTROUBLESHOOTING.md",[101,125,146,162,184,214],{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":110,"publishedAt":43},"01M70PFHMH9ADY0CRE6047Y4B2","kitty-show-image","Show the user an image with a note on what to judge, via a file send or a labelled kitty tab. Use when the user must see an image, or icat fails with no \u002Fdev\u002Ftty.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-show-image\u002FSKILL.md",[107],{"categoryNo":108,"categoryName":109,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",[111,112,113,114,115,116,117,118,119,120,37,30,42,121,122,32,123,124,28,38],"show","kitty show image","image","kitty","show image","ls","get","send","open","dev","file","text","xdg","via",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":131,"publishedAt":43},"01M70PFEN18HKQ4RCQ1VPGMPTB","kitty-session-persistence","Snapshot and restore kitty terminal sessions on macOS. Use when surviving WindowServer hangs without losing tabs, configuring snapshots, or restoring after a force-reboot.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-session-persistence\u002FSKILL.md",[],[114,132,133,134,135,136,30,42,137,138,139,28,38,140,141,142,143,144,145,37],"kitty session persistence","session","persistence","false","snapshots","uname","reboot","terminal","write","edit","snapshot","macos","sessions","restore",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":152,"publishedAt":43},"01M70PFC77XGXCVQ1543VGZHYR","kitty-remote-control","Safe kitty remote control from an agent — read panes with kitty @ ls\u002Fget-text, notify, and never mutate the live terminal unasked. Use when running inside kitty.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-remote-control\u002FSKILL.md",[],[153,154,114,155,156,116,157,158,117,159,160,37,30,161,42,122,32,139,28,38],"kitty remote control","remote","control","remote control","running","never","panes","notify","query",{"skillNo":163,"name":164,"nameZh":6,"description":165,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":166,"categories":167,"keywords":168,"publishedAt":43},"01M70P6WVMCT5JG4SACTM69AF9","docs-reference-check","Dangling doc-reference gate: flag markdown naming repo paths or relative links that no longer exist. Use when docs cite moved\u002Fdeleted files, or wiring a doc-drift lint.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fdocumentation-plugin\u002Fskills\u002Fdocs-reference-check\u002FSKILL.md",[],[169,170,171,172,173,174,175,176,177,36,37,30,42,178,121,179,180,181,182,183],"docs reference check","check","reference check","reference","docs","links","python3","repo","files","drift","lint","wiring","chezmoi","references","cp",{"skillNo":185,"name":186,"nameZh":6,"description":187,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":188,"categories":189,"keywords":199,"publishedAt":43},"01M6C6NDE7DAQGNWSF22J5CJ0Z","youtube-upload","Upload a video to YouTube via the Data API v3 and edit its title, description, tags or thumbnail afterwards. Use when publishing or retitling a YouTube video.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fyoutube-plugin\u002Fskills\u002Fyoutube-upload\u002FSKILL.md",[190,193,194],{"categoryNo":191,"categoryName":192,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":108,"categoryName":109,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":195,"categoryName":196,"taxonomyType":197,"taxonomyTypeDesc":198},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[200,201,202,203,175,204,38,205,141,206,207,208,37,42,121,209,210,30,211,212,213,124,28],"youtube upload","upload","youtube","Video","run","uv run","publishing","data","uv","api","v3","tags","id","title",{"skillNo":215,"name":216,"nameZh":6,"description":217,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":218,"categories":219,"keywords":221,"publishedAt":43},"01M6C6NABWW1X58KJJM4F6GQMQ","youtube-studio-share","Share a private YouTube video with a whole Google Workspace organization by scripting YouTube Studio in the browser. Use when a video must be org-only.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fyoutube-plugin\u002Fskills\u002Fyoutube-studio-share\u002FSKILL.md",[220],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[222,223,224,225,202,203,226,227,228,229,230,38,231,232,233,234,37,235,30,32,236,28],"youtube studio share","share","youtube studio","studio","browser","javascript","scripting","google workspace","workspace","tool","google","only","MCP","chrome","organization"]