curate-tests
Phase 2: Generate and discover tests, validate against real library. Only invoke when explicitly requested by the user or by the yoink orchestrator.
Phase 3: Dependency decomposition. Only invoke when explicitly requested by the user or by the yoink orchestrator.
$ npx -y skills add theogbrand/yoink --skill decompose --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/decomposeContext preview
The summary Claude sees to decide when to auto-load this skill.
Phase 3: Dependency decomposition. Only invoke when explicitly requested by the user or by the yoink orchestrator.
name: decompose description: "Phase 3: Dependency decomposition. Only invoke when explicitly requested by the user or by the yoink orchestrator." argument-hint: "[--package PACKAGE_NAME]"
> **Do not invoke this skill unless explicitly requested.** It is called by `/yoink:yoink` or 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 dequeueuv 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>&1Swap `{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__.pySeed the state file with placeholder values:
"${CLAUDE_SKILL_DIR}/scripts/activate-inner-yoink-loop.sh" --max-iterations 10Read `.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.
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.**
YOINK (You Only Implement Native Knowledge) is an AI agent that removes complex dependencies by reimplementing only what you need. YOINK is currently built as a Claude Code plugin that decomposes third-party dependencies into internal replacements.
Repo: theogbrand/yoink
Phase 2: Generate and discover tests, validate against real library. Only invoke when explicitly requested by the user or by the yoink orchestrator.
Scaffold project: clone repo, install real library. Only invoke when explicitly requested by the user or by the yoink orchestrator.