Tree Generator logo

Tree Generator

Organization
TanStack
tree-generator

Use when turning an approved domain_map.yaml and skill_spec.md into a full-library skill tree or explicitly auditing its structure and dependencies. For agreed batches and source-driven guidance updates, use generate-skill instead.

Overview

PublisherTanStack
Repositoryintent
Skill nametree-generator
Stars
355
Forks
26
Bundled files
2
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 2 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by TanStack on GitHub. Read the source before you install it.

Installation

Install the Tree Generator AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/TanStack/intent/tree/main/packages/intent/meta/tree-generator
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/TanStack/intent.git /tmp/intent
mkdir -p .claude/skills
cp -r /tmp/intent/packages/intent/meta/tree-generator .claude/skills/tree-generator
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Tree Generator in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Tree Generator on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Tree Generator is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Skill Tree Generator

You produce and maintain a tree of SKILL.md files for a library. Every file you create is read directly by AI coding agents across Claude, Codex, Gemini, Cursor, Copilot, and open-source models. Your output must be portable, concise, and grounded in actual library behavior.

Skill types

Every skill has a metadata.type field in its frontmatter. Valid types:

TypePurposeExample
coreFramework-agnostic concepts, configuration, patternsdb-core
sub-skillA focused sub-topic within a core or framework skilldb-core/live-queries
frameworkFramework-specific bindings, hooks, componentsreact-db
lifecycleCross-cutting developer journey (getting started, go-live)electric-quickstart
compositionIntegration between two or more librarieselectric-drizzle
securityAudit checklist or security validationelectric-security-check

Agents discover skills via npm exec --no -- intent list and read them directly from node_modules. Framework skills declare a requires dependency on their core skill so agents load them in the right order.

There are two workflows. Detect which applies.

Workflow A — Generate: Build a complete skill tree from a domain map. Workflow B — Update: Review identified changes against existing guidance.

Before writing any skill, apply the shared writing rules.


Workflow A — Generate skill tree

Prerequisites

You need one of:

  • skills/_artifacts/domain_map.yaml and skills/_artifacts/skill_spec.md from domain-discovery
  • Raw library documentation and source code (run a compressed domain discovery first)

If starting from raw docs without a domain map, run a compressed discovery. This produces lower-fidelity output than the full domain-discovery skill — prefer running that when time permits.

  1. Build a concept inventory (every export, config key, constraint, warning)
  2. Group into capability domains using work-oriented names (let library complexity drive the count — 2–3 for focused libraries, more for large frameworks)
  3. Identify independently useful developer tasks; combine overlapping guidance and justify each independent loading condition
  4. Extract the failure modes supported by the sources for each task
  5. Proceed to Step 1 below

Scaffold flow output

If the maintainer uses a custom skills root, replace skills/ in the paths below with their chosen directory.

Focused batches use the format below through generate-skill’s planning record procedure, extending the existing tree with the batch. Reading this format does not start full-library discovery.

For the full-library scaffold workflow, produce a single artifact before writing any SKILL.md files:

  • skills/_artifacts/skill_tree.yaml

This file enumerates every skill that must be generated in the next step. Do not write SKILL.md files yet unless explicitly asked.

Use this format:

yaml
# skills/_artifacts/skill_tree.yaml
library:
  name: '[package-name]'
  version: '[version]'
  repository: '[repo URL]'
  description: '[one line]'
generated_from:
  domain_map: 'skills/_artifacts/domain_map.yaml'
  skill_spec: 'skills/_artifacts/skill_spec.md'
generated_at: '[ISO date]'

skills:
  - name: '[task-focused skill name]'
    slug: '[kebab-case]'
    type: 'core | sub-skill | framework | lifecycle | composition | security'
    domain: '[domain slug]'
    path: 'skills/[path]/SKILL.md'
    package: '[package directory, e.g. packages/client]' # monorepo only — which package this skill belongs to
    description: 'Use when [concrete developer tasks or conditions] with [library/framework]. [Adjacent-task boundary, when needed.]'
    purpose: '[Descriptive explanation; emitted as metadata.purpose in SKILL.md.]'
    requires:
      - '[other skill slugs]' # omit if none
    sources:
      - '[Owner/repo]:docs/[path].md'
      - '[Owner/repo]:src/[path].ts'
    subsystems:
      - '[adapter/backend name]' # omit if none
    references:
      - 'references/[file].md' # omit if none

Monorepo layout: For monorepos, each skill's path is relative to its package directory (e.g. packages/client/skills/core/SKILL.md). Set the package field so generate-skill knows where to write the file. The domain map artifacts stay at the repo root.

Minimal library fast path

If tasks stand alone, there are no framework adapter packages, and a shared overview would add no necessary guidance, skip the core overview + sub-skill registry pattern. Instead:

  • Use flat structure — each skill gets its own skills/[skill-name]/SKILL.md
  • No router skill — the intent CLI list command is sufficient for discovery
  • No core overview skill — go directly to individual skill files
  • Each skill is type core (not sub-skill) and stands alone without a parent registry
  • Skip Step 2 (core overview) and Step 3 (sub-skills) — go directly to writing individual skills as standalone core skills using Step 3's body format

This avoids unnecessary scaffolding for focused libraries where the overhead of a hierarchical skill tree exceeds the navigation benefit.

Step 1 — Plan the file tree

From the domain map, each entry in the skills list becomes a SKILL.md file. The type field on each skill (core, framework, lifecycle, composition) determines where it goes. Determine the file tree:

Core vs framework decision:

ContentGoes in...
Mental models, concepts, lifecycleCore
Configuration options and their effectsCore
Type system, generics, inferenceCore
Common mistakes that apply to all frameworksCore
Hooks (useX, createX)Framework
Components (<Link>, <Outlet>)Framework
Provider setup and wiringFramework
SSR/hydration patterns specific to a frameworkFramework
Framework-specific gotchasFramework

If a library has no framework adapters, produce only core skills.

Framework-integration domain decomposition: If the domain map from domain-discovery contains a single "Framework Integration" domain and the library has separate framework adapter packages, decompose it into per-framework skills co-located with each adapter package. Do not produce a single monolithic framework-integration skill that covers React, Vue, Solid, etc. in one file.

Adapter-heavy domains: When a domain covers multiple backends or adapters with distinct config interfaces (e.g. 5 sync adapters, 3 database drivers), keep one SKILL.md for the shared patterns but produce one reference file per adapter with its specific config, setup, and gotchas. The SKILL.md covers what's common; each references/[adapter].md covers what's unique.

Flat vs nested structure:

Choose the structure that matches how the domain map's skills are shaped.

Use nested ([lib]-core/[domain]/SKILL.md) when:

  • Developer tasks cluster cleanly into conceptual domains
  • The library has a clear core + framework adapter split
  • Skills build on each other in a layered way

Use flat (skills/[skill-name]/SKILL.md) when:

  • Developer tasks are task-focused and don't nest into domains
  • The domain discovery process recommended task-focused skills
  • Skills map 1:1 to distinct developer intents with minimal overlap

Both are valid. The domain map's type field and structure will signal which fits. When in doubt, prefer flat — it's simpler and each skill is independently discoverable.

Nested structure:

skills/
├── [lib]-core/                   # Core skill for the library
│   ├── SKILL.md                  # Core overview + sub-skill registry
│   ├── [domain-1]/
│   │   └── SKILL.md             # Core sub-skill
│   ├── [domain-2]/
│   │   └── SKILL.md
│   └── references/              # Optional overflow content
│       └── options.md
├── react-[lib]/                  # React framework skill
│   ├── SKILL.md                  # React overview + sub-skill registry
│   ├── [domain-1]/
│   │   └── SKILL.md             # React-specific sub-skill
│   └── references/
├── solid-[lib]/                  # Solid framework skill (if applicable)
│   └── SKILL.md
├── vue-[lib]/                    # Vue framework skill (if applicable)
│   └── SKILL.md

Flat structure:

skills/
├── [lib]-shapes/                 # Task-focused skill
│   ├── SKILL.md
│   └── references/
│       └── shape-options.md
├── [lib]-auth/                   # Another task skill
│   └── SKILL.md
├── [lib]-proxy/
│   └── SKILL.md
├── [lib]-quickstart/             # Lifecycle skill
│   └── SKILL.md
├── [lib]-go-live/                # Lifecycle skill
│   └── SKILL.md
├── [lib]-drizzle/                # Composition skill
│   └── SKILL.md

Router skill: Add a router only when its decision guidance helps agents choose between tasks that intent list and the skills' descriptions cannot adequately distinguish. Skill count alone does not justify a router.

Source repository layout for npm distribution:

Skills must ship with their respective packages so they're available in node_modules after install. In a monorepo, co-locate skills with the package they document:

packages/
├── [lib]/                        # Core package
│   ├── src/
│   ├── skills/                   # Core skills live here
│   │   ├── [lib]-core/
│   │   │   ├── SKILL.md
│   │   │   └── [domain]/SKILL.md
│   │   └── compositions/        # Composition skills with co-used libs
│   └── package.json             # Add "skills" to files array
├── react-[lib]/                  # React adapter package
│   ├── src/
│   ├── skills/                   # React framework skills live here
│   │   └── react-[lib]/
│   │       └── SKILL.md
│   └── package.json             # Add "skills" to files array

Publishing configuration is separate from authoring. When the maintainer requests it, npm exec --no -- intent edit-package-json prepares the package; review its resulting diff.

Steps 2–7 — Write skills

When writing skill files (after the scaffold plan is approved), read the skill-writing procedures and templates. Follow the applicable steps in order: core overview, core sub-skills, framework skills, tension notes, composition skills, and checklist skills. The reference owns each type's frontmatter, body, dependency rules, failure-mode handling, and reference-file criteria.

For the minimal-library fast path, use Step 3's body format for standalone core skills. For scaffold-only requests, stop after skill_tree.yaml.

Step 8 — Validate the complete tree

Run every check before outputting. Fix any failures before proceeding.

CheckRule
Every skill from domain_map has a SKILL.mdNo orphaned skills
Core/framework split is cleanNo framework hooks in core skills
Every framework skill has requiresLinks to its core skill
Framework skill opens with dependency note"builds on [core]" prose line
Every skill under 500 linesMove excess to references/
Every code block has real importsExact package name, correct adapter
No concept explanationsNo "TypeScript is...", no "React hooks are..."
No marketing proseFirst body line is heading or dependency note
Every code block is completeWorks without modification when pasted
Common Mistakes cover real failuresPreserve silent failures and necessary error handling
Common Mistakes are library-specificNot generic TS/React mistakes
Common Mistakes are sourcedEvery mistake traceable to doc or source
Core skills reference framework skills"For React usage, see..."
Framework skills don't repeat core contentOnly framework-specific
Composition skills don't repeat individual skillsOnly the seam
name matches parent directoryname: search-params → router-core/search-params/SKILL.md
sources filled in sub-skillsAt least one repo:path per sub-skill
Cross-skill failures in all relevant filesEvery affected entry point routes to the authoritative failure guidance
Tensions noted in affected skillsEach tension has notes in all involved domain skills
Framework domains decomposed per-packageNo single skill covering multiple framework adapters
Adapter-heavy domains have referencesConditional adapter details have precise reading pointers
Dense API surfaces in referencesConditional API details are referenced by task relevance
Checklist skills use audit bodySecurity/go-live skills use checklist template, not Setup → Core Patterns → Common Mistakes

Workflow B — Update existing skills

When a library version, changelog, migration guide, or accuracy report requires updating existing skills, read the update workflow. Use the focused procedure it points to for each affected task; keep existing artifact decisions unless the evidence requires a correction. Apply the constraints below to every updated file.

Constraints — verify for every file

CheckRule
Under 500 lines per SKILL.mdUse relevant references while retaining necessary guidance
Real imports in every code blockExact package, correct adapter
No external concept explanationsNo "TypeScript is...", no "React hooks are..." — library-specific concepts are fine
No marketing proseFirst body line is heading, code, or dependency note
Complete code blocksEvery block works without modification
Common Mistakes cover real failuresPreserve silent failures and necessary error handling
Common Mistakes are library-specificNot generic TS/React mistakes
Common Mistakes are sourcedTraceable to doc or source
Core skills are framework-agnosticNo hooks, no components, no providers
Framework skills have requiresLists core dependency
Framework skills open with dependency noteFirst prose line references core
Composition skills require all dependenciesLists all core + framework skills
name matches parent directoryname: search-params → router-core/search-params/SKILL.md
library_version in every frontmatterWhich version the skill targets
Cross-skill failures accessibleEach listed skill points to the authoritative failure guidance
Tensions cross-referencedTension notes in each involved skill point to the other
Skills ship with packages"skills" in package.json files array
Checklist skills use audit templateSecurity/go-live skills use checklist body, not standard body

Cross-model compatibility

Output is consumed by all major AI coding agents. To ensure consistency:

  • Markdown with YAML frontmatter — universally parsed
  • No XML tags in generated skill content
  • Code blocks use triple backticks with language annotation
  • Section boundaries use ## headers
  • Descriptions state distinct loading conditions
  • Examples show concrete values, never placeholders
  • Positive instructions ("Use X") over negative ("Don't use Y")
  • Critical info at start or end of sections (not buried in middle)
  • Each SKILL.md is self-contained except for declared requires

Output order

When generating a complete skill tree:

  1. Core overview SKILL.md — entry point for the library
  2. Core sub-skills in domain order
  3. Framework overview SKILL.md for each framework
  4. Framework sub-skills
  5. Composition skills (if applicable)
  6. Security skills (if applicable)
  7. references/ files for any skill that needs them
  8. CHANGELOG.md entry

When updating:

Return the evidence, focused diffs or justified no-ops, validation results, and unresolved uncertainty required by generate-skill.


Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Tree Generator AI skill do?

Use when turning an approved domain_map.yaml and skill_spec.md into a full-library skill tree or explicitly auditing its structure and dependencies. For agreed batches and source-driven guidance updates, use generate-skill instead.

Why use Tree Generator on TypingMind?

Because you install it once and use it with any model. Tree Generator is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Tree Generator in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/TanStack/intent/tree/main/packages/intent/meta/tree-generator. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Tree Generator?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Tree Generator?

As many as you like. As long as a model supports skills, you can use Tree Generator with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Tree Generator AI skill free?

Yes. It is published on GitHub by TanStack under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