From yoink
Decomposes Python package dependencies into sub-packages via queue-based evaluation, test verification, import rewriting, and inner implementation loops. For yoink workflow phase 3.
How this skill is triggered — by the user, by Claude, or both
Slash command
/yoink:decomposeThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> **Do not invoke this skill unless explicitly requested.** It is called by `/yoink:yoink` or run standalone by the user.
Do not invoke this skill unless explicitly requested. It is called by
/yoink:yoinkor run standalone by the user.
Prerequisite: /yoink:curate-tests must have been completed first.
Seed the decomposition queue with the target package:
uv run python ${CLAUDE_SKILL_DIR}/scripts/decomp.py enqueue <PACKAGE_NAME>
Then run the decomposition loop below until the queue is empty.
Begin loop. Repeat until the queue is empty.
uv run python ${CLAUDE_SKILL_DIR}/scripts/decomp.py dequeue
uv remove <PACKAGE_NAME>
Use the yoink:decomp-evaluator agent to evaluate whether the dequeued library should be kept or decomposed.
Pass input as JSON:
{
"library_name": "<DEQUEUED_LIBRARY>",
"package_name": "yoink_<PACKAGE_NAME>"
}
Complete these steps IN ORDER before entering the loop.
Exception: When the dequeued item is
{original_package}(the first item in the queue), skip steps 3a–3c and go straight to 3d. Baseline verification (3a) was already completed by/yoink:curate-tests, scaffolding (3c) was already done by/yoink:setup, and import rewriting (3b) is a no-op for the original package since there are no sub-package imports to rewrite yet.
Run the top-level generated tests:
uv run ${CLAUDE_PLUGIN_ROOT}/scripts/run_tests.py --project-dir . 2>&1
Swap {sub_package} imports in yoink_{top_package}/ source code to point at yoink_{sub_package}:
uv run ${CLAUDE_PLUGIN_ROOT}/scripts/rewrite_imports.py --package {sub_package} --target-dir yoink_{top_package}
mkdir -p yoink_{sub_package}
touch yoink_{sub_package}/__init__.py
Seed the state file with placeholder values:
"${CLAUDE_SKILL_DIR}/scripts/activate-inner-yoink-loop.sh" --max-iterations 10
Read .claude/decomp_context.md and fill in the PLACEHOLDER values in the JSON block inside .claude/inner-yoink-loop.local.md:
| Field | Where to get the value |
|---|---|
| top_package | {top_package} |
| sub_package | {sub_package} |
| category | from decomp_context.md |
| strategy | from decomp_context.md |
| functions_to_replace | JSON array of strings from decomp_context.md |
| reference_material | from decomp_context.md, default: .yoink/reference/{sub_package}/ |
| acceptable_sub_dependencies | JSON array of strings from decomp_context.md |
Use the yoink:decomp-implementer agent to implement the sub-package.
DONE then proceed to step 5.MAX_ITERATIONS_REACHED then stop the loop and report back to the user that the maximum number of iterations has been reached.DONE then spin up a new yoink:decomp-implementer agent to continue the task.Using new_imports from the implementer's output, enqueue external libraries that yoink_<PACKAGE>/ now depends on:
uv run python ${CLAUDE_SKILL_DIR}/scripts/decomp.py enqueue <lib1> <lib2> ...
Only enqueue what yoink_<PACKAGE>/ actually imports, not the full dependency tree of the original library. Use uv run python ${CLAUDE_SKILL_DIR}/scripts/decomp.py deps <library> to see pip dependencies as reference.
Loop back to step 1.
npx claudepluginhub theogbrand/yoink --plugin yoinkCurates tests then decomposes dependencies in Python packages via sequential pipeline: setup (clone/install), test curation (discover/validate/rewrite), decompose. Python only.
Decomposes large tasks (migrations, multi-issue fixes, big features) into parallel work packages with quality gates. Useful for reducing PR cycle time and avoiding merge conflicts.
Evaluates dependencies before npm/pip install: assesses bundle size, tree-shaking, maintenance, vulnerabilities, docs, alternatives, and recommends add, reject, or implement internally.