$npx -y skills add AlpacaLabsLLC/skills-for-architects --skill product-data-cleanupClean up an FF&E schedule — normalize casing, dimensions, units, language, materials, and formatting for consistency. Use when the user asks to "clean up the schedule", fix inconsistent product data, or standardize an FF&E sheet.
| 1 | # /product-data-cleanup — Product Data Normalizer |
| 2 | |
| 3 | Takes a messy FF&E schedule and normalizes everything: casing, dimensions, units, language, materials vocabulary, currency formatting, and duplicates. Outputs a clean, consistent, spec-ready schedule. |
| 4 | |
| 5 | Operates on the **master Google Sheet** — the same 33-column schema used by all product skills. Also works on standalone CSV files and pasted tables. |
| 6 | |
| 7 | ## Input |
| 8 | |
| 9 | The user provides a schedule in one of these ways: |
| 10 | |
| 11 | 1. **Master Google Sheet** — the shared product library. Provide spreadsheet ID or URL. |
| 12 | 2. **File path** — a `.csv`, `.tsv`, `.xlsx` export, or `.md` file |
| 13 | 3. **Pasted table** — markdown or tab-separated data in the message |
| 14 | |
| 15 | If the input format is unclear, ask. |
| 16 | |
| 17 | ## Cleanup Rules |
| 18 | |
| 19 | ### 1. Casing |
| 20 | |
| 21 | | Field | Rule | Example | |
| 22 | |-------|------|---------| |
| 23 | | Product Name | Title Case | `eames lounge chair` → `Eames Lounge Chair` | |
| 24 | | Brand | Title Case, preserve known abbreviations | `HERMAN MILLER` → `Herman Miller`, `HAY` → `HAY` | |
| 25 | | Collection | Title Case | `cosm` → `Cosm` | |
| 26 | | Category | Title Case, singular | `chairs` → `Chair`, `TABLES` → `Table` | |
| 27 | | Materials | Sentence case, lowercase after first word | `MOLDED PLYWOOD, FULL GRAIN LEATHER` → `Molded plywood, full grain leather` | |
| 28 | | Colors/Finishes | Title Case per item | `walnut/black leather` → `Walnut / Black Leather` | |
| 29 | |
| 30 | **Known brand abbreviations to preserve**: HAY, USM, B&B, DWR, CB2, HBF, OFS, SitOnIt, 3form, ICF |
| 31 | |
| 32 | ### 2. Category Normalization |
| 33 | |
| 34 | Map free-text categories to the canonical vocabulary and alias table defined in `../../schema/product-schema.md`. Read that file for the full mapping of variations (English, Spanish, legacy terms) to canonical category names. |
| 35 | |
| 36 | If a category is ambiguous, keep the closest match and add a `[?]` flag for the user to review. |
| 37 | |
| 38 | ### 3. Dimensions |
| 39 | |
| 40 | **Splitting combined dimensions:** |
| 41 | | Input | → W | → D | → H | → Unit | |
| 42 | |-------|-----|-----|-----|--------| |
| 43 | | `32 x 24 x 30 in` | 32 | 24 | 30 | in | |
| 44 | | `80 × 60 × 75 cm` | 80 | 60 | 75 | cm | |
| 45 | | `W32 D24 H30` | 32 | 24 | 30 | (infer) | |
| 46 | | `32"W x 24"D x 30"H` | 32 | 24 | 30 | in | |
| 47 | | `Ancho: 80, Prof: 60, Alto: 75 cm` | 80 | 60 | 75 | cm | |
| 48 | |
| 49 | **Dimension rules:** |
| 50 | - Always store as **separate W, D, H columns** with a **Unit column** |
| 51 | - If dimensions are already split, validate they're numeric (strip any unit text from the number) |
| 52 | - Interpret `"` as inches, `'` as feet (convert to inches: `2'6"` → `30`) |
| 53 | - Accept `×`, `x`, `X`, `by`, `por` as separators |
| 54 | - Convention: W × D × H (width × depth × height). If only 2 values, ask which is missing. |
| 55 | - Round to 2 decimal places max |
| 56 | - If unit is missing but values suggest inches (all < 100 for furniture), assume `in`. If values suggest cm (> 100 or explicit), use `cm`. If truly ambiguous, flag with `[?]`. |
| 57 | |
| 58 | **Do NOT convert units.** Keep the original unit. Designers need the manufacturer's spec for ordering. |
| 59 | |
| 60 | ### 4. Language Normalization |
| 61 | |
| 62 | Detect the language of each field value and normalize to **English** unless the user specifies otherwise. |
| 63 | |
| 64 | | Spanish (common in UY sources) | → English | |
| 65 | |-------------------------------|-----------| |
| 66 | | Silla | Chair (category) | |
| 67 | | Mesa | Table (category) | |
| 68 | | Escritorio | Desk (category) | |
| 69 | | Madera | Wood (material) | |
| 70 | | Cuero | Leather (material) | |
| 71 | | Acero | Steel (material) | |
| 72 | | Vidrio | Glass (material) | |
| 73 | | Tela | Fabric (material) | |
| 74 | | Mármol | Marble (material) | |
| 75 | | Roble | Oak (material) | |
| 76 | | Nogal | Walnut (material) | |
| 77 | | Blanco | White (color) | |
| 78 | | Negro | Black (color) | |
| 79 | | Natural | Natural (keep as-is) | |
| 80 | | Cromado | Chrome (finish) | |
| 81 | |
| 82 | **Rule:** Translate category, material, and color/finish fields. Leave Product Name and Brand as-is (proper nouns). |
| 83 | |
| 84 | If the user says "keep in Spanish" or specifies a target language, respect that. |
| 85 | |
| 86 | ### 5. Materials & Finishes Vocabulary |
| 87 | |
| 88 | Standardize common material terms: |
| 89 | |
| 90 | | Variations | → Standard | |
| 91 | |-----------|------------| |
| 92 | | SS, Stainless, S/S | Stainless steel | |
| 93 | | Ply, Plywood, Mold ply | Molded plywood | |
| 94 | | MDF, Medium density | MDF | |
| 95 | | HPL, High pressure laminate | HPL | |
| 96 | | Lam, Laminate | Laminate | |
| 97 | | Fab, Textile | Fabric | |
| 98 | | COM, C.O.M. | COM (Customer's Own Material) | |
| 99 | | COL, C.O.L. | COL (Customer's Own Leather) | |
| 100 | | Powder coat, PC, Pwdr | Powder-coated | |
| 101 | | Chrm, Chrome plated | Chrome | |
| 102 | | Anodized alum, Anod. | Anodized aluminum | |
| 103 | | Ven, Veneer | Veneer | |
| 104 | | Sol. wood, Solid | Solid wood | |
| 105 | |
| 106 | ### 6. Price & Currency |
| 107 | |
| 108 | - Strip currency symbols (`$`, `€`, `£`, `¥`) — store symbol as currency code in separate column |
| 109 | - Remove thousands separators |