Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 12 additions & 6 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,16 @@ USER root
RUN curl -LsSf https://astral.sh/uv/install.sh | UV_INSTALL_DIR=/usr/local/bin sh

# Set workspace
WORKDIR /workspaces
WORKDIR /workspace

# [Optional] Add sudo support for the non-root user
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
&& apt-get -y install --no-install-recommends npm libsecret-1-0 sudo stow \
&& echo "vscode ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/vscode

RUN npm install -g @modelcontextprotocol/server-filesystem
RUN npm install -g @modelcontextprotocol/server-filesystem @modelcontextprotocol/server-github @modelcontextprotocol/server-sequential-thinking

RUN chown -R vscode:vscode /workspaces
RUN chown -R vscode:vscode /workspace

# [Optional] Set the default user. Omit if you want to connect as root.
USER vscode
Expand All @@ -30,13 +30,19 @@ RUN uvx --from omega-memory omega setup --download-model
RUN uv tool install git+https://github.com/sydasif/web-search-mcp.git

RUN curl -fsSL https://antigravity.google/cli/install.sh | sh
RUN curl -fsSL https://opencode.ai/install | bash

# Stow AI dotfiles
RUN cd .ai-dotfiles && stow -v -t ~ gemini claude codex vibe
RUN mkdir -p ~/.config/opencode/skills && cd .ai-dotfiles && stow -v -t ~/.config/opencode opencode
RUN stow -v -t ~/.config/opencode/skills --no-folding .skills
RUN mkdir -p ~/.agents/skills && stow -v -t ~/.agents/skills --no-folding .skills

# Preserve git config and ensure uv is in PATH for bash
RUN echo 'git config --global user.email "ddvlamin@gmail.com"' >> ~/.bashrc && \
echo 'git config --global user.name "Dieter Devlaminck"' >> ~/.bashrc && \
echo 'export GITHUB_TOKEN=$(gh auth token 2>/dev/null)' >> ~/.bashrc
echo 'git config --global user.name "Dieter Devlaminck"' >> ~/.bashrc

#ENV PATH="/home/vscode/.opencode/bin:${PATH}"
ENV NO_BROWSER=true


ENV NO_BROWSER=true
9 changes: 0 additions & 9 deletions .devcontainer/devcontainer-lock.json

This file was deleted.

28 changes: 17 additions & 11 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
"dockerfile": "./Dockerfile",
"context": ".."
},
"workspaceFolder": "/workspaces",
"workspaceMount": "source=${localWorkspaceFolder},target=/workspaces,type=bind",
"workspaceFolder": "/workspace",
"workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind",
"customizations": {
"vscode": {
"extensions": [
Expand All @@ -20,21 +20,27 @@
"github.vscode-pull-request-github",
"mermaidchart.vscode-mermaid-chart",
"pomdtr.excalidraw-editor",
"hashicorp.terraform"
"hashicorp.terraform",
"qwtel.sqlite-viewer"
],
"settings": {
"python.defaultInterpreterPath": "/workspaces/.venv/bin/python"
"python.defaultInterpreterPath":"/workspace/.venv/bin/python"
}
}
},
"features": {
"ghcr.io/devcontainers/features/github-cli:1": {}
"ghcr.io/devcontainers/features/github-cli:1": {},
"ghcr.io/devcontainers/features/node:1": {
"version": "22"
}
},
"mounts": [
"source=${localEnv:HOME}/.config/gh,target=/home/vscode/.config/gh,type=bind,consistency=cached"
],
"postCreateCommand": "uv sync --group dev --frozen",
"forwardPorts": [
8888
]
}
"remoteEnv": {
"DEEPSEEK_API_KEY": "${localEnv:DEEPSEEK_API_KEY}",
"CORTECS_API_KEY": "${localEnv:CORTECS_API_KEY}",
"GOOGLE_GENERATIVE_AI_API_KEY": "${localEnv:GOOGLE_GENERATIVE_AI_API_KEY}"
},
"postCreateCommand": "bash .devcontainer/post_setup.sh",
"forwardPorts": [8888]
}
5 changes: 5 additions & 0 deletions .devcontainer/post_setup.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#if ! grep -q "GITHUB_TOKEN" ~/.bashrc; then
# echo 'export GITHUB_TOKEN=$(printf "protocol=https\nhost=github.com\n" | git credential fill 2>&1 | grep "^password=" | cut -d= -f2)' >> ~/.bashrc
#fi

uv sync --group dev --frozen
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -128,13 +128,15 @@ cython_debug/

recipes/
plan/
.obsidian/

