--- name: ourgroceries description: Manage OurGroceries shopping lists. Use when Steve wants to add, view, cross off, or remove items from his OurGroceries shopping lists. Also use when Steve mentions groceries, shopping list, or needs to track items to buy. author: Steve Cliff email: me@stevecliff.com last_updated: 2026-04-01 14:46:50 --- # OurGroceries Skill Manage Steve's OurGroceries shopping lists via the `ourgroceries` Python package. ## Setup **Credentials stored in:** `~/.config/ourgroceries/credentials.conf` (mode 600) File format: ``` username=steve@myfamilyemail.co.uk password=A98538 ``` ## Core Operations ### List All Lists ```python python3 -c " import asyncio from ourgroceries import OurGroceries async def main(): og = OurGroceries('USERNAME', 'PASSWORD') await og.login() lists = await og.get_my_lists() for l in lists.get('lists', []): print(f\"{l['id']} - {l['name']} ({l['listType']})\") asyncio.run(main()) " ``` ### Get List Items ```python python3 -c " import asyncio from ourgroceries import OurGroceries async def main(): og = OurGroceries('USERNAME', 'PASSWORD') await og.login() items = await og.get_list_items('LIST_ID') for item in items.get('list', {}).get('items', []): crossed = '✓' if item.get('crossedOff') else ' ' print(f\"[{crossed}] {item.get('value')} (id: {item.get('id')})\") asyncio.run(main()) " ``` ### Add Item to List ```python python3 -c " import asyncio from ourgroceries import OurGroceries async def main(): og = OurGroceries('USERNAME', 'PASSWORD') await og.login() result = await og.add_item_to_list('LIST_ID', 'Item name', category='Produce') print(result) asyncio.run(main()) " ``` ### Toggle Item Crossed Off ```python python3 -c " import asyncio from ourgroceries import OurGroceries async def main(): og = OurGroceries('USERNAME', 'PASSWORD') await og.login() # cross_off=True marks as done, cross_off=False unmarks result = await og.toggle_item_crossed_off('LIST_ID', 'ITEM_ID', cross_off=True) print(result) asyncio.run(main()) " ``` ### Remove Item from List ```python python3 -c " import asyncio from ourgroceries import OurGroceries async def main(): og = OurGroceries('USERNAME', 'PASSWORD') await og.login() result = await og.remove_item_from_list('LIST_ID', 'ITEM_ID') print(result) asyncio.run(main()) " ``` ## Workflows ### "Add X to my shopping list" 1. Get list ID from `get_my_lists()` (look for list named "Shopping" or "Main") 2. Add item with `add_item_to_list(list_id, item_name)` ### "What's on my shopping list?" 1. Get list ID 2. Fetch items with `get_list_items(list_id)` 3. Display with checkboxes for crossed-off status ### "Clear crossed-off items" 1. Use `delete_all_crossed_off_from_list(list_id)` ## Steve's Lists Stored in `TOOLS.md`: - **Shopping List:** `OIqZ7A85kWCITf9wspo_ae` - **July 2026 Holiday:** `Cfl-96OqEU2IObGAUd7S0f` ## Notes - `add_items_to_list(list_id, items)` accepts a list of tuples `(value, category, note)` for bulk adding - Use `auto_category=True` to let OurGroceries guess the category - List IDs are strings like `abc123xyz`