Install Migrate To Shoehorn
Pick your agent. Every command is ready to paste.
npx skills add vinvcn/mattpocock-skills-zh-CN --skill migrate-to-shoehornThe open skills CLI detects your agents (Claude Code, Cursor, Codex and 70+ more) and installs to the right folder. Add -g to install globally.
01
Install it
Run the command above, or upload the folder in Claude.
02
Ask naturally
Describe the task. Your agent loads migrate-to-shoehorn when the request matches its description.
03
Name it if needed
If it does not trigger, say “use the migrate-to-shoehorn skill”. In Codex, type $migrate-to-shoehorn.
迁移到 Shoehorn
为什么用 shoehorn?
shoehorn 允许你在 tests 中传入 partial data,同时保持 TypeScript 满意。它用 type-safe alternatives 替换 as assertions。
只用于 test code。 永远不要在 production code 中使用 shoehorn。
Tests 中 as 的问题:
- 经过训练,不去使用它
- 必须手动指定 target type
- 对故意错误的数据需要 double-as(
as unknown as Type)
安装
npm i @total-typescript/shoehorn
迁移模式
只需要少数属性的大型 objects
Before:
type Request = {
body: { id: string };
headers: Record<string, string>;
cookies: Record<string, string>;
// ...20 more properties
};
it("gets user by id", () => {
// Only care about body.id but must fake entire Request
getUser({
body: { id: "123" },
headers: {},
cookies: {},
// ...fake all 20 properties
});
});
After:
import { fromPartial } from "@total-typescript/shoehorn";
it("gets user by id", () => {
getUser(
fromPartial({
body: { id: "123" },
}),
);
});
as Type → fromPartial()
Before:
getUser({ body: { id: "123" } } as Request);
After:
import { fromPartial } from "@total-typescript/shoehorn";
getUser(fromPartial({ body: { id: "123" } }));
as unknown as Type → fromAny()
Before:
getUser({ body: { id: 123 } } as unknown as Request); // wrong type on purpose
After:
import { fromAny } from "@total-typescript/shoehorn";
getUser(fromAny({ body: { id: 123 } }));
何时使用哪一个
| Function | Use case |
|---|---|
fromPartial() |
传入仍能 type-check 的 partial data |
fromAny() |
传入故意错误的数据(保留 autocomplete) |
fromExact() |
强制 full object(之后可换成 fromPartial) |
工作流
Gather requirements - 询问用户:
- 哪些 test files 中的
asassertions 造成问题? - 是否在处理大型 objects,但只关心部分 properties?
- 是否需要传入故意错误的数据来测试 error paths?
- 哪些 test files 中的
Install and migrate:
- Install:
npm i @total-typescript/shoehorn - 查找 test files 中的
asassertions:grep -r " as [A-Z]" --include="*.test.ts" --include="*.spec.ts" - 用
fromPartial()替换as Type - 用
fromAny()替换as unknown as Type - 添加来自
@total-typescript/shoehorn的 imports - 运行 type check 验证
- Install:
Tips for Migrate To Shoehorn
- • Start a fresh session after installing so your agent picks up the new skill.
- • It is part of a pack with 30 skills. Install only the ones you need with --skill to keep triggers precise.
- • If two skills overlap, mention the one you want by name.
Questions about Migrate To Shoehorn
What does the Migrate To Shoehorn skill do?
将测试文件从 `as` 类型断言迁移到 @total-typescript/shoehorn。适用于用户提到 shoehorn、想替换测试中的 `as`,或需要局部测试数据时。
How do I install Migrate To Shoehorn?
Run "npx skills add vinvcn/mattpocock-skills-zh-CN --skill migrate-to-shoehorn" in your project. The skills CLI installs it for Claude Code, Cursor, Codex and 70+ other agents. In Claude on the web, upload the skill folder as a ZIP under Customize > Skills.
Does Migrate To Shoehorn work in Cursor and Codex?
Yes. Migrate To Shoehorn uses the open SKILL.md format, so it works in Claude Code, Claude, Cursor, OpenAI Codex, Gemini CLI, GitHub Copilot and other agents that support agent skills.
Is Migrate To Shoehorn free?
Migrate To Shoehorn is open source on GitHub under the MIT license. It is free to install; check the license before commercial use.
Who made Migrate To Shoehorn?
Migrate To Shoehorn is published by vinvcn in the vinvcn/mattpocock-skills-zh-CN repository, together with 29 other skills.





