
Product Categorization
- 65 installs
- 41 repo stars
- Updated March 13, 2026
- finsilabs/awesome-ecommerce-skills
Build a clean product hierarchy with collections, categories, tags, and breadcrumb navigation using your platform's native tools.
About
Structures a product catalog with collections, categories, tags, and breadcrumb navigation using native platform tools. A developer uses it to organize a catalog for browsability and SEO.
- Collections, categories, and tag hierarchy
- Breadcrumb navigation
Product Categorization by the numbers
- 65 all-time installs (skills.sh)
- Ranked #3,110 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/finsilabs/awesome-ecommerce-skills --skill product-categorizationAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 65 |
|---|---|
| repo stars | ★ 41 |
| Last updated | March 13, 2026 |
| Repository | finsilabs/awesome-ecommerce-skills ↗ |
What it does
Build a clean product hierarchy with collections, categories, tags, and breadcrumb navigation using your platform's native tools.
Files
Product Categorization
Overview
A well-structured product taxonomy makes products findable and drives SEO through category pages. Every platform handles categorization differently: Shopify uses Collections and tags, WooCommerce uses hierarchical Categories and tags, and BigCommerce uses Categories with subcategories. Understanding the platform's native model and configuring it correctly is more impactful than building a custom taxonomy system.
When to Use This Skill
- When building a product catalog that needs a navigable category tree (clothing > women > dresses)
- When migrating a flat product list into a structured taxonomy
- When breadcrumb navigation is missing or generating wrong paths
- When category pages need SEO-optimized URLs and meta tags
- When ingesting large supplier catalogs that need automatic categorization
Core Instructions
Step 1: Understand how your platform handles categories
| Platform | Category Model | URL Structure |
|---|---|---|
| Shopify | Collections (flat or nested via themes); tags for additional filtering | /collections/womens-dresses |
| WooCommerce | Hierarchical categories (parent/child) + tags | /product-category/clothing/womens/dresses/ |
| BigCommerce | Nested categories (unlimited depth) | /clothing/womens/dresses/ |
| Custom / Headless | Build with materialized paths for efficient breadcrumb queries | /c/clothing/women/dresses |
Choose a depth strategy before building:
- 2–3 levels is optimal for most stores (e.g., Clothing → Womens → Dresses)
- 4 levels maximum — deeper hierarchies confuse shoppers and dilute SEO
- Flat + tags works well for small catalogs (under 200 products)
---
Step 2: Platform-specific setup
---
Shopify
Shopify uses Collections as the primary categorization mechanism. Collections can be manual (hand-curated) or automated (rules-based).
Creating a collection hierarchy:
1. Go to Admin → Products → Collections → Create collection 2. For the "Women's Dresses" example:
- Create a parent collection: "Clothing" (manual, for navigation menu)
- Create a child collection: "Women's Dresses" (automated, rule: tag contains
womens-dress)
3. Set the collection's SEO fields: Title, Meta description, and URL handle 4. Add a collection image and description — these improve SEO and conversion on the collection page
Automated collections (rule-based — recommended):
- Set rules like: Product type equals "Dress" AND tags contain "womens"
- Products matching the rules are automatically added — no manual curation needed
- Best for large catalogs where you can't manually assign every product
Manual collections:
- Best for curated edits (e.g., "Summer Picks", "Staff Favorites")
- Add products by hand from the collection edit page
Navigation menu hierarchy:
1. Go to Online Store → Navigation 2. Open the main menu 3. Add each collection as a menu item; nest items by dragging sub-items under parent items 4. This creates the visual hierarchy in your storefront's navigation even though Shopify collections are technically flat
Tags for additional filtering:
- Add product tags like
color-red,size-M,material-cotton - Use a faceted filtering app (Boost Commerce, Searchpie) to turn tags into filterable attributes on collection pages
Breadcrumbs: Most Shopify themes include breadcrumbs automatically. If not:
- Go to Online Store → Themes → Customize
- Search for "breadcrumb" in theme settings — many themes have a toggle
- For Dawn/Debut: breadcrumbs are theme-specific and may need liquid code changes
---
WooCommerce
WooCommerce has hierarchical product categories — the closest to a traditional category tree.
Create a category hierarchy:
1. Go to Products → Categories → Add New Category 2. Create your top-level category: "Clothing" 3. Create a child category: "Women's" — select "Clothing" as the Parent Category 4. Create a grandchild: "Dresses" — select "Women's" as the Parent
WooCommerce generates SEO-friendly URLs automatically:
- Clothing:
/product-category/clothing/ - Women's:
/product-category/clothing/womens/ - Dresses:
/product-category/clothing/womens/dresses/
Assign products to categories:
1. Open a product and go to the Product Categories widget in the sidebar 2. Check all applicable categories (products can belong to multiple categories) 3. Check the Primary category for breadcrumb display (requires Yoast SEO)
Category page SEO:
1. Edit a category: Products → Categories → [Category] → Edit 2. Set a Description (unique text appears above the product grid — important for SEO) 3. Upload a Thumbnail image 4. With Yoast SEO: scroll to the Yoast section on the category edit page and set SEO title and Meta description for each category
Breadcrumbs:
- Install Yoast SEO (free) — it adds breadcrumb navigation automatically
- Or enable breadcrumbs in WooCommerce → Settings → Advanced → Breadcrumbs
- Configure the breadcrumb separator and home label
---
BigCommerce
BigCommerce has a nested category system with unlimited depth.
Create categories:
1. Go to Products → Product Categories → Add 2. Enter the category name, description, and URL (BigCommerce lets you customize the URL) 3. Select a Parent category to nest it 4. Upload a category image 5. Set SEO Title and Meta description for each category
Assign products to categories: 1. Edit a product 2. Under Categories, check all applicable categories 3. BigCommerce supports assigning a product to multiple categories
Category sort order:
- Set sort order per category: manual, price ascending/descending, newest, bestselling
- Configure under the category edit page → Sort Products By
Breadcrumbs: BigCommerce themes include breadcrumbs by default, automatically following the nested category path. Customize the breadcrumb template in your theme's Stencil files if needed.
---
Custom / Headless
For headless storefronts, use a materialized path model for efficient breadcrumb queries:
// Category model with materialized path
interface Category {
id: string;
name: string;
slug: string;
parentId: string | null;
path: string; // e.g., "clothing/women/dresses" — ancestor slugs joined by /
pathIds: string[]; // IDs for fast joins: ['cat_root', 'cat_clothing', 'cat_women', 'cat_dresses']
depth: number;
position: number; // Sort order among siblings
published: boolean;
seoTitle?: string;
seoDescription?: string;
}
// Get breadcrumbs in one query using materialized path
export async function getCategoryWithBreadcrumb(slug: string) {
const category = await db.categories.findUnique({ where: { slug } });
if (!category) return null;
// Fetch all ancestors in one query using pathIds
const ancestors = await db.categories.findMany({
where: { id: { in: category.pathIds.slice(0, -1) } },
orderBy: { depth: 'asc' },
});
return {
...category,
breadcrumbs: [
...ancestors.map(a => ({ name: a.name, url: `/c/${a.path}` })),
{ name: category.name, url: `/c/${category.path}` },
],
};
}
// Update materialized paths when a category is moved
export async function moveCategory(categoryId: string, newParentId: string | null) {
const category = await db.categories.findUnique({ where: { id: categoryId } });
const newParent = newParentId ? await db.categories.findUnique({ where: { id: newParentId } }) : null;
const newPath = newParent ? `${newParent.path}/${category.slug}` : category.slug;
const newPathIds = newParent ? [...newParent.pathIds, categoryId] : [categoryId];
// Update this category and all descendants in a transaction
const descendants = await db.categories.findMany({ where: { path: { startsWith: category.path + '/' } } });
await db.$transaction([
db.categories.update({
where: { id: categoryId },
data: { parentId: newParentId, path: newPath, pathIds: newPathIds, depth: newPath.split('/').length },
}),
...descendants.map(desc => db.categories.update({
where: { id: desc.id },
data: {
path: desc.path.replace(category.path, newPath),
pathIds: [...newPathIds, ...desc.pathIds.slice(category.pathIds.length)],
depth: desc.path.replace(category.path, newPath).split('/').length,
},
})),
]);
}---
Step 3: Optimize category pages for SEO
Regardless of platform, every category page needs:
1. Unique description: 100–200 words of original text describing what's in this category. "Shop women's dresses" is not enough — describe the styles, materials, occasions. 2. Category image: A hero or banner image relevant to the category 3. SEO title: Format — [Category Name] | [Store Name] (e.g., "Women's Dresses | YourStore") 4. Meta description: 150–160 characters highlighting what makes your selection unique 5. Canonical URL: The category's clean URL without filter parameters (e.g., /clothing/womens/dresses, not /clothing/womens/dresses?color=red)
Canonical URLs for filtered pages:
- Shopify: themes handle this automatically for collection pages
- WooCommerce + Yoast SEO: Yoast sets the canonical automatically
- BigCommerce: set canonicals in category settings
---
Step 4: Bulk-assign categories for large catalogs
For catalogs with hundreds or thousands of products to categorize:
Shopify:
- In Admin → Products, select multiple products using the checkboxes
- Click Bulk actions → Add to collection to assign them all at once
- For automated collections, products are assigned automatically when they match the rules
WooCommerce:
- Use WP All Import to bulk-assign categories via CSV
- Or use the Products Bulk Edit in WooCommerce admin
AI-assisted categorization (any platform):
- Export your product catalog with titles and descriptions
- Use an AI tool to suggest categories based on product content
- Import the suggested categories back in bulk using Matrixify (Shopify) or WP All Import (WooCommerce)
- Always review AI suggestions for accuracy before publishing
Best Practices
- Use automated (rule-based) collections on Shopify for the main taxonomy — they self-update as products are added; manual collections are for curated editorial picks
- Write unique descriptions for every category page — pages without descriptions are thin content and rarely rank; even 100 words of original text makes a meaningful SEO difference
- Limit depth to 3 levels for most stores — the extra specificity of level 4 rarely helps SEO and creates navigation complexity
- Use tags for cross-cutting attributes (color, material, occasion) rather than categories — tags power faceted filtering without multiplying your category tree
- Update paths in a transaction when moving categories — a partially updated tree creates broken breadcrumbs; always update the category and all its descendants atomically
Common Pitfalls
| Problem | Solution |
|---|---|
| Breadcrumb shows wrong category | On WooCommerce, install Yoast SEO and set the primary category per product; without a primary category, the breadcrumb may show any assigned category |
| Shopify collection page has no unique content | Add a collection description in Admin → Collections → [Collection] → Description; many merchants leave this blank and miss an SEO opportunity |
| Duplicate content on category + filtered URLs | Set canonical tags pointing to the clean category URL for all filter variations; block crawling of paginated pages beyond page 2 |
| Products assigned to too many categories | Each product should have one primary category plus optional secondary ones; too many categories dilutes the signals and confuses navigation |
| Category rename breaks existing links | When renaming, set up a URL redirect from the old URL to the new URL; all platforms support redirects in settings |
Related Skills
- @product-data-modeling
- @product-content-enrichment
- @catalog-import-export
{
"context": "Tests whether the agent implements category move operations with transactional subtree path updates, and breadcrumb retrieval using materialized path_ids rather than recursive queries. The agent is given an existing category structure and asked to implement reorganization and breadcrumb features.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Transaction wraps all updates",
"max_score": 12,
"description": "The moveCategory implementation wraps all database writes (the moved category AND its descendants) inside a single database transaction"
},
{
"name": "Descendants found via path prefix",
"max_score": 10,
"description": "Finding descendants uses a 'path starts with' / prefix query (e.g. WHERE path LIKE 'old/path/%' or { path: { startsWith: category.path + '/' } }) rather than a recursive CTE or multiple round-trips"
},
{
"name": "Descendant paths rewritten",
"max_score": 10,
"description": "After a category move, descendant rows have their 'path' field updated (via string replacement of old prefix with new prefix)"
},
{
"name": "Descendant pathIds rewritten",
"max_score": 10,
"description": "After a category move, descendant rows have their 'path_ids' (pathIds) array updated to reflect the new ancestry"
},
{
"name": "depth recalculated on move",
"max_score": 8,
"description": "The 'depth' field is recalculated for the moved category and its descendants after a move"
},
{
"name": "Breadcrumb single query",
"max_score": 12,
"description": "The breadcrumb retrieval function fetches all ancestors in a single DB query using the path_ids array (e.g. WHERE id IN (path_ids)), NOT a recursive query or one-by-one lookups"
},
{
"name": "Self excluded from ancestors",
"max_score": 8,
"description": "The ancestor query excludes the current category itself (e.g. using .slice(0, -1) or excluding own ID)"
},
{
"name": "Ancestors ordered by depth",
"max_score": 8,
"description": "Ancestors are ordered by 'depth' ascending so breadcrumbs are returned root-first"
},
{
"name": "URL uses /c/ prefix",
"max_score": 8,
"description": "Generated breadcrumb URLs use the '/c/' prefix followed by the category path (e.g. '/c/clothing/women/dresses')"
},
{
"name": "No recursive CTE",
"max_score": 8,
"description": "Neither the move nor the breadcrumb logic uses a recursive SQL CTE or WITH RECURSIVE query"
},
{
"name": "Tree ordered by depth then position",
"max_score": 6,
"description": "The full category tree query orders results by depth ascending first, then by position ascending"
}
]
}
Category Reorganization and Breadcrumb Navigation
Problem/Feature Description
HomeGoods Co. recently acquired a competitor and is merging the two product catalogs. The combined store now needs a significant category restructuring: several sub-trees that were at the top-level in the acquired catalog must be moved under existing HomeGoods categories, and the navigation system must display correct breadcrumbs on every category page after the move.
The existing system stores categories in a relational database using a hierarchical data model. The development team is concerned about three things: (1) if a large sub-tree of categories is moved, they don't want to end up with a partially updated state if something fails mid-way; (2) breadcrumb generation currently requires one query per level, which is too slow; (3) the full category tree for the mega-menu must be rendered in a consistent order.
Your task is to implement the server-side functions that handle category reorganization and breadcrumb generation.
Output Specification
Produce the following files:
1. lib/categoryOps.js (or .ts) — A module containing:
moveCategory(categoryId, newParentId)— moves a category and its entire sub-tree to a new parentgetCategoryWithBreadcrumb(slug)— returns a category with its breadcrumb trailgetCategoryTree(rootSlug?)— returns the full published category tree as a nested structure
2. test-scenario.md — A short walkthrough showing what the state of the database would look like for a sample move (e.g. moving "Kitchen > Cookware" under "Cooking & Baking"), demonstrating path values before and after.
The DB client can be mocked/stubbed — focus on the logic and data transformations. Show the data shapes clearly in the code.
Input Files
The following files are provided as inputs. Extract them before beginning.
=============== FILE: inputs/sample-categories.json =============== [ { "id": "cat_root", "name": "Root", "slug": "root", "parentId": null, "path": "root", "pathIds": ["cat_root"], "depth": 0, "position": 0, "published": true }, { "id": "cat_kitchen", "name": "Kitchen", "slug": "kitchen", "parentId": "cat_root", "path": "root/kitchen", "pathIds": ["cat_root","cat_kitchen"], "depth": 1, "position": 1, "published": true }, { "id": "cat_cookware", "name": "Cookware", "slug": "cookware", "parentId": "cat_kitchen", "path": "root/kitchen/cookware", "pathIds": ["cat_root","cat_kitchen","cat_cookware"], "depth": 2, "position": 1, "published": true }, { "id": "cat_pans", "name": "Pans", "slug": "pans", "parentId": "cat_cookware", "path": "root/kitchen/cookware/pans", "pathIds": ["cat_root","cat_kitchen","cat_cookware","cat_pans"], "depth": 3, "position": 1, "published": true }, { "id": "cat_baking", "name": "Baking", "slug": "baking", "parentId": "cat_root", "path": "root/baking", "pathIds": ["cat_root","cat_baking"], "depth": 1, "position": 2, "published": true } ]
{
"context": "Tests whether the agent designs a category database schema and utility functions using materialized paths (not recursive CTEs), with correct field choices, slug conventions, and uniqueness constraints. The agent is asked to scaffold a category system for a new e-commerce store.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Materialized path field",
"max_score": 12,
"description": "The category schema includes a 'path' field that stores ancestor slugs joined by '/' (e.g. 'clothing/women/dresses'), NOT a closure table or adjacency-list-only design"
},
{
"name": "path_ids array field",
"max_score": 10,
"description": "The category schema includes a 'path_ids' (or pathIds) field that stores an ordered array of ancestor IDs"
},
{
"name": "depth field present",
"max_score": 6,
"description": "The schema includes a 'depth' numeric field representing the level of the category in the hierarchy"
},
{
"name": "position field present",
"max_score": 6,
"description": "The schema includes a 'position' field for ordering siblings"
},
{
"name": "published field present",
"max_score": 6,
"description": "The schema includes a boolean 'published' field on categories"
},
{
"name": "SEO fields present",
"max_score": 8,
"description": "The schema includes both seo_title (or seoTitle) and seo_description (or seoDescription) fields"
},
{
"name": "Hyphens in slugs",
"max_score": 8,
"description": "Slug examples or generation code uses hyphens as word separators (e.g. 'evening-dresses'), NOT underscores"
},
{
"name": "No stop words in slugs",
"max_score": 6,
"description": "Slug generation or examples avoid stop words (e.g. uses 'womens-dresses' not 'for-women-dresses')"
},
{
"name": "Unique constraint on (parent_id, slug)",
"max_score": 12,
"description": "The schema or migration includes a unique constraint specifically on the combination of (parent_id, slug), not a global uniqueness constraint on slug alone"
},
{
"name": "Max depth enforcement",
"max_score": 8,
"description": "Code or documentation mentions or enforces a maximum category depth of 3-4 levels"
},
{
"name": "No recursive CTEs",
"max_score": 10,
"description": "The breadcrumb or ancestry retrieval logic does NOT use a recursive SQL CTE or recursive query — uses the path_ids array instead"
},
{
"name": "image_url field present",
"max_score": 8,
"description": "The schema includes an image_url (or imageUrl) field for category images"
}
]
}
Category System Foundation for a New Fashion Store
Problem/Feature Description
A new online fashion retailer, StyleHive, is launching a web store that will eventually carry tens of thousands of products across a deep hierarchy of clothing, accessories, and footwear. The tech lead needs a solid foundation for the product category system before the first product import next week.
The store has a relatively complex taxonomy: top-level divisions (Clothing, Footwear, Accessories), then gender or age groups, then product type, and sometimes a style sub-type — so paths like "clothing > women > dresses > evening" are expected. Navigation needs to be fast and SEO-friendly from day one, and the team wants to avoid painful data-migration work later if the hierarchy is reorganized.
Your job is to design and implement the core data model and category library that the rest of the application will depend on. The engineering team has heard of several approaches to storing hierarchical data in a relational database and wants you to pick the right one and justify it briefly. They are using a Node.js/TypeScript stack with Prisma as the ORM.
Output Specification
Produce the following files in your working directory:
1. schema.prisma (or schema.sql) — The Prisma schema (or SQL DDL) for the Category model, with all fields the team will need for navigation, sorting, SEO, and publishing workflow. 2. lib/categories.js (or .ts) — A module with at least:
- A function to fetch a single category by slug (including breadcrumb data)
- A function to retrieve the full published category tree
3. DESIGN.md — A short (1–2 page) design document explaining the chosen data storage approach, how breadcrumb retrieval works, and any constraints enforced in the schema.
You do not need to set up a real database connection — stub or comment out DB calls where needed, but make sure the logic and data structures are clearly shown.
{
"context": "Tests whether the agent generates correct SEO meta tag structures for category pages (canonical URL, OpenGraph, Schema.org structured data) and implements AI auto-categorization using the correct model, parameters, and human-review workflow. The agent is asked to build both the SEO utilities and a bulk auto-categorization tool.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Canonical URL path format",
"max_score": 10,
"description": "The canonical URL is constructed as 'https://<domain>/c/<category.path>' (using /c/ prefix and the materialized path), not a different URL scheme"
},
{
"name": "OpenGraph included",
"max_score": 8,
"description": "The SEO output includes OpenGraph tags with at least title, description, and type fields"
},
{
"name": "OpenGraph type is website",
"max_score": 5,
"description": "The OpenGraph 'type' field is set to 'website'"
},
{
"name": "OpenGraph image",
"max_score": 5,
"description": "The OpenGraph output includes an image field populated from category.imageUrl (or image_url)"
},
{
"name": "Schema.org CollectionPage",
"max_score": 8,
"description": "The structured data uses @type: 'CollectionPage' (not 'WebPage', 'ProductCollection', or other type)"
},
{
"name": "BreadcrumbList in structured data",
"max_score": 8,
"description": "The structured data includes a breadcrumb property with @type: 'BreadcrumbList' and itemListElement array of ListItem entries"
},
{
"name": "seoTitle/seoDescription fallback",
"max_score": 6,
"description": "The meta title and description use the category's seoTitle/seoDescription fields when available, with a computed fallback when they are null/undefined"
},
{
"name": "gpt-4o-mini model",
"max_score": 10,
"description": "The auto-categorization code uses model 'gpt-4o-mini' (not gpt-4, gpt-4-turbo, gpt-3.5-turbo, or another model)"
},
{
"name": "Temperature 0.1",
"max_score": 8,
"description": "The OpenAI API call for auto-categorization uses temperature: 0.1"
},
{
"name": "JSON response format",
"max_score": 8,
"description": "The OpenAI API call uses response_format: { type: 'json_object' }"
},
{
"name": "Returns 1-3 category IDs",
"max_score": 8,
"description": "The auto-categorization prompt instructs the model to return 1-3 category IDs, and the code parses and returns categoryIds"
},
{
"name": "Human review workflow",
"max_score": 8,
"description": "The auto-categorization output or workflow includes a mechanism for human review — low-confidence suggestions are flagged or queued for review rather than applied automatically"
},
{
"name": "faceted URL canonical",
"max_score": 8,
"description": "Code or documentation addresses faceted/filtered URL variants by adding a rel='canonical' pointing to the unfaceted category URL"
}
]
}
SEO Boost and Bulk Catalog Import for an Outdoor Gear Store
Problem/Feature Description
TrailPeak is an outdoor gear retailer that has seen its organic search traffic plateau. A web performance audit found two root causes: (1) category pages lack proper structured data and have inconsistent meta tags that cause Google to generate its own titles and descriptions; (2) a recent partnership with a large equipment supplier added 4,000 raw products that are still sitting unorganized in a staging table because manually assigning them to categories would take weeks.
The engineering team wants to fix both problems in a single sprint. For SEO, every category page needs a well-structured meta tag set including an explicit canonical URL, Open Graph tags, and JSON-LD structured data that search engines can parse for rich results. For the bulk import, they want an automated first pass that places each raw product into the most likely categories, with a lightweight review step so the merchandising team can spot-check edge cases before they go live.
Output Specification
Produce the following files:
1. lib/categorySeo.js (or .ts) — A function getCategoryMeta(category, productCount) that returns an object with meta title, description, canonical URL, openGraph tags, and JSON-LD structured data for a given category.
2. lib/autoCategorize.js (or .ts) — A function suggestCategories(product, categoryTree) that uses an LLM to suggest the most appropriate categories for a product given the available category tree.
3. categorize-batch.js (or .ts) — A runnable script that:
- Reads products from the provided
inputs/products.json - For each product, calls
suggestCategoriesand records the results - Writes
output/categorization-results.jsonwith each product's suggested category IDs and a field indicating whether human review is needed - Includes inline comments explaining the review criteria
You do not need to make live API calls — stub or mock the LLM calls. The logic, prompts, parameters, and data structures should be clearly visible in the code.
Input Files
The following files are provided as inputs. Extract them before beginning.
=============== FILE: inputs/products.json =============== [ { "id": "prod_001", "title": "Merino Wool Base Layer Top", "description": "Lightweight 150gsm merino wool long-sleeve top, ideal for hiking and backpacking in variable conditions. Odor-resistant, moisture-wicking, machine washable." }, { "id": "prod_002", "title": "10L Ultralight Daypack", "description": "Minimalist 10-liter pack for day hikes and trail running. Includes hydration sleeve, trekking pole loops, and reflective strips. Weighs 280g." }, { "id": "prod_003", "title": "Titanium Camping Cookset", "description": "Two-piece titanium pot and pan set with folding handles. Suitable for backpacking stoves. Total weight 220g, fits 2 persons." } ]
=============== FILE: inputs/category-tree.json =============== [ { "id": "cat_clothing", "name": "Clothing", "slug": "clothing", "path": "clothing", "depth": 0, "children": [ { "id": "cat_base", "name": "Base Layers", "slug": "base-layers", "path": "clothing/base-layers", "depth": 1, "children": [] }, { "id": "cat_mid", "name": "Mid Layers", "slug": "mid-layers", "path": "clothing/mid-layers", "depth": 1, "children": [] } ] }, { "id": "cat_packs", "name": "Packs & Bags", "slug": "packs-bags", "path": "packs-bags", "depth": 0, "children": [ { "id": "cat_daypacks", "name": "Daypacks", "slug": "daypacks", "path": "packs-bags/daypacks", "depth": 1, "children": [] }, { "id": "cat_overnight", "name": "Overnight Packs", "slug": "overnight-packs", "path": "packs-bags/overnight-packs", "depth": 1, "children": [] } ] }, { "id": "cat_camp", "name": "Camp & Hike", "slug": "camp-hike", "path": "camp-hike", "depth": 0, "children": [ { "id": "cat_cooking", "name": "Cooking & Nutrition", "slug": "cooking-nutrition", "path": "camp-hike/cooking-nutrition", "depth": 1, "children": [] } ] } ]
{
"name": "finsi/product-categorization",
"version": "0.1.0",
"summary": "Hierarchical taxonomy design with breadcrumbs, auto-categorization, and SEO",
"skills": {
"product-categorization": {
"path": "SKILL.md"
}
}
}