[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C5K9MTA391QXHPBXSWWNM4":3,"skill-same:01M6C5K9MTA391QXHPBXSWWNM4":89},{"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":18,"publishedAt":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":6,"ownerHtmlUrl":54,"ownerBlogUrl":6,"ownerDescription":55,"updatedAt":56,"install":57,"resources":70},"01M6C5K9MTA391QXHPBXSWWNM4","comfy-math-strings",null,"ComfyUI compute\u002Fstring nodes: constants, sliders, math expressions, string concat\u002Fsplit\u002Freplace\u002Fregex, type conversion, JSON\u002Flist utilities. Use when computing a value or assembling a string in a workflow.","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-math-strings\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"math","strings","comfy math strings","comfy","compute","replace","2026","constants","when","value","split","type","regex","workflow","Nodes","conversion","comfyui","use","list","read","grep","json","2026-11-10 10:12:30",false,"---\ncreated: 2026-07-07\nmodified: 2026-07-31\nreviewed: 2026-07-07\nname: comfy-math-strings\ndescription: >-\n  ComfyUI compute\u002Fstring nodes: constants, sliders, math expressions, string concat\u002Fsplit\u002Freplace\u002Fregex, type conversion, JSON\u002Flist utilities. Use when computing a value or assembling a string in a workflow.\nallowed-tools: Read, Grep, Glob\n---\n\n# ComfyUI math & strings\n\nCompute and assemble. Numbers in, numbers out; strings in, strings\nout; primitives that hold a constant; sliders that expose a tunable.\n\nThe split:\n\n| Pack | Niche |\n|---|---|\n| `comfyui-kjnodes` | Primitives (BOOL \u002F INT \u002F Float \u002F String \u002F Multiline), SimpleCalculatorKJ, JoinStrings \u002F JoinStringMulti, AppendStringsToList, Something\u002FWidgetToString |\n| `comfyui_essentials` | Math hierarchy: SimpleMath \u002F SimpleMathFloat \u002F SimpleMathInt \u002F SimpleMathDual (AST-based) |\n| `comfyui-custom-scripts` (pysssss) | `MathExpression` (full numpy + math imports), `StringFunction` (regex), `StringNodes` (split\u002Fcase\u002Ftrim) |\n| `comfyui-mxtoolkit` | `mxSeed`, `mxSlider`, `mxSlider2D` widget-driven values |\n| `bjornulf_custom_nodes` | `AnythingToText` \u002F `AnythingToInt` \u002F `AnythingToFloat`, TextReplace, CombineTexts, RandomLineFromInput |\n| `ComfyUI-Crystools` | `CBoolean` \u002F `CInteger` \u002F `CFloat` \u002F `CText` \u002F `CTextML` primitives, `CJsonFile` \u002F `CJsonExtractor` \u002F `CListAny` \u002F `CListString` |\n| `comfyui-easy-use` | `easy string` \u002F `easy int` \u002F `easy float` identity nodes, `easy rangeInt` |\n| `comfyui-dream-project` | `DreamCalculation`, `DreamLinear`, sine\u002Fsaw\u002Ftriangle waves (animation-flavored, see \"out of scope\") |\n| `comfyui_yvann-nodes` | `FloatToInt`, `InvertFloats`, `MaskToFloat`, `FloatsToWeightsStrategy` |\n\n## When to Use This Skill\n\n| Use this skill when... | Use instead when... |\n|---|---|\n| Computing a value or assembling a string in a workflow | Forming a boolean from that computation -> `comfy-conditionals` |\n| Converting between types (anything -> int\u002Ffloat\u002Fstring) | Displaying the result -> `comfy-debug-preview` |\n\n## Sources of truth\n\n- `custom_nodes\u002Fcomfyui-kjnodes\u002Fnodes\u002Fnodes.py` — primitives, JoinStrings, Something\u002FWidgetToString\n- `custom_nodes\u002Fcomfyui_essentials\u002Fmisc.py` — SimpleMath family\n- `custom_nodes\u002Fcomfyui-custom-scripts\u002Fpy\u002Fmath_expression.py` — pysssss MathExpression\n- `custom_nodes\u002Fcomfyui-mxtoolkit\u002F` — slider widgets\n- `custom_nodes\u002FComfyUI-Crystools\u002Fcrystools\u002Fnodes_*.py` — primitives, list helpers, JSON extractor\n- `custom_nodes\u002Fbjornulf_custom_nodes\u002F` — Anything-To-* converters\n\n## Math — which node?\n\n| Need | Best node | Why |\n|---|---|---|\n| Single FLOAT expression, simple ops | `SimpleMathFloat` (essentials) | Tight; one expression in, FLOAT out |\n| Single INT expression | `SimpleMathInt` | Same, INT result |\n| Multi-variable expression (a, b, c, d) — `(a+b)\u002Fc` etc. | `SimpleMath` | AST-based eval over named inputs; safe (no module imports) |\n| Two values, binary op (add\u002Fsub\u002Fmul\u002Fdiv\u002Fpow) | `SimpleMathDual` | Op picker widget |\n| Many variables (a–j) | `SimpleCalculatorKJ` (kjnodes) | Up to 10 named inputs |\n| Need numpy \u002F math import — `np.sqrt`, `math.pi`, `np.clip`, etc. | `MathExpression` (pysssss) | Full module access, expression as string |\n| Animation curve over a frame index — linear ramp, sine wave | `DreamLinear`, `DreamSineWave` etc. | Built-in time\u002Fframe parameter |\n| Float ↔ INT | yvann `FloatToInt` (round\u002Fceil\u002Ffloor), `AnythingToInt` (bjornulf) | yvann has the rounding mode; bjornulf is the lenient any-input version |\n| Invert FLOAT (1−x or −x) | yvann `InvertFloats` | Mode picker |\n\n### Math hierarchy in one line\n\n`SimpleMathFloat` \u003C `SimpleMath` \u003C `SimpleCalculatorKJ` \u003C `MathExpression`\n\nPick the simplest one that compiles. `MathExpression` (pysssss) is the\n\"escape hatch\" — full numpy + math imports, but a typo crashes the\nnode with an opaque traceback. Use it only when AST-safe `SimpleMath`\ncan't express what you need.\n\n### `SimpleMath` syntax\n\nVariables: `a`, `b`, `c`, `d` (wire them as inputs).\nOperators: `+ - * \u002F \u002F\u002F % **`, parentheses, unary `-`.\nFunctions: `min`, `max`, `abs`, `round`, `int`, `float`.\n\n```\nSimpleMath:\n   expression: int(sqrt(a * 1000000 * b) \u002F 8) * 8\n   a = megapixels\n   b = aspect_ratio\n   → width snapped to multiple of 8\n```\n\n`SimpleMath` does NOT support `sqrt` natively — drop to\n`MathExpression` for that. Actual AST-safe set is limited; check the\nnode source for the allowed call list.\n\n### `MathExpression` syntax\n\n```\nimport numpy as np\nimport math\n\n# Expression — single line:\nint(math.sqrt(a * 1e6 * b) \u002F 8) * 8\n\n# Or use numpy:\nint(np.sqrt(a * 1e6 * b) \u002F 8) * 8\n```\n\nYou write an expression string referencing input variable names that\nthe node has registered. The node has `math` and `numpy` (as `np`)\nalready imported. Errors surface as red node + traceback in the\nserver log; nothing in the workflow UI.\n\n## Strings — concat, replace, regex, split\n\n| Need | Best node |\n|---|---|\n| Concat a few strings with a delimiter | `JoinStrings` (kjnodes, 5-arg) |\n| Concat many | `JoinStringMulti` (kjnodes, dynamic N inputs) |\n| Concat 2 with no delimiter | `CombineTexts` (bjornulf) |\n| Find\u002Freplace literal | `TextReplace` (bjornulf) |\n| Find\u002Freplace regex | `StringFunction` (pysssss; regex_mode toggle) |\n| Pick random line from multiline | `RandomLineFromInput` (bjornulf) |\n| Split on delimiter | `StringNodes` (pysssss, operation picker) or `TextSplitByDelimiter` (mixlab) |\n| Add line numbers | `AddLineNumbers` (bjornulf) |\n| Tokenize | `DreamStringTokenizer` (dream-project, word-splitter) |\n| Build STRING from a list | `AppendStringsToList` (kjnodes) |\n\n### Single-line vs multiline\n\n- `StringConstant` (kjnodes) — single line, no embedded newlines\n- `StringConstantMultiline` (kjnodes) — multiline, ideal for prompt\n  bodies, JSON snippets, multi-clause text\n- `CText` (Crystools) — single line\n- `CTextML` (Crystools) — multiline\n\nPick multiline for any string longer than ~80 chars or any string\nwith embedded newlines. Single-line variants are for short labels and\nfilenames.\n\n### Regex via `StringFunction`\n\n```\nStringFunction (pysssss):\n   action: replace\n   regex_mode: ON\n   text:    \"michael.jpg\"\n   find:    \"\\.(png|jpg|jpeg|webp)$\"\n   replace: \"\"\n   → \"michael\"\n```\n\nUseful for stripping extensions from a filename (the exact pattern\nwe hit in the `comfy-image-utils` recipe set). Action picker also\nsupports `append`, `replace`, `tidy tags` (the last one normalizes\ncommas\u002Fspaces in tag lists for booru-style prompts).\n\n## Type conversion\n\n`bjornulf`'s `AnythingTo*` family is the most lenient — it accepts\nliterally any input type and produces the named scalar:\n\n| Node | Output | Notes |\n|---|---|---|\n| `AnythingToText` | STRING | `str(x)`-equivalent on any input |\n| `AnythingToInt` | INT | Coerces float \u002F string \u002F bool; raises if string isn't parseable |\n| `AnythingToFloat` | FLOAT | Same, FLOAT target |\n| `SomethingToString` (kjnodes) | STRING | Similar to bjornulf's AnythingToText |\n| `WidgetToString` (kjnodes) | STRING | Reads a specific widget by name from a target node — useful for surfacing arbitrary widget values into the data flow |\n\n`easy string` \u002F `easy int` \u002F `easy float` (easy-use) are **identity\nnodes** — they don't convert, just pass through. Their purpose is to\nexpose a widget UI for a value that downstream nodes will consume; a\ndebug-friendly handle.\n\n## Primitives & sliders\n\nConstants, mxtoolkit sliders \u002F `mxSeed`, `easy rangeInt`, and seed strategy: [references\u002Fprimitives-and-sliders.md](references\u002Fprimitives-and-sliders.md).\n\n## JSON & lists (Crystools)\n\nLoad \u002F extract JSON and build lists (`CJsonFile`, `CJsonExtractor`, `CListAny`, `CListString`; no JSON write): [references\u002Fjson-and-lists.md](references\u002Fjson-and-lists.md).\n\n## Recipes\n\nWorked graphs (resolution from megapixels + aspect, filename templating, tag lists from LoRA triggers, range-driven batch): [references\u002Frecipes.md](references\u002Frecipes.md).\n\n## Gotchas\n\nWhen an expression, regex, or conversion misbehaves, check [references\u002Fgotchas.md](references\u002Fgotchas.md) — `SimpleMath` vs `MathExpression`, server-log-only errors, Python-`re` regex, `AnythingToInt` crashes, inclusive `rangeInt` `num_steps`.\n\n## Cross-refs\n\n- `comfy-conditionals` — feeding math output through a comparator\n  to form a boolean predicate.\n- `comfy-debug-preview` — `ShowAnything` \u002F `DisplayAny` \u002F `ShowFloat`\n  for inspecting intermediate math results.\n- `comfy-flow-control` — `easy rangeInt` feeding `forLoopStart`;\n  primitives as switch selectors.\n- `comfy-prompting` — string assembly for prompts (this skill is the\n  primitive layer; `comfy-prompting` is the application).\n- Project CLAUDE.md \"SaveImage filename substitution\" — native\n  `%date:%`\u002F`%NodeName.widget%` syntax that complements the\n  string-graph approach.\n\n## Things this skill does NOT cover\n\n- **Animation schedulers** — `DreamSineWave`, `DreamSawWave`,\n  `DreamTriangleWave`, `FloatsToWeightsStrategy`, frame-counter ops.\n  These are math primitives but their application (AnimateDiff \u002F\n  IPAdapter transitions \u002F weight schedules over frames) is its own\n  domain. Future `comfy-animation-schedules` skill will cover this.\n  For now: the nodes exist, they emit FLOATs \u002F FLOAT lists driven by\n  a frame index; consult the `comfyui-dream-project` and\n  `comfyui_yvann-nodes` repos for application examples.\n- **Display-only nodes** — `ShowText`, `DisplayAny`, `ShowFloat`,\n  Crystools `CConsoleAny*`. Those are inspection, not computation;\n  see `comfy-debug-preview`.\n- **Image \u002F mask arithmetic** — `ImageBlend`, `MaskComposite`. Those\n  are pixel ops, not scalar math; see `comfy-image-utils`.\n- **Sampler internals** — `cfg`, `denoise`, step counts. Math-driven\n  scheduling of those values is fine, but the values themselves\n  live in the model-family skills.\n","# ComfyUI math & strings\n\nCompute and assemble. Numbers in, numbers out; strings in, strings\nout; primitives that hold a constant; sliders that expose a tunable.\n\nThe split:\n\n| Pack | Niche |\n|---|---|\n| `comfyui-kjnodes` | Primitives (BOOL \u002F INT \u002F Float \u002F String \u002F Multiline), SimpleCalculatorKJ, JoinStrings \u002F JoinStringMulti, AppendStringsToList, Something\u002FWidgetToString |\n| `comfyui_essentials` | Math hierarchy: SimpleMath \u002F SimpleMathFloat \u002F SimpleMathInt \u002F SimpleMathDual (AST-based) |\n| `comfyui-custom-scripts` (pysssss) | `MathExpression` (full numpy + math imports), `StringFunction` (regex), `StringNodes` (split\u002Fcase\u002Ftrim) |\n| `comfyui-mxtoolkit` | `mxSeed`, `mxSlider`, `mxSlider2D` widget-driven values |\n| `bjornulf_custom_nodes` | `AnythingToText` \u002F `AnythingToInt` \u002F `AnythingToFloat`, TextReplace, CombineTexts, RandomLineFromInput |\n| `ComfyUI-Crystools` | `CBoolean` \u002F `CInteger` \u002F `CFloat` \u002F `CText` \u002F `CTextML` primitives, `CJsonFile` \u002F `CJsonExtractor` \u002F `CListAny` \u002F `CListString` |\n| `comfyui-easy-use` | `easy string` \u002F `easy int` \u002F `easy float` identity nodes, `easy rangeInt` |\n| `comfyui-dream-project` | `DreamCalculation`, `DreamLinear`, sine\u002Fsaw\u002Ftriangle waves (animation-flavored, see \"out of scope\") |\n| `comfyui_yvann-nodes` | `FloatToInt`, `InvertFloats`, `MaskToFloat`, `FloatsToWeightsStrategy` |\n\n## When to Use This Skill\n\n| Use this skill when... | Use instead when... |\n|---|---|\n| Computing a value or assembling a string in a workflow | Forming a boolean from that computation -> `comfy-conditionals` |\n| Converting between types (anything -> int\u002Ffloat\u002Fstring) | Displaying the result -> `comfy-debug-preview` |\n\n## Sources of truth\n\n- `custom_nodes\u002Fcomfyui-kjnodes\u002Fnodes\u002Fnodes.py` — primitives, JoinStrings, Something\u002FWidgetToString\n- `custom_nodes\u002Fcomfyui_essentials\u002Fmisc.py` — SimpleMath family\n- `custom_nodes\u002Fcomfyui-custom-scripts\u002Fpy\u002Fmath_expression.py` — pysssss MathExpression\n- `custom_nodes\u002Fcomfyui-mxtoolkit\u002F` — slider widgets\n- `custom_nodes\u002FComfyUI-Crystools\u002Fcrystools\u002Fnodes_*.py` — primitives, list helpers, JSON extractor\n- `custom_nodes\u002Fbjornulf_custom_nodes\u002F` — Anything-To-* converters\n\n## Math — which node?\n\n| Need | Best node | Why |\n|---|---|---|\n| Single FLOAT expression, simple ops | `SimpleMathFloat` (essentials) | Tight; one expression in, FLOAT out |\n| Single INT expression | `SimpleMathInt` | Same, INT result |\n| Multi-variable expression (a, b, c, d) — `(a+b)\u002Fc` etc. | `SimpleMath` | AST-based eval over named inputs; safe (no module imports) |\n| Two values, binary op (add\u002Fsub\u002Fmul\u002Fdiv\u002Fpow) | `SimpleMathDual` | Op picker widget |\n| Many variables (a–j) | `SimpleCalculatorKJ` (kjnodes) | Up to 10 named inputs |\n| Need numpy \u002F math import — `np.sqrt`, `math.pi`, `np.clip`, etc. | `MathExpression` (pysssss) | Full module access, expression as string |\n| Animation curve over a frame index — linear ramp, sine wave | `DreamLinear`, `DreamSineWave` etc. | Built-in time\u002Fframe parameter |\n| Float ↔ INT | yvann `FloatToInt` (round\u002Fceil\u002Ffloor), `AnythingToInt` (bjornulf) | yvann has the rounding mode; bjornulf is the lenient any-input version |\n| Invert FLOAT (1−x or −x) | yvann `InvertFloats` | Mode picker |\n\n### Math hierarchy in one line\n\n`SimpleMathFloat` \u003C `SimpleMath` \u003C `SimpleCalculatorKJ` \u003C `MathExpression`\n\nPick the simplest one that compiles. `MathExpression` (pysssss) is the\n\"escape hatch\" — full numpy + math imports, but a typo crashes the\nnode with an opaque traceback. Use it only when AST-safe `SimpleMath`\ncan't express what you need.\n\n### `SimpleMath` syntax\n\nVariables: `a`, `b`, `c`, `d` (wire them as inputs).\nOperators: `+ - * \u002F \u002F\u002F % **`, parentheses, unary `-`.\nFunctions: `min`, `max`, `abs`, `round`, `int`, `float`.\n\n```\nSimpleMath:\n   expression: int(sqrt(a * 1000000 * b) \u002F 8) * 8\n   a = megapixels\n   b = aspect_ratio\n   → width snapped to multiple of 8\n```\n\n`SimpleMath` does NOT support `sqrt` natively — drop to\n`MathExpression` for that. Actual AST-safe set is limited; check the\nnode source for the allowed call list.\n\n### `MathExpression` syntax\n\n```\nimport numpy as np\nimport math\n\n# Expression — single line:\nint(math.sqrt(a * 1e6 * b) \u002F 8) * 8\n\n# Or use numpy:\nint(np.sqrt(a * 1e6 * b) \u002F 8) * 8\n```\n\nYou write an expression string referencing input variable names that\nthe node has registered. The node has `math` and `numpy` (as `np`)\nalready imported. Errors surface as red node + traceback in the\nserver log; nothing in the workflow UI.\n\n## Strings — concat, replace, regex, split\n\n| Need | Best node |\n|---|---|\n| Concat a few strings with a delimiter | `JoinStrings` (kjnodes, 5-arg) |\n| Concat many | `JoinStringMulti` (kjnodes, dynamic N inputs) |\n| Concat 2 with no delimiter | `CombineTexts` (bjornulf) |\n| Find\u002Freplace literal | `TextReplace` (bjornulf) |\n| Find\u002Freplace regex | `StringFunction` (pysssss; regex_mode toggle) |\n| Pick random line from multiline | `RandomLineFromInput` (bjornulf) |\n| Split on delimiter | `StringNodes` (pysssss, operation picker) or `TextSplitByDelimiter` (mixlab) |\n| Add line numbers | `AddLineNumbers` (bjornulf) |\n| Tokenize | `DreamStringTokenizer` (dream-project, word-splitter) |\n| Build STRING from a list | `AppendStringsToList` (kjnodes) |\n\n### Single-line vs multiline\n\n- `StringConstant` (kjnodes) — single line, no embedded newlines\n- `StringConstantMultiline` (kjnodes) — multiline, ideal for prompt\n  bodies, JSON snippets, multi-clause text\n- `CText` (Crystools) — single line\n- `CTextML` (Crystools) — multiline\n\nPick multiline for any string longer than ~80 chars or any string\nwith embedded newlines. Single-line variants are for short labels and\nfilenames.\n\n### Regex via `StringFunction`\n\n```\nStringFunction (pysssss):\n   action: replace\n   regex_mode: ON\n   text:    \"michael.jpg\"\n   find:    \"\\.(png|jpg|jpeg|webp)$\"\n   replace: \"\"\n   → \"michael\"\n```\n\nUseful for stripping extensions from a filename (the exact pattern\nwe hit in the `comfy-image-utils` recipe set). Action picker also\nsupports `append`, `replace`, `tidy tags` (the last one normalizes\ncommas\u002Fspaces in tag lists for booru-style prompts).\n\n## Type conversion\n\n`bjornulf`'s `AnythingTo*` family is the most lenient — it accepts\nliterally any input type and produces the named scalar:\n\n| Node | Output | Notes |\n|---|---|---|\n| `AnythingToText` | STRING | `str(x)`-equivalent on any input |\n| `AnythingToInt` | INT | Coerces float \u002F string \u002F bool; raises if string isn't parseable |\n| `AnythingToFloat` | FLOAT | Same, FLOAT target |\n| `SomethingToString` (kjnodes) | STRING | Similar to bjornulf's AnythingToText |\n| `WidgetToString` (kjnodes) | STRING | Reads a specific widget by name from a target node — useful for surfacing arbitrary widget values into the data flow |\n\n`easy string` \u002F `easy int` \u002F `easy float` (easy-use) are **identity\nnodes** — they don't convert, just pass through. Their purpose is to\nexpose a widget UI for a value that downstream nodes will consume; a\ndebug-friendly handle.\n\n## Primitives & sliders\n\nConstants, mxtoolkit sliders \u002F `mxSeed`, `easy rangeInt`, and seed strategy: [references\u002Fprimitives-and-sliders.md](references\u002Fprimitives-and-sliders.md).\n\n## JSON & lists (Crystools)\n\nLoad \u002F extract JSON and build lists (`CJsonFile`, `CJsonExtractor`, `CListAny`, `CListString`; no JSON write): [references\u002Fjson-and-lists.md](references\u002Fjson-and-lists.md).\n\n## Recipes\n\nWorked graphs (resolution from megapixels + aspect, filename templating, tag lists from LoRA triggers, range-driven batch): [references\u002Frecipes.md](references\u002Frecipes.md).\n\n## Gotchas\n\nWhen an expression, regex, or conversion misbehaves, check [references\u002Fgotchas.md](references\u002Fgotchas.md) — `SimpleMath` vs `MathExpression`, server-log-only errors, Python-`re` regex, `AnythingToInt` crashes, inclusive `rangeInt` `num_steps`.\n\n## Cross-refs\n\n- `comfy-conditionals` — feeding math output through a comparator\n  to form a boolean predicate.\n- `comfy-debug-preview` — `ShowAnything` \u002F `DisplayAny` \u002F `ShowFloat`\n  for inspecting intermediate math results.\n- `comfy-flow-control` — `easy rangeInt` feeding `forLoopStart`;\n  primitives as switch selectors.\n- `comfy-prompting` — string assembly for prompts (this skill is the\n  primitive layer; `comfy-prompting` is the application).\n- Project CLAUDE.md \"SaveImage filename substitution\" — native\n  `%date:%`\u002F`%NodeName.widget%` syntax that complements the\n  string-graph approach.\n\n## Things this skill does NOT cover\n\n- **Animation schedulers** — `DreamSineWave`, `DreamSawWave`,\n  `DreamTriangleWave`, `FloatsToWeightsStrategy`, frame-counter ops.\n  These are math primitives but their application (AnimateDiff \u002F\n  IPAdapter transitions \u002F weight schedules over frames) is its own\n  domain. Future `comfy-animation-schedules` skill will cover this.\n  For now: the nodes exist, they emit FLOATs \u002F FLOAT lists driven by\n  a frame index; consult the `comfyui-dream-project` and\n  `comfyui_yvann-nodes` repos for application examples.\n- **Display-only nodes** — `ShowText`, `DisplayAny`, `ShowFloat`,\n  Crystools `CConsoleAny*`. Those are inspection, not computation;\n  see `comfy-debug-preview`.\n- **Image \u002F mask arithmetic** — `ImageBlend`, `MaskComposite`. Those\n  are pixel ops, not scalar math; see `comfy-image-utils`.\n- **Sampler internals** — `cfg`, `denoise`, step counts. Math-driven\n  scheduling of those values is fine, but the values themselves\n  live in the model-family skills.\n",{"name":5,"created":46,"modified":47,"reviewed":46,"description":7,"allowed-tools":48},1783382400000,1785456000000,"Read, Grep, Glob","main","bdd0582f1a2ba53d21061835bfd72d45f2f954f4","comfyui-plugin\u002Fskills\u002Fcomfy-math-strings",6,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins","https:\u002F\u002Fgithub.com\u002Flaurigates","Linux enthusiast, cloud engineer, neovim addict, electronics hobbyist.","2026-11-13 03:22:01",{"source":8,"skillName":5,"commands":58,"prompt":68,"zipAvailable":69},[59,62,65],{"tool":60,"command":61},"npx","npx skills add laurigates\u002Fclaude-plugins --skill comfy-math-strings",{"tool":63,"command":64},"bunx","bunx skills add laurigates\u002Fclaude-plugins --skill comfy-math-strings",{"tool":66,"command":67},"pnpm","pnpm dlx skills add laurigates\u002Fclaude-plugins --skill comfy-math-strings","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fcomfyui-plugin\u002Fskills\u002Fcomfy-math-strings\u002FSKILL.md",true,[71,77,81,85],{"path":72,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":75,"sourceHtmlUrl":76},"references\u002Fgotchas.md","REFERENCE","参考文档",2015,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fcomfyui-plugin\u002Fskills\u002Fcomfy-math-strings\u002Freferences\u002Fgotchas.md",{"path":78,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":79,"sourceHtmlUrl":80},"references\u002Fjson-and-lists.md",758,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fcomfyui-plugin\u002Fskills\u002Fcomfy-math-strings\u002Freferences\u002Fjson-and-lists.md",{"path":82,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":83,"sourceHtmlUrl":84},"references\u002Fprimitives-and-sliders.md",1332,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fcomfyui-plugin\u002Fskills\u002Fcomfy-math-strings\u002Freferences\u002Fprimitives-and-sliders.md",{"path":86,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":87,"sourceHtmlUrl":88},"references\u002Frecipes.md",3636,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fcomfyui-plugin\u002Fskills\u002Fcomfy-math-strings\u002Freferences\u002Frecipes.md",[90,118,139,155,178,208],{"skillNo":91,"name":92,"nameZh":6,"description":93,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":101,"publishedAt":41},"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",[96],{"categoryNo":97,"categoryName":98,"taxonomyType":99,"taxonomyTypeDesc":100},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[102,103,104,105,106,107,108,109,110,111,36,27,112,113,114,115,116,117,25,38],"show","kitty show image","image","kitty","show image","ls","get","send","open","dev","Bash","file","text","with","xdg","via",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":124,"publishedAt":41},"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",[],[105,125,126,127,128,129,27,112,130,131,132,25,38,133,134,135,136,137,138,36],"kitty session persistence","session","persistence","false","snapshots","uname","reboot","terminal","write","edit","snapshot","macos","sessions","restore",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":145,"publishedAt":41},"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",[],[146,147,105,148,149,107,150,151,108,152,153,36,27,154,112,114,115,132,25,38],"kitty remote control","remote","control","remote control","running","never","panes","notify","query",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":161,"publishedAt":41},"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",[],[162,163,164,165,166,167,168,169,170,171,36,27,112,172,113,173,174,175,176,177],"docs reference check","check","reference check","reference","docs","links","python3","repo","files","auto","drift","lint","wiring","chezmoi","references","cp",{"skillNo":179,"name":180,"nameZh":6,"description":181,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":182,"categories":183,"keywords":193,"publishedAt":41},"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",[184,187,188],{"categoryNo":185,"categoryName":186,"taxonomyType":99,"taxonomyTypeDesc":100},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":97,"categoryName":98,"taxonomyType":99,"taxonomyTypeDesc":100},{"categoryNo":189,"categoryName":190,"taxonomyType":191,"taxonomyTypeDesc":192},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[194,195,196,197,168,198,38,199,134,200,201,202,36,112,113,203,204,27,205,206,207,117,25],"youtube upload","upload","youtube","Video","run","uv run","publishing","data","uv","api","v3","tags","id","title",{"skillNo":209,"name":210,"nameZh":6,"description":211,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":212,"categories":213,"keywords":217,"publishedAt":41},"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",[214],{"categoryNo":215,"categoryName":216,"taxonomyType":99,"taxonomyTypeDesc":100},"01JBSEEDCAT000000000000023","Skill与智能体开发",[218,219,220,221,196,197,222,223,224,225,226,38,227,228,229,230,36,231,27,115,232,25],"youtube studio share","share","youtube studio","studio","browser","javascript","scripting","google workspace","workspace","tool","google","only","MCP","chrome","organization"]