一键导入
migrate-to-uv
Migrate Keboola Python components to modern uv build system with deterministic dependencies and ruff linting.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Migrate Keboola Python components to modern uv build system with deterministic dependencies and ruff linting.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | migrate-to-uv |
| description | Migrate Keboola Python components to modern uv build system with deterministic dependencies and ruff linting. |
| tools | Bash, Read, Write, Edit, Glob, Grep, Task, Question |
| model | sonnet |
| color | purple |
Migrate a Keboola component (Docker-based, ECR-deployed) from requirements.txt + pip to pyproject.toml + uv with ruff linting.
Execute all steps yourself using the tools available to you. Do NOT delegate to or invoke any other agent (component-builder, develop-component, or similar) — except component-developer:component-defaults in Phase 6.
You MUST complete every step below. Do not skip any step — if a file doesn't exist, move on silently.
cat requirements.txt
grep "FROM python:" Dockerfile
cat .github/workflows/push.yml
migrate to pyproject.toml 📦pyproject.tomlCreate a minimal pyproject.toml with metadata and ruff config but no dependencies yet — you'll populate those with uv add next:
requires-python = "~=3.13.0" and target-version = "py313"dependencies = [] empty for nowThen populate dependencies from requirements.txt using uv:
# Add all main deps at once
uv add -r requirements.txt
# Move test-only deps to the dev group (common ones: pytest, mock, freezegun, responses)
# For each test dep found in requirements.txt:
uv remove <test-dep>
uv add --group dev <test-dep>
uv add auto-converts pinned versions to >= ranges and updates uv.lock in place — no manual conversion needed.
rm -f requirements.txt
rm -f .flake8 flake8.cfg
rm -f scripts/build_n_run.ps1 scripts/run.bat scripts/run_kbc_tests.ps1
rm -f scripts/update_dev_portal_properties.sh
rm -rf docs/imgs/
rm -f component_config/configuration_description.md component_config/stack_parameters.json
(rm -f silently does nothing if a file doesn't exist — no errors, no stopping.)
component_config/ URLs (if the files are currently empty)component_config/documentationUrl.md → https://github.com/keboola/REPO/blob/master/README.md
component_config/licenseUrl.md → https://github.com/keboola/REPO/blob/master/LICENSE.md
component_config/sourceCodeUrl.md → https://github.com/keboola/REPO
.gitignoreAdd these lines if not present:
*.egg-info/
.venv/
.DS_Store
/data
Replace bare data/ with /data. Remove duplicate .vscode/ entries.
git add -u # stages all deletions
git add pyproject.toml uv.lock .gitignore component_config/
git commit -m "migrate to pyproject.toml 📦"
uv 💜DockerfileUse the multi-stage build pattern. The base stage is shared by both test and production — keeping the production image lean (no dev deps, no test files).
FROM python:3.13-slim AS base
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
# apt-get installs MUST come before uv sync
# RUN apt-get update && apt-get install -y <packages> ← keep if already present
WORKDIR /code/
COPY pyproject.toml uv.lock ./
ENV UV_PROJECT_ENVIRONMENT="/usr/local/"
RUN uv sync --no-dev --frozen
COPY src/ src/
COPY scripts/ scripts/
COPY deploy.sh .
FROM base AS test
RUN uv sync --all-groups --frozen
COPY tests/ tests/
RUN uv run ruff check src/ tests/
CMD ["uv", "run", "pytest", "tests/", "-v"]
FROM base AS production
CMD ["python", "-u", "/code/src/component.py"]
Notes:
base installs only production deps (--no-dev); test adds dev deps on toptest stage — failing fastENV KEY="value" syntax (not old ENV KEY value)pip install anywhereapt-get blocks must stay before RUN uv syncscripts/build_n_test.sh#!/bin/sh
set -e
ruff check
python -m pytest tests/ --tb=short -q
tests/__init__.pyReplace old os.path pattern:
import sys
from pathlib import Path
sys.path.append(str(Path(__file__).resolve().parent.parent / "src"))
.github/workflows/push.ymlThe canonical push.yml uses a multi-job pipeline that matches the multi-stage Dockerfile. Rather than patching individual steps, replace the file entirely with the canonical template (from Phase 6 / component-defaults) and update only the env: block for this component:
env:
KBC_DEVELOPERPORTAL_APP: "vendor.component-id" # full component ID from Developer Portal
KBC_DEVELOPERPORTAL_VENDOR: "vendor" # your vendor name
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
KBC_DEVELOPERPORTAL_USERNAME: ${{ vars.KBC_DEVELOPERPORTAL_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
KBC_DEVELOPERPORTAL_PASSWORD: ${{ secrets.KBC_DEVELOPERPORTAL_PASSWORD }}
KBC_TEST_PROJECT_CONFIGS: ""
KBC_STORAGE_TOKEN: ${{ secrets.KBC_STORAGE_TOKEN }}
The new pipeline structure (keep as-is from the canonical template):
push_event_info — branch/tag detection, is_deploy_ready output (requires default branch + semantic tag)build-test — builds --target test stage, uploads as *-test.tar artifacttests — downloads test artifact, runs container (default CMD = pytest; ruff already ran at build time)tests-kbc — runs KBC integration tests if KBC_TEST_PROJECT_CONFIGS and token are setbuild-production — builds --target production stage after all tests pass, uploads as *.tar artifactpush — loads production artifact, pushes to ECRdeploy — sets tag in Developer Portal, only if is_deploy_ready == trueupdate_developer_portal_properties — runs scripts/developer_portal/update_properties.shuv add already updated uv.lock during Commit 1. Run this to ensure it's fully consistent:
uv sync --all-groups
git add Dockerfile scripts/ tests/ .github/workflows/
git commit -m "uv 💜"
ruff linting baseline 🎨ruff format .
ruff check --fix .
Commit if any files changed:
git add src/ tests/
git commit -m "ruff linting baseline 🎨"
Use the Task tool to load the canonical template files:
component-developer:component-defaults"Return the canonical Keboola component template files."Then compare each of the following against the returned canonical versions:
| Component file | Canonical |
|---|---|
Dockerfile | from component-defaults |
.github/workflows/push.yml | from component-defaults |
scripts/build_n_test.sh | from component-defaults |
docker-compose.yml | from component-defaults |
.pre-commit-config.yaml | from component-defaults |
Fix structural differences. Keep component-specific additions (custom apt packages, SSL certs, etc.).
Create missing files from the canonical version (.pre-commit-config.yaml is often absent in old components).
git add Dockerfile scripts/ .github/workflows/ docker-compose.yml .pre-commit-config.yaml
git commit -m "align with cookiecutter template 🍪"
# Build and run tests (ruff runs at build time inside the test stage)
docker build --target test -t test-component .
docker run test-component
# Optionally verify the production image builds cleanly
docker build --target production -t prod-component .
Dependency conversion:
requirements.txt pyproject.toml
keboola.component==1.4.4 "keboola-component>=1.4.4"
mock "mock>=5.2.0" (in dev group)
Ruff config (always use "UP" for pyupgrade):
[tool.ruff]
line-length = 120
target-version = "py313"
[tool.ruff.lint]
extend-select = ["I", "UP"]
Host an MCP server as a private, single-tenant Keboola data app — a dedicated remote MCP endpoint on your own Keboola compute (Keboola MCP is the built-in example, but it wraps any streamable-HTTP / FastMCP server) with client auth. Use when a user wants a private or self-hosted MCP endpoint, or would benefit from one but hasn't asked (see "When to use this"). Keywords: host/self-host MCP server as Keboola data app, private/remote MCP endpoint, deploy MCP to Keboola.
Use right after a Keboola semantic-context tool returns, when building an app, query, report, or transformation from a semantic model. Ground the SQL in the model's own physical mapping (dataset `tableId`/`fqn`, metric SQL) and confirm the real columns before writing any query — do not build SQL from the business-facing display names.
Use when building, modifying, deploying, or debugging Keboola Apps (Streamlit or Python/JS). Covers the full lifecycle — choosing app type, configuring keboola-config/, storage access (RO workspace, RW Query Service, input mapping), authentication, DuckDB caching for performance, default Keboola styling, dashboard patterns, optional Kai chat integration, and the three client paths (MCP-only, Claude Code with filesystem, kbagent CLI).
Use when accessing a Keboola-managed Git (Forgejo) repo for a python-js data app via the kbagent CLI — provisioning the repo, finding its repo_url, minting a git_clone_url / push credential with create_python_js_data_app_git_credential, pushing source to Keboola git, copying source between GitHub and Keboola git, working around the ~15MB / HTTP 413 push cap with build-at-deploy, or deploying a data app from its managed git repo. Triggers: kbagent, Keboola managed git, Forgejo, data app repo, repo_url, git_clone_url, create git credential, push to Keboola git, build-at-deploy, HTTP 413, deploy from git.
Use this skill to migrate an existing Microsoft Power BI semantic model into a Keboola semantic layer model. Accepts two input shapes: (1) TMDL folder extracted with the Microsoft Power BI Modeling MCP server in `--readonly` mode (canonical, captures DAX + Power Query M expressions verbatim); (2) per-table JSON produced by older `get_semantic_model` calls (missing M steps). Maps Power BI tables → Keboola semantic-dataset, measures → semantic-metric (DAX preserved verbatim, flagged for SQL translation), relationships → semantic-relationship. Produces JSON files ready to push to the Keboola metastore via `sl-toolkit` or the REST API. Use for: migrate PowerBI semantic model, convert Power BI to Keboola SL, translate TMDL, import PowerBI tables, powerbi-to-sl, pbi-migration, brownfield semantic layer. Trigger when the user has PowerBI artifacts (TMDL folder, `*_semantic_layer.json`, `.bim`, `.pbip`) and wants them as a Keboola semantic layer.
Semantic layer reference for Keboola. Auto-loads when the user mentions: semantic layer, semantic model, SL, metastore, semantic-metric, semantic-dataset, semantic-relationship, semantic-glossary, semantic-constraint, inspect model, validate model, threshold constraints, metric sql, model entities, add dataset, create metric, update metric, delete metric, remove constraint. Provides API reference, payload shapes, CRUD procedures, validation rules, and operational gotchas so Claude can work with the metastore directly.