$npx -y skills add AlpacaLabsLLC/skills-for-architects --skill sif-to-csvConvert a SIF (Standard Interchange Format) file to a clean, readable CSV or Google Sheet. Use when the user shares a .sif file or asks to "convert SIF to CSV", open a dealer file, or make a SIF readable. For the reverse direction use /csv-to-sif.
| 1 | # /sif-to-csv — SIF to CSV Converter |
| 2 | |
| 3 | Converts a SIF (Standard Interchange Format) file from a dealer or procurement system into a clean, human-readable CSV or Google Sheet. Translates field codes to column headers, expands options and attributes, calculates pricing, and computes totals. |
| 4 | |
| 5 | ## When to Use |
| 6 | |
| 7 | - Received a SIF file from a dealer and need to review it as a spreadsheet |
| 8 | - Importing dealer pricing back into your FF&E schedule |
| 9 | - Comparing a dealer quote (SIF) against your original specification |
| 10 | - Loading dealer data into the master Google Sheet |
| 11 | |
| 12 | ## SIF Format Reference |
| 13 | |
| 14 | SIF is a text-based key-value format. Each line is `CODE=VALUE`, terminated by CRLF. Products are separated by records starting with `PN=`. |
| 15 | |
| 16 | ### Core fields |
| 17 | |
| 18 | | Code | Name | Description | |
| 19 | |------|------|-------------| |
| 20 | | `SF` | Specification File | Project reference (header) | |
| 21 | | `ST` | Specification Title | Display title (header) | |
| 22 | | `PN` | Product Number | SKU — starts a new record | |
| 23 | | `PD` | Product Description | Product name | |
| 24 | | `MC` | Manufacturer Code | 3-5 char code | |
| 25 | | `MN` | Manufacturer Name | Full name | |
| 26 | | `QT` | Quantity | Integer | |
| 27 | | `NT` | Quantity (alt) | Some systems use NT instead of QT | |
| 28 | | `GC` | Category / Group Code | Product category | |
| 29 | | `G0` | Vendor / Group ID | Vendor identifier | |
| 30 | |
| 31 | ### Pricing fields |
| 32 | |
| 33 | | Code | Name | Description | |
| 34 | |------|------|-------------| |
| 35 | | `PL` | List Price | Unit list price | |
| 36 | | `P1`-`P5` | Price Tiers | Alternate price tiers | |
| 37 | | `I1` | Unit List Price (Cyncly) | Cyncly Worksheet | |
| 38 | | `I2` | Purchase Price (Cyncly) | Cyncly Worksheet | |
| 39 | | `S-` / `S%` | Sell Discount % | Sell = PL - (PL × S- × 0.01) | |
| 40 | | `P%` / `B%` | Purchase/Buy % | Cost = PL × (P% × 0.01) | |
| 41 | |
| 42 | ### Product detail fields |
| 43 | |
| 44 | | Code | Name | Description | |
| 45 | |------|------|-------------| |
| 46 | | `TG` | Side Mark / Tag | Room, area, or project tag | |
| 47 | | `ON` / `OD` | Option | Number + description pair | |
| 48 | | `AN` / `AD` | Attribute | Number + description pair | |
| 49 | | `WT` | Weight | Product weight | |
| 50 | | `VO` | Volume | Product volume | |
| 51 | | `PRC` | Product Category (Cyncly) | Cyncly category | |
| 52 | |
| 53 | ### Link fields |
| 54 | |
| 55 | | Code | Name | Description | |
| 56 | |------|------|-------------| |
| 57 | | `ProductURL` | Product Page URL | Link to product page | |
| 58 | | `ImageURL` | Product Image URL | Link to product image | |
| 59 | | `PV` | Picture Path | Local file path | |
| 60 | |
| 61 | ### Alternate manufacturer codes |
| 62 | |
| 63 | | System | Code | Purpose | |
| 64 | |--------|------|---------| |
| 65 | | Standard | `MC` | 3-5 char manufacturer code | |
| 66 | | Cyncly | `MG` | Manufacturer code (replaces MC) | |
| 67 | | CET | `EC` | Manufacturer code (alt) | |
| 68 | |
| 69 | ## Step 1: Accept Input |
| 70 | |
| 71 | **SIF file:** |
| 72 | ``` |
| 73 | /sif-to-csv ./dealer-quote.sif |
| 74 | ``` |
| 75 | |
| 76 | **Pasted SIF content:** |
| 77 | ``` |
| 78 | /sif-to-csv |
| 79 | SF=Project Alpha |
| 80 | ST=Dealer Quote - March 2026 |
| 81 | PN=670 |
| 82 | PD=Eames Lounge Chair and Ottoman |
| 83 | MC=HMI |
| 84 | QT=3 |
| 85 | PL=5695.00 |
| 86 | S-=42 |
| 87 | TG=Executive Lounge |
| 88 | OD=Santos Palisander / Black MCL Leather |
| 89 | ``` |
| 90 | |
| 91 | ## Step 2: Parse SIF |
| 92 | |
| 93 | Read the file and parse each record: |
| 94 | |
| 95 | 1. **Header fields**: Extract `SF` and `ST` |
| 96 | 2. **Records**: Split on `PN=` boundaries |
| 97 | 3. **For each record**, extract all fields |
| 98 | 4. **Detect manufacturer code variant**: look for MC, MG, or EC — normalize to brand name |
| 99 | 5. **Detect price variant**: look for PL, P1, I1 — use whichever is present |
| 100 | 6. **Detect quantity variant**: look for QT or NT |
| 101 | 7. **Calculate derived values**: |
| 102 | - Sell Price: `PL - (PL × S- × 0.01)` if discount present |
| 103 | - Net Price: `PL × (P% × 0.01)` if purchase % present |
| 104 | - Extended List: `PL × QT` |
| 105 | - Extended Sell: `Sell Price × QT` |
| 106 | |
| 107 | ### Manufacturer code expansion |
| 108 | |
| 109 | | MC | Brand | MC | Brand | |
| 110 | |----|-------|----|-------| |
| 111 | | HMI | Herman Miller | BLU | Blu Dot | |
| 112 | | MKN | MillerKnoll | DWR | Design Within Reach | |
| 113 | | KNL | Knoll | FRH | Fritz Hansen | |
| 114 | | STC | Steelcase | VIT | Vitra | |
| 115 | | HAW | Haworth | ARP | Arper | |
| 116 | | TEK | Teknion | FLS | Flos | |
| 117 | | HUM | Humanscale | LPO | Louis Poulsen | |
| 118 | | KIM | Kimball | ART | Artemide | |
| 119 | | OFS | OFS | HBF | HBF | |
| 120 | | GEI | Geiger | BRN | Bernhardt | |
| 121 | |
| 122 | For unknown codes, keep as-is and flag. |
| 123 | |
| 124 | ### Options and attributes |
| 125 | - Multiple `ON`/`OD` pairs → concatenate into "Options" column, separated by ` | ` |
| 126 | - Multiple `AN`/`AD` pairs → concatenate into "Attributes" column, separated by ` | ` |
| 127 | - If `AN=DIM`, parse dimension string back into W/D/H if possible |
| 128 | |
| 129 | ## Step 3: Present Preview |
| 130 | |
| 131 | ``` |
| 132 | ## SIF Import: Project Alpha — Dealer Quote March 2026 |
| 133 | |
| 134 | 3 records parsed from dealer-quote.sif |
| 135 | |
| 136 | | # | SKU | Product | Brand | Qty | List $ | Disc % | Sell $ | Ext Sell | Options | Tag | |
| 137 | |---|-----|---------|-------|-----|--------|--------|----- |