# Agents
.antigravitycli
.antigravitycli/**
.ai-dotfiles/
.ai-dotfiles/**
.skills/**
.prompts/**

# Gemini CLI personal state/secrets
**/.gemini/oauth_creds.json
Expand Down
80 changes: 80 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
Project-specific instructions for future interactions to interact with this code base.

**Always use caveman skill**

## 1. Project Purpose

## 2. Architecture

## 3. Key Systems & Services

## 4. Repository Structure

## 5. Environment & Configuration

## 6. Behavioral guidelines to reduce common LLM coding mistakes.

**Tradeoff:** These guidelines bias toward caution over speed. For trivial tasks, use judgment.

### 1. Think Before Coding

**Don't assume. Don't hide confusion. Surface tradeoffs.**

Before implementing:
- State your assumptions explicitly. If uncertain, ask.
- If multiple interpretations exist, present them - don't pick silently.
- If a simpler approach exists, say so. Push back when warranted.
- If something is unclear, stop. Name what's confusing. Ask.

### 2. Simplicity First

**Minimum code that solves the problem. Nothing speculative.**

- No features beyond what was asked.
- No abstractions for single-use code.
- No "flexibility" or "configurability" that wasn't requested.
- No error handling for impossible scenarios.
- If you write 200 lines and it could be 50, rewrite it.

Ask yourself: "Would a senior engineer say this is overcomplicated?" If yes, simplify.

### 3. Surgical Changes

**Touch only what you must. Clean up only your own mess.**

When editing existing code:
- Don't "improve" adjacent code, comments, or formatting.
- Don't refactor things that aren't broken.
- Match existing style, even if you'd do it differently.
- If you notice unrelated dead code, mention it - don't delete it.

When your changes create orphans:
- Remove imports/variables/functions that YOUR changes made unused.
- Don't remove pre-existing dead code unless asked.

The test: Every changed line should trace directly to the user's request.

### 4. Goal-Driven Execution

**Define success criteria. Loop until verified.**

Transform tasks into verifiable goals:
- "Add validation" → "Write tests for invalid inputs, then make them pass"
- "Fix the bug" → "Write a test that reproduces it, then make it pass"
- "Refactor X" → "Ensure tests pass before and after"

For multi-step tasks, state a brief plan:
```
1. [Step] → verify: [check]
2. [Step] → verify: [check]
3. [Step] → verify: [check]
```

Strong success criteria let you loop independently. Weak criteria ("make it work") require constant clarification.

## 7. Behavioral guidelines to reduce common LLM coding mistakes.

### Shell Command Rules
- Double quote all file paths containing spaces: `"path/to/My File.txt"`
- Never use backslash-escaped whitespace: `path/to/My\ File.txt`
- Always validate Bash scripts with ShellCheck.
49 changes: 43 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,20 @@ An MCP server for the Colruyt Xtra app, allowing AI assistants to manage your sh

## Features

- **get_most_bought_products**: Fetch your frequently purchased items.
- **search_products**: Search the Colruyt catalog.
- **add_items_to_list**: Add products directly to your list.
- **add_recipe_to_list**: Parse markdown recipes and add ingredients with intelligent disambiguation.
- **resolve_ingredient**: Resolve an ingredient string to a Colruyt product using local SQLite fuzzy matching, catalog search API, and purchase history.
- **store_resolved_product**: Save user-selected product mappings to the local SQLite database for future automatic matching.
- **add_items_to_list**: Add products directly to your Colruyt shopping list.
- **add_recipe_to_list**: Parse markdown recipe files and add ingredients with intelligent disambiguation.

## Environment Variables

The server requires the following environment variables (see `.env.example`):

| Variable | Description | Example / Default |
| --- | --- | --- |
| `CLPBFF_SESSION` | Colruyt Xtra session cookie ID | `your_session_id_here` |
| `X_CG_APIKEY` | Colruyt Xtra API key (or `COLRUYT_API_KEY`) | `your_api_key_here` |
| `COLRUYT_PLACE_ID` | Colruyt store / place ID | `2643` |

## Setup

Expand All @@ -16,9 +26,11 @@ An MCP server for the Colruyt Xtra app, allowing AI assistants to manage your sh
```bash
uv sync
```
3. Set your environment variables (see `.env.example`):
3. Set environment variables in your environment or `.env` file:
```bash
export CLPBFF_SESSION=your_session_id
export CLPBFF_SESSION="your_session_id"
export X_CG_APIKEY="your_api_key_here"
export COLRUYT_PLACE_ID="2643"
```

## Running the Server
Expand All @@ -27,6 +39,31 @@ An MCP server for the Colruyt Xtra app, allowing AI assistants to manage your sh
python xtra/server.py
```

## AGY CLI MCP Configuration

To install `server.py` as an MCP server in AGY CLI, add `colruyt-xtra` to `mcp_config.json` (located at `~/.gemini/antigravity-cli/mcp_config.json`):

```json
{
"mcpServers": {
"colruyt-xtra": {
"command": "python",
"args": [
"-m",
"xtra.server"
],
"cwd": "/path/to/xtra-mcp",
"env": {
"PYTHONPATH": "/path/to/xtra-mcp",
"CLPBFF_SESSION": "your_session_id",
"X_CG_APIKEY": "your_api_key_here",
"COLRUYT_PLACE_ID": "2643"
}
}
}
}
```

## Recipe Integration

Place your markdown recipes in the `recipes/` folder. The server expects ingredients to be listed under a `## 🛒 Ingrediënten` header.
Expand Down
11 changes: 10 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ dependencies = [
"omega-memory[server]",
"httpx",
"pydantic",
"python-dotenv"
"python-dotenv",
"rapidfuzz>=3.0.0",
"beautifulsoup4>=4.12.0"
]

[dependency-groups]
Expand All @@ -18,3 +20,10 @@ dev = [
"pytest-asyncio>=0.23.0",
"ipykernel"
]

[tool.setuptools.packages.find]
include = ["xtra*"]

[tool.pytest.ini_options]
pythonpath = ["."]

30 changes: 15 additions & 15 deletions recipes/Thaise rode curry met kip.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,44 +9,44 @@ tags:
- spicy
---

# Thaise rode curry met kip
# Thai red curry with chicken

## 🛒 Ingrediënten
* **Eiwit:** 3 kipfilets
* **Vloeistoffen:** ½ l kokosmelk, ½ l visbouillon, 1 scheutje vissaus
* **Smaakmakers:** 2 dikke koffielepels rode currypasta, verse gember, 8 limoenblaadjes, 2 citroengras, 1 el rietsuiker
* **Groenten:** 1 rode paprika, 3 rode chilipepers, enkele sperzieboontjes, 1 courgette, 1 sjalot, 8 baby corns
* **Koolhydraten:** 1 kop basmatirijst, 2 koppen water
* **Afwerking:** Enkele blaadjes koriander, Thaise basilicum
* **Bakvet:** Palmolie of koolzaadolie
## Ingredients
* **Protein:** 3 kipfilets
* **Liquids:** ½ l kokosmelk, ½ l visbouillon, 1 scheutje vissaus
* **Seasoning:** 2 dikke koffielepels rode currypasta, verse gember, 8 limoenblaadjes, 2 citroengras, 1 el rietsuiker
* **Vegetables:** 1 rode paprika, 3 rode chilipepers, enkele sperzieboontjes, 1 courgette, 1 sjalot, 8 baby corns
* **Carbohydrates:** 1 kop basmatirijst, 2 koppen water
* **Garnish:** Enkele blaadjes koriander, Thaise basilicum
* **Cooking oil:** Palmolie of koolzaadolie

---

## 👨‍🍳 Bereiding
## Preparation

### 1. Voorbereiding & Rijst
### 1. Preparation & Rice
1. Breng de **basmatirijst** aan de kook in het water en laat pruttelen op een matig vuur.
2. Snij de **kipfilets** in blokjes.
3. Snij de **paprika, babycorns, courgette en sjalot** op gewenste grootte.
4. Snij het **citroengras** doormidden, snipper de **gember** fijn en snij de **chilipepers** in stukjes.

### 2. De Kip Wokken
### 2. Stir-frying the Chicken
1. Verhit een scheut palmolie in de wok.
2. Bak de kippenblokjes aan tot ze kleur krijgen. Haal ze uit de pan en zet opzij.
3. Maak de wok schoon met keukenrol.

### 3. Curry & Groenten
### 3. Curry & Vegetables
1. Verhit opnieuw olie. Bak de **currypasta** samen met de **groenten** aan.
2. Strooi de **rietsuiker** erover. (Voeg extra olie toe als het te droog is).
3. Roer regelmatig om en voeg de kippenblokjes weer toe.

### 4. Afwerking
### 4. Finishing
1. Deglaceer met de **vissaus**.
2. Voeg de **kokosmelk** en **visbouillon** toe.
3. Voeg de **rode peper** en **kruiden** (limoenblaadjes/citroengras) toe.
4. Laat **5 minuten** pruttelen.
5. Werk af met verse **basilicum** en **koriander**.

---
## 💡 Notities
## Notes
* Lekker met extra limoensap voor wat frisheid.
1 change: 1 addition & 0 deletions resources/.gitkeep
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Keep resources directory
Loading