Vercel Composition Patterns
supabase/supabase
React composition patterns that scale. An agent skill from supabase/supabase.
[Internal sub-skill of polylith-migrate-orchestrator. An agent skill from DavidVujic/python-polylith.
$ npx skills add DavidVujic/python-polylith --skill polylith-migrate-discover -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install DavidVujic/python-polylith polylith-migrate-discover --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/DavidVujic/python-polylith.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/polylith/migrate-project/polylith-migrate-discover .claude/skills/polylith-migrate-discover && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "polylith-migrate-discover" agent skill from https://github.com/DavidVujic/python-polylith/tree/main/.agents/skills/polylith/migrate-project/polylith-migrate-discover into .claude/skills/polylith-migrate-discover/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "polylith-migrate-discover", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/DavidVujic/python-polylith/tree/main/.agents/skills/polylith/migrate-project/polylith-migrate-discoverType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add DavidVujic/python-polylith --skill polylith-migrate-discover -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install DavidVujic/python-polylith polylith-migrate-discover --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/DavidVujic/python-polylith.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/polylith/migrate-project/polylith-migrate-discover .agents/skills/polylith-migrate-discover && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "polylith-migrate-discover" agent skill from https://github.com/DavidVujic/python-polylith/tree/main/.agents/skills/polylith/migrate-project/polylith-migrate-discover into .agents/skills/polylith-migrate-discover/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "polylith-migrate-discover", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add DavidVujic/python-polylith --skill polylith-migrate-discover -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install DavidVujic/python-polylith polylith-migrate-discover --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/DavidVujic/python-polylith.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/polylith/migrate-project/polylith-migrate-discover .cursor/skills/polylith-migrate-discover && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "polylith-migrate-discover" agent skill from https://github.com/DavidVujic/python-polylith/tree/main/.agents/skills/polylith/migrate-project/polylith-migrate-discover into .cursor/skills/polylith-migrate-discover/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "polylith-migrate-discover", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/DavidVujic/python-polylith.git --path .agents/skills/polylith/migrate-project/polylith-migrate-discover--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add DavidVujic/python-polylith --skill polylith-migrate-discover -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install DavidVujic/python-polylith polylith-migrate-discover --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/DavidVujic/python-polylith.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/polylith/migrate-project/polylith-migrate-discover .gemini/skills/polylith-migrate-discover && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "polylith-migrate-discover" agent skill from https://github.com/DavidVujic/python-polylith/tree/main/.agents/skills/polylith/migrate-project/polylith-migrate-discover into .gemini/skills/polylith-migrate-discover/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "polylith-migrate-discover", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install DavidVujic/python-polylith polylith-migrate-discoverInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add DavidVujic/python-polylith --skill polylith-migrate-discover -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/DavidVujic/python-polylith.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/polylith/migrate-project/polylith-migrate-discover .github/skills/polylith-migrate-discover && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "polylith-migrate-discover" agent skill from https://github.com/DavidVujic/python-polylith/tree/main/.agents/skills/polylith/migrate-project/polylith-migrate-discover into .github/skills/polylith-migrate-discover/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "polylith-migrate-discover", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add DavidVujic/python-polylith --skill polylith-migrate-discover -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install DavidVujic/python-polylith polylith-migrate-discover --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/DavidVujic/python-polylith.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/polylith/migrate-project/polylith-migrate-discover .opencode/skills/polylith-migrate-discover && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "polylith-migrate-discover" agent skill from https://github.com/DavidVujic/python-polylith/tree/main/.agents/skills/polylith/migrate-project/polylith-migrate-discover into .opencode/skills/polylith-migrate-discover/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "polylith-migrate-discover", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
polylith-migrate-discover[Internal sub-skill of polylith-migrate-orchestrator. An agent skill from DavidVujic/python-polylith.
Polylith Migrate Discover is an agent skill from DavidVujic/python-polylith. [Internal sub-skill of polylith-migrate-orchestrator. Do not load directly — load polylith-migrate-orchestrator first, which drives all phases.] Create migration/<PROJECT/state.md and migration/<PROJECT/manifest.md by inspecting the existing project under projects/<PROJECT/.
Its SKILL.md is about 4.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development. The repository describes itself as: Tooling support for the Polylith Architecture in Python. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit a7a80f2. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
uvpoetrygitpythonpipmakeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use uv, git and pip, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Polylith Migrate Discover loads about 4.6k tokens when it runs. Until then it costs about 79 tokens; SKILL.md has 1,833 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from DavidVujic/python-polylith at commit a7a80f2, republished under its MIT licence (© DavidVujic). 1,833 words, ~4,636 tokens.
.claude/skills/polylith-migrate-discover/SKILL.md (or your agent's skills folder).Inspect the project and create two artifacts that drive every subsequent migration phase:
migration/<PROJECT>/state.md — a flat KEY=value file (see schema below).migration/<PROJECT>/manifest.md — a human-readable structural inventory.💡
<PROJECT>is the project subfolder name (e.g.,apiforprojects/api/). Use that exact string everywhere — paths, filenames, branch names.
state.md schemaAll later skills read state.md as a flat KEY=value file. Use exactly this format — no markdown tables, no fenced TOML, no inline comments. One key per line.
# migration/<PROJECT>/state.md
PROJECT_DIR=projects/<PROJECT>
ORIG_TOP_NS=<current import namespace>
TARGET_TOP_NS=<desired Polylith namespace, defaults to ORIG_TOP_NS>
INITIAL_BASE_NAME=<snake_case base name for the temporary migration base>
ALIAS=<short kebab-case alias for poly info/deps tables, or empty>
GROUP=<polylith project group, or empty>
PACKAGE_MANAGER=<poetry|pipenv|pip|uv|setuptools>
LINTER=<flake8|pylint|ruff|none>
FORMATTER=<black|isort|ruff|none>
TYPE_CHECKER=<mypy|pyright|ty|none>
POLY_CMD_PREFIX=<poetry poly|pipenv run poly|pdm run poly|hatch run poly|uv run poly|poly>
BRICK_IMPORT_MECHANISM=<editable-root|pytest-pythonpath|other — how the workspace exposes <TARGET_TOP_NS>.* bricks for import>
SHIM_STRATEGY=<shim|shimless — chosen in phase 2 (polylith-migrate-analyze-imports); may be empty at discover>
CONVERT_LINTER=<yes|no>
CONVERT_TYPE_CHECKER=<yes|no>
CONVERT_PACKAGE_MANAGER=<yes|no>
RUN_TEST_CMD=<full command to run tests>
RUN_LINT_CMD=<full command to run linting, or empty>
RUN_TYPECHECK_CMD=<full command to run type checking, or empty>
GIT_BRANCH=<migration branch name created in orchestrator Phase 0>
GIT_BASE_SHA=<commit SHA of the migration branch start point>| Key | Description | Source |
|---|---|---|
PROJECT_DIR | Project subfolder path. | The orchestrator's <PROJECT>. |
ORIG_TOP_NS | Current top-level Python package name. | First non-tests directory under projects/<PROJECT>/src/ or projects/<PROJECT>/. |
TARGET_TOP_NS | Desired Polylith namespace. | workspace.toml [tool.polylith].namespace, or ORIG_TOP_NS if no workspace exists yet. |
INITIAL_BASE_NAME | Name of the single temporary base used to hold all code during early phases. Becomes the default base name in polylith-migrate-isolate-base-and-big-component. Final migrations usually contain several bases — this is just the starting one. | Derived from [project.name], confirmed by user. |
ALIAS | Short alias shown in poly info / poly deps tables. Optional. | Derived, confirmed by user. |
GROUP | Polylith project group. Optional. | Asked from user. |
PACKAGE_MANAGER / LINTER / FORMATTER / TYPE_CHECKER | Detected tooling. | Detection table below. |
POLY_CMD_PREFIX | Prefix every poly … command in later skills uses. | Derived from PACKAGE_MANAGER. |
BRICK_IMPORT_MECHANISM | How the workspace makes <TARGET_TOP_NS>.* bricks importable for tests/dev. editable-root (root project is editable-installed; e.g. Hatch dev-mode-dirs), pytest-pythonpath (root [tool.pytest.ini_options].pythonpath = ["bases","components","development"]), or other. | Step 4: confirmed/established below. |
SHIM_STRATEGY | shim or shimless — chosen in phase 2 (polylith-migrate-analyze-imports). May be empty at discover. | polylith-migrate-analyze-imports. |
CONVERT_* | Whether the user opted in to a tooling conversion. | Asked from user. |
RUN_TEST_CMD etc. | The exact shell commands the migration verifies against after each phase. | Derived from project config, confirmed by user if ambiguous. |
GIT_BRANCH / GIT_BASE_SHA | Set by the orchestrator's Phase 0; recorded here so later skills know where to roll back to. | Orchestrator. |
INITIAL_BASE_NAME and ALIAS from [project.name][project.name] | INITIAL_BASE_NAME (snake) | ALIAS (kebab) |
|---|---|---|
example-service-a | example_a | svc-a |
order-management-api | order_management | order-mgmt |
payment-worker | payment | payment |
When any later phase loads state.md, validate before proceeding:
migration/<PROJECT>/state.md.# comment, or KEY=value. No markdown tables, no fenced TOML, no inline comments after a value.PACKAGE_MANAGER, LINTER, FORMATTER, TYPE_CHECKER, BRICK_IMPORT_MECHANISM, SHIM_STRATEGY (when set), and the three CONVERT_* flags use only the documented values.PROJECT_DIR, ORIG_TOP_NS, TARGET_TOP_NS, INITIAL_BASE_NAME, PACKAGE_MANAGER, POLY_CMD_PREFIX, BRICK_IMPORT_MECHANISM, RUN_TEST_CMD, GIT_BRANCH, GIT_BASE_SHA must all be non-empty. (SHIM_STRATEGY may be empty until phase 2 sets it.)POLY_CMD_PREFIX matches PACKAGE_MANAGER per the mapping table.If validation fails, abort the phase, surface the offending line(s) to the user, and ask them to fix state.md before retrying. Never silently coerce values.
Run these in order. Every step writes to
state.mdormanifest.md. Do not skip the confirmation gates (steps 4 and 7).
Read projects/<PROJECT>/pyproject.toml (or setup.cfg/setup.py) and fill in PROJECT_DIR, ORIG_TOP_NS, TARGET_TOP_NS, and the derived INITIAL_BASE_NAME, ALIAS per the tables above.
Scan project config files and fill in PACKAGE_MANAGER, LINTER, FORMATTER, TYPE_CHECKER:
| Tool | Detection criteria |
|---|---|
| Package Manager | |
| Poetry | poetry.lock or [tool.poetry] in pyproject.toml |
| Pipenv | Pipfile or Pipfile.lock |
| Pip | requirements.txt (no lock file) |
| UV | uv.lock or [tool.uv] in pyproject.toml |
| Setuptools | setup.py or setup.cfg only |
| Linter | |
| Flake8 | setup.cfg, tox.ini [flake8] section, or .flake8 |
| Pylint | [tool.pylint] or .pylintrc |
| Ruff | [tool.ruff] |
| Formatter | |
| Black | [tool.black] |
| Isort | [tool.isort] |
| Ruff | [tool.ruff.format] |
| Type Checker | |
| Mypy | mypy.ini, .mypy.ini, or [tool.mypy] |
| Pyright | [tool.pyright] or pyrightconfig.json |
| Ty | [tool.ty] |
POLY_CMD_PREFIXMap PACKAGE_MANAGER to the command prefix:
PACKAGE_MANAGER | POLY_CMD_PREFIX |
|---|---|
poetry | poetry poly |
pipenv | pipenv run poly |
pdm | pdm run poly |
hatch | hatch run poly |
uv | uv run poly |
pip / setuptools / activated venv | poly |
Check for Virtualenv: Verify if the project has a virtualenv or if dependencies are installed. For example:
uv: Check for uv.lock or .venv. If no virtualenv exists, guide the user to run uv sync.pdm: Run pdm venv list to check for a virtualenv. If none exists, guide the user to run pdm install.poetry: Run poetry env list to check for a virtualenv. If none exists, guide the user to run poetry install.pip: Check if a venv or .venv directory exists. If not, guide the user to create and activate one.Reconcile the Python version: Compare the project's requires-python with the workspace's (requires-python in the root pyproject.toml and the root .python-version). If they disagree (e.g. project >=3.13, workspace >=3.12), the baseline test command can silently resolve the wrong interpreter. Resolve before establishing the baseline by either:
requires-python / .python-version) — confirm with the user, as it affects every project; oruv run --python 3.13 …).Establish the brick-import mechanism: Tests and entrypoints import bricks as <TARGET_TOP_NS>.<brick> from bases/ and components/. Confirm the workspace actually exposes them — this is a prerequisite for RUN_TEST_CMD to work after code is moved into a base (phase 3+). Inspect the root pyproject.toml:
dev-mode-dirs = ["components","bases","development", …] and the root is actually installed — not [tool.uv] package = false), set BRICK_IMPORT_MECHANISM=editable-root.pythonpath = ["bases","components","development"] to the root [tool.pytest.ini_options] and set BRICK_IMPORT_MECHANISM=pytest-pythonpath.<package-manager> run python -c "import <TARGET_TOP_NS>" (once at least one brick exists, e.g. after phase 3). It must succeed.⚠ Common trap: a root
pyproject.tomlwith bothdev-mode-dirsand[tool.uv] package = falselooks configured but installs nothing —<TARGET_TOP_NS>.*is then unimportable and every post-extract-to-basetest run fails withModuleNotFoundError: No module named '<TARGET_TOP_NS>'. Preferpytest-pythonpath(it avoids changing the install model), or make the root installable.
Verify RUN_TEST_CMD: Run the test command in the project's directory to ensure it works.
⚠ You are executing untrusted code. Running the project's tests and the install/sync commands below executes arbitrary code from the project (e.g.
setup.py,conftest.py, build hooks) and from resolved third-party packages (post-install scripts). Only run these on a project the user trusts; do not proceed on an unknown or untrusted codebase.
For example:
uv: Run uv run pytest tests --collect-only -q | tail -1. If the command fails, guide the user to install test dependencies (e.g., uv sync --extra tests).pdm: Run pdm run pytest tests --collect-only -q | tail -1. If the command fails, guide the user to install test dependencies (e.g., pdm install --group tests).poetry: Run poetry run pytest tests --collect-only -q | tail -1. If the command fails, guide the user to install test dependencies (e.g., poetry install --with tests).pip: Run python -m pytest tests --collect-only -q | tail -1. If the command fails, guide the user to install test dependencies (e.g., pip install -e ".[tests]").Record Baseline: Record the baseline test count (e.g., number of tests collected) in state.md. If the command differs (e.g., python -m pytest), update RUN_TEST_CMD to match the working command.
Inspect Config Files: Inspect Makefile, Justfile, tox.ini, pyproject.toml [tool.pytest.ini_options], and CI config (.github/workflows/*.yml, .circleci/config.yml, etc.) to identify the project's existing commands. Fill RUN_TEST_CMD, and RUN_LINT_CMD / RUN_TYPECHECK_CMD when present. If a command can't be found, leave the value empty.
🔒 Never store secrets in
state.md.state.mdis committed. When a derived command embeds a credential (an inline token, a--token=…flag, a database URL with a password, an API key), do not copy the literal value. Reference the environment variable name instead (e.g.RUN_TEST_CMD=DATABASE_URL=$DATABASE_URL uv run pytest …), and have the user supply the secret via their environment at run time. Redact any literal credential before writing the file. The same applies tomanifest.md— it captures structure, not secrets.
Proceed Only After Verification: Only proceed to the next phase if RUN_TEST_CMD succeeds. If it fails, guide the user to resolve the issue before continuing.
Read the workspace root pyproject.toml to determine the workspace's standard linter, formatter, type checker, and package manager.
LINTER/FORMATTER already matches the workspace's → set CONVERT_LINTER=no (skip).TYPE_CHECKER already matches the workspace's → set CONVERT_TYPE_CHECKER=no (skip).PACKAGE_MANAGER is already uv and the workspace uses uv → set CONVERT_PACKAGE_MANAGER=no (skip).polylith-migrate-convert-package-manager does not apply at all — set CONVERT_PACKAGE_MANAGER=no and skip the question below.manifest.mdWrite migration/<PROJECT>/manifest.md using exactly this template — fixed headings, fixed shapes. Later phases parse this file by heading.
# migration/<PROJECT>/manifest.md
## Directory tree
<output of a `directory_tree` call on `projects/<PROJECT>/`, fenced as a code block>
## Module map
| Path | Role |
|------|------|
| `<relative path>` | <one-line description: "FastAPI route handlers", "Kafka consumer", "domain model", etc.> |
## Entrypoints
- `<path>`: <entrypoint type — FastAPI app / CLI main / Lambda handler / worker run / scheduled job>
## Tests
- Root: `<path>` (relative to project)
- File count: <n>
- Fixture files: `<path>`, `<path>`, …
## Infrastructure
- `<path>`: <type — Dockerfile / k8s manifest / Helm chart / alembic config / deploy script>⚠ Keep the five
##headings literal. Downstream phases reference them by name; renaming a heading silently breaks input discovery.
Do not proceed past this step without explicit user confirmation. Present the derived state in one block:
Derived from projects/<PROJECT>/:
INITIAL_BASE_NAME = <value> ← initial base name; you will likely add more bases later
ALIAS = <value> ← short alias for poly info/deps tables (optional)
GROUP = <value> ← project group (optional)
Detected tooling:
PACKAGE_MANAGER = <value>
LINTER = <value>
FORMATTER = <value>
TYPE_CHECKER = <value>
Verification commands:
RUN_TEST_CMD = <value>
RUN_LINT_CMD = <value or empty>
RUN_TYPECHECK_CMD = <value or empty>
Optional conversions you can opt into:
- Convert linter/formatter to match workspace standard? (default: no)
- Convert type checker to match workspace standard? (default: no)
- Convert package manager to uv (workspace-uv only)? (default: no)
Confirm the values above, or correct any of them.Wait for the user's response. Update state.md with corrections and the CONVERT_* answers.
| Symptom | Likely cause | Remediation |
|---|---|---|
Derived INITIAL_BASE_NAME collides with an existing brick under bases/<TARGET_TOP_NS>/ or components/<TARGET_TOP_NS>/ | Two projects derive the same base name from a generic [project.name]. | Append a project-specific suffix (e.g., payment_api instead of payment) and re-confirm with the user. Check before writing state.md. |
| Project has no detectable test command | No pytest / make test / CI config that reveals a runnable test command. | Ask the user explicitly. If none exists, set RUN_TEST_CMD= empty and record that every later phase loses its primary safety check — flag the heightened risk and, after each phase, verify that each base's entrypoint module imports cleanly and its wiring matches the original. |
| Multiple linters or formatters are configured simultaneously (e.g., black + ruff format both active) | Project history accumulated tools without a cleanup. | Record both in state.md (comma-separated values are acceptable in this one case), and flag for resolution during polylith-migrate-convert-linter. Do not silently pick one. |
| Baseline test command resolves the wrong Python (e.g. "incompatible with the project's Python requirement") | Project requires-python disagrees with the workspace root requires-python / .python-version. | Reconcile per step 4.2 — align the workspace version (confirm with user) or record a per-command --python <X> override in the verification commands. |
ModuleNotFoundError: No module named '<TARGET_TOP_NS>' once code is in a base | The workspace doesn't expose bricks (e.g. root [tool.uv] package = false with dev-mode-dirs that never takes effect). | Establish BRICK_IMPORT_MECHANISM per step 4.3 — add a root pytest pythonpath, or make the root editable-installable. |
The following artifacts and conditions all hold:
migration/<PROJECT>/state.md exists and contains every key in the schema (empty values where N/A, but no missing keys).migration/<PROJECT>/manifest.md exists with all five sections (directory tree, module map, entrypoints, tests, infrastructure).INITIAL_BASE_NAME, ALIAS, GROUP, and the three CONVERT_* flags.RUN_TEST_CMD is set and runs successfully on the project's current code (the migration's baseline pass-rate), with the Python version reconciled (step 4.2).BRICK_IMPORT_MECHANISM is set and the workspace can import <TARGET_TOP_NS>.* (step 4.3).GIT_BRANCH and GIT_BASE_SHA are populated (from orchestrator Phase 0).After verification passes, commit this phase to the migration branch:
git add -A && git commit -m "migrate(<PROJECT>): phase <N> — discover"Substitute <PROJECT>, <N>, and <phase-name> from state.md and the orchestrator's phase table. Do not proceed to the next phase without a clean commit — the per-phase commit is the rollback point for the next phase's failure-mode tables.
© DavidVujic, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/polylith/migrate-project/polylith-migrate-discover of DavidVujic/python-polylith.
Open the folder on GitHubat commit a7a80f2
Polylith Migrate Discover next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Polylith Migrate Discover this skillDavidVujic/python-polylith | 553 | — | ~4.6k | Automated safety check: Pass | MIT | |
| Vercel Composition Patternssupabase/supabase | 111k | 59 repos | ~726 | Automated safety check: Pass | MIT | |
| Finishing a Development Branchobra/superpowers | 296k | 5 repos | ~1.9k | Automated safety check: Pass | MIT | |
| Typescript Advanced Typesrolling-scopes/rsschool-app | 10k | 25 repos | ~4.2k | Automated safety check: Pass | MPL-2.0 | |
| PR Babysitteropeninterpreter/openinterpreter | 69k | 3 repos | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Code Review ChecklistshareAI-lab/learn-claude-code | 78k | 5 repos | ~1.1k | Automated safety check: Pass | MIT |
supabase/supabase
React composition patterns that scale. An agent skill from supabase/supabase.
obra/superpowers
Walks the last step of a branch: confirm tests pass, detect the git environment, ask how to integrate, carry out your choice and clean up the worktree.
rolling-scopes/rsschool-app
Master TypeScript's advanced type system including generics, conditional types, mapped types, template literals, and utility types for building type-safe applications.
openinterpreter/openinterpreter
Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.
shareAI-lab/learn-claude-code
Reviews code against a five-part checklist covering security, correctness, performance, maintainability and testing, and reports findings in a fixed format.
onyx-dot-app/onyx
Iteratively improves a PR (GitHub), MR (GitLab), or shelved changelist (Perforce) until Greptile gives it a 5/5 confidence score with zero unresolved comments.
DavidVujic/python-polylith
Create a Polylith base with poly create base — the entry point of a deployable application (HTTP API, CLI, message-queue consumer, AWS Lambda handler, GCP Cloud Function, scheduled job).
DavidVujic/python-polylith
Validate a Polylith workspace with poly check — the canonical CI gate.
DavidVujic/python-polylith
Create a Polylith component with poly create component — a reusable, isolated brick implementing business logic, a feature, a domain module, or a capability.
DavidVujic/python-polylith
Add or manage third-party dependencies in a Polylith workspace.
DavidVujic/python-polylith
Visualize brick × brick dependencies with poly deps — find circular dependencies, inspect a brick's public interface, and detect interface-bypass violations.
DavidVujic/python-polylith
List Polylith bricks whose implementation changed since a git tag using poly diff.
Categories
[Internal sub-skill of polylith-migrate-orchestrator. An agent skill from DavidVujic/python-polylith. Polylith Migrate Discover is an agent skill from DavidVujic/python-polylith. [Internal sub-skill of polylith-migrate-orchestrator.
Polylith Migrate Discover fits situations like: development work in your project.
Run `npx skills add DavidVujic/python-polylith --skill polylith-migrate-discover -a claude-code`. Or copy the skill folder (.agents/skills/polylith/migrate-project/polylith-migrate-discover in DavidVujic/python-polylith) into .claude/skills/polylith-migrate-discover in your project. Claude Code loads it when a task matches its description.
Run `npx skills add DavidVujic/python-polylith --skill polylith-migrate-discover -a codex`. Or copy the skill folder (.agents/skills/polylith/migrate-project/polylith-migrate-discover in DavidVujic/python-polylith) into .agents/skills/polylith-migrate-discover in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add DavidVujic/python-polylith --skill polylith-migrate-discover -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/polylith-migrate-discover, .gemini/skills/polylith-migrate-discover, .github/skills/polylith-migrate-discover and .opencode/skills/polylith-migrate-discover in your project.
Going by SKILL.md and its folder, Polylith Migrate Discover needs the command-line tools its instructions call (uv, poetry, git, python, pip and make). Our summary lists: Python 3.
SKILL.md contains no URLs. Its commands use uv, git and pip, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Polylith Migrate Discover is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.6k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Polylith Migrate Discover: Vercel Composition Patterns (supabase/supabase, 111k stars), Finishing a Development Branch (obra/superpowers, 296k stars), Typescript Advanced Types (rolling-scopes/rsschool-app, 10k stars) and PR Babysitter (openinterpreter/openinterpreter, 69k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
DavidVujic (a GitHub user) maintains it in DavidVujic/python-polylith, which has 553 GitHub stars. The repository holds 37 skills in this directory. The repository was last updated on October 4, 2026.
Source: DavidVujic/python-polylith on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.