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.
npx claudepluginhub theogbrand/yoink --plugin yoinkThis skill uses the workspace's default tool permissions.
> **Do not invoke this skill unless explicitly requested.** It is called by `/yoink:yoink` or run standalone by the user.
Curates tests then decomposes dependencies in Python packages via sequential pipeline: setup (clone/install), test curation (discover/validate/rewrite), decompose. Python only.
Decomposes large changes, migrations, or multi-issue fixes into parallel work packages executed via independent subagents with quality gates to prevent conflicts.
Decomposes projects or tracks into modules with dependency mapping, diagrams, and implementation order. Updates architecture.md and generates token-optimized .ai-context.md.
Share bugs, ideas, or general feedback.
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.