migrate-to-shoehorn について
migrate-to-shoehornは、TypeScriptのテストファイルにある`as`アサーションを`@total-typescript/shoehorn`の関数に置き換えるエージェントスキルです。部分データ、意図的に不正なデータ、完全なオブジェクトに応じた関数の選び方と、移行後の型チェックを案内します。
主な機能
- 01テスト内の`as`を置き換え
- 02部分データに`fromPartial()`を使用
- 03不正データに`fromAny()`を使用
- 04完全なオブジェクトに`fromExact()`を使用
- 05移行後に型チェックを実行
活用シーン
- 01`as`アサーションを含むテストを移行
- 02部分オブジェクトを使ったテスト作成
- 03意図的な誤データでエラーをテスト
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ akillness/ jeo-skills --skill migrate-to-shoehornインストール後、Claude Code で/migrate-to-shoehornを入力して読み込まれたか確認します。
詳細
Shoehorn への移行
テストファイルの as 型アサーションを @total-typescript/shoehorn に移行します。ユーザーが shoehorn に言及した場合、テスト内の as を置き換えたい場合、または部分的なテストデータが必要な場合に使用します。
このスキルは mattpocock/skills(MIT)からインポートされており、アップストリームではモデルによって呼び出されます。
このスキルを使用するタイミング
- テストファイルの
as型アサーションを @total-typescript/shoehorn に移行します。 - ユーザーが shoehorn に言及した場合、テスト内の
asを置き換えたい場合、または部分的なテストデータが必要な場合に使用します。
手順
Shoehorn への移行
shoehorn を使う理由
shoehorn を使うと、TypeScript の型チェックを維持しながら、テストで部分的なデータを渡せます。as アサーションを型安全な代替手段に置き換えます。
テストコードのみで使用してください。 本番コードでは shoehorn を使用しないでください。
テストで as を使う場合の問題点:
asを使わないようにトレーニングされている- 対象の型を手動で指定する必要がある
- 意図的に誤ったデータには二重の
as(as unknown as Type)が必要
インストール
npm i @total-typescript/shoehorn
移行パターン
必要なプロパティが少ない大きなオブジェクト
移行前:
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
});
});
移行後:
import { fromPartial } from "@total-typescript/shoehorn";
it("gets user by id", () => {
getUser(
fromPartial({
body: { id: "123" },
}),
);
});
as Type → fromPartial()
移行前:
getUser({ body: { id: "123" } } as Request);
移行後:
import { fromPartial } from "@total-typescript/shoehorn";
getUser(fromPartial({ body: { id: "123" } }));
as unknown as Type → fromAny()
移行前:
getUser({ body: { id: 123 } } as unknown as Request); // wrong type on purpose
移行後:
import { fromAny } from "@total-typescript/shoehorn";
getUser(fromAny({ body: { id: 123 } }));
各関数の使い分け
| 関数 | 用途 |
|---|---|
fromPartial() | 型チェックを維持しながら部分的なデータを渡す |
fromAny() | 意図的に誤ったデータを渡す(オートコンプリートを維持) |
fromExact() | オブジェクト全体を必須にする(後で fromPartial に置き換える) |
ワークフロー
-
要件を確認する - ユーザーに尋ねます:
- 問題の原因となっている
asアサーションを含むテストファイルはどれですか? - 一部のプロパティだけが重要な大きなオブジェクトを扱っていますか?
- エラーテスト用に、意図的に誤ったデータを渡す必要がありますか?
- 問題の原因となっている
-
インストールして移行する:
- インストール:
npm i @total-typescript/shoehorn -
asアサーションを含むテストファイルを検索:grep -r " as [A-Z]" --include="*.test.ts" --include="*.spec.ts" -
as TypeをfromPartial()に置き換える -
as unknown as TypeをfromAny()に置き換える -
@total-typescript/shoehornからインポートを追加する - 型チェックを実行して確認する
- インストール:
例
- まず、このスキルを範囲を絞って適用し、出力が上記の形式と一致することを確認してから、タスク全体に適用します。
- 手順でリポジトリや環境の情報が必要な場合は、ユーザーに尋ねるのではなく、調べてください。
ベストプラクティス
- アップストリームの手順をそのまま維持し、変更が必要な場合は独自に判断して黙って進めず、明示的に記録してください。
- このスキルでユーザー自身が決定するものとして示されている判断点では、必ず停止してユーザーに制御を戻してください。
- 小さく元に戻せる変更を優先し、前提を埋もれさせずに明示してください。
参考資料
- アップストリームのスキル:
mattpocock/skillsskills/misc/migrate-to-shoehorn/SKILL.md(コミット3cca18b、MIT) - プロジェクトの標準:
.agent-skills/skill-standardization/SKILL.md - バリデータースクリプト:
.agent-skills/skill-standardization/scripts/validate_skill.sh
コメント
Markdown 対応