hairy
Hairy が定めた、Web開発におけるこだわりの指針とベストプラクティスを提供するスキルです。プロジェクトの設計・実装方針に迷った際に、Hairy の見解に基づいた推奨アプローチを参照できます。
description の原文を見る
Hairy's {Opinionated} preferences and best practices for web development
SKILL.md 本文
Hairyf の選好設定
このスキルは、web開発に対する Hairyf の好みのツール、設定、ベストプラクティスをカバーしています。このスキルは主観的です。
クイックサマリー
| カテゴリ | 選好設定 |
|---|---|
| パッケージマネージャー | pnpm |
| 言語 | TypeScript (strict mode) |
| モジュールシステム | ESM ("type": "module") |
| Linting & Formatting | @antfu/eslint-config (Prettier なし) |
| テスト | Vitest |
| Git Hooks | simple-git-hooks + lint-staged |
| ドキュメンテーション | VitePress (docs/ 内) |
グローバル選好設定
可能な限り尊重すべき、高レベルで横断的な選好設定:
"specify" キーワード
タスクが "specify" でマークされている場合(例:「このリポジトリを hairy に合わせて specify する」):
- 現在のプロジェクトを検査し、これらの選好設定に合致するまで最適化するリクエストとして扱う。
- 具体的には、以下をトリガーする必要があります:
@skills/arch-upkeepと関連するarch-*スキルを使用したアーキテクチャ検出とアップグレード計画。- 選好設定を考慮したスタック選択(
@skills/unjsを使用して unjs エコシステムを優先)。 @skills/tazeを使用した依存関係の鮮度チェックとアップグレード。- "specify" タスクが完了したと判断する前に、
lint+typecheck(存在する場合はテスト)の最終パス。
unjs エコシステムフレームワークを優先する
- フレームワークやランタイムを選択する場合(SSR、API、ツーリング、dev サーバーなど)、最初に unjs エコシステムプロジェクトを優先します(例:Nuxt、Nitro、h3、unstorage、unplugin、unocss、ofetch、その他 unjs 管理ツール)。
- 明確で正当な理由(機能の不足、エコシステムの制約、またはレガシー要件)がある場合のみ、non-unjs オプションにフォールバックします。
- 具体的な選択、レシピ、デフォルトについては、
@skills/unjsに委譲し、その推奨事項に従います。
アーキテクチャは arch-* スキルにマップする必要がある
- プロジェクトのアーキテクチャは常に標準的な
arch-*スタック(tsdown library、CLI、monorepo、unplugin、webext、vscode など)のいずれかにマップすべきです。 - 現在の形状がターゲットのいずれかにきれいにマップしない場合、それをアップグレード機会として扱い、アドホック構造を追加する代わりに移行を計画します。
@skills/arch-upkeepを使用して:- 現在のアーキテクチャを検出する。
- 最適なターゲット
arch-*スキルを選択する。 - そのアーキテクチャへの段階的な移行をオーケストレーションする。
taze で依存関係を新鮮に保つ
- 依存関係は大きなリファクタの際だけでなく、継続的に新鮮に保つべきです。
taze(@skills/tazeを参照)を使用して以下を推奨します:- 古い依存関係を監査する。
- 制御されたアップグレードを実行する(定期的にマイナー/パッチ、メジャーは明示的なレビューで)。
- pnpm ワークスペースとカタログを使用してモノレポ全体のバージョンを調整する。
tazeの提案に従わない特定の理由がない限り、package.jsonのバージョンを手で編集することは避けます。
常に lint + typecheck で終了する
- 非自明な変更(機能、リファクタ、設定変更、依存関係アップグレード、CI 変更など)を実装した後、常に lint と typecheck を実行してからタスク完了と判断します。
- 標準スクリプト:
nr lint→@antfu/eslint-config経由の ESLint。nr typecheck→ strict mode の TypeScript(プロジェクト全体)。
- CI と Git hooks の場合:
- pre-commit hooks が少なくともステージファイルで
lintを実行していることを確認。 - GitHub Actions(またはその他の CI)が PR とメインへのプッシュで
lintとtypecheckの両方を実行していることを確認。
- pre-commit hooks が少なくともステージファイルで
コアスタック
パッケージマネージャー(pnpm)
パッケージマネージャーとして pnpm を使用します。
モノレポセットアップの場合は、pnpm ワークスペースを使用します:
# pnpm-workspace.yaml
packages:
- 'packages/*'
pnpm-workspace.yaml で pnpm の名前付きカタログを使用して依存関係バージョンを管理します:
| カタログ | 目的 |
|---|---|
prod | 本番環境の依存関係 |
inlined | バンドラーによってインライン化される依存関係 |
dev | 開発ツール(linter、bundler、testing、dev-server) |
frontend | フロントエンドにバンドルされるフロントエンドライブラリ |
カタログ名は上記に限定されず、必要に応じて調整できます。デフォルトカタログの使用は避けます。
@antfu/ni
統一されたパッケージマネージャーコマンドに @antfu/ni を使用します。ロックファイルに基づいてパッケージマネージャー(pnpm/npm/yarn/bun)を自動検出します。
| コマンド | 説明 |
|---|---|
ni | 依存関係をインストール |
ni <pkg> | 依存関係を追加 |
ni -D <pkg> | dev 依存関係を追加 |
nr <script> | スクリプトを実行 |
nu | 依存関係をアップグレード |
nun <pkg> | 依存関係をアンインストール |
nci | クリーンインストール(pnpm i --frozen-lockfile のような動作) |
nlx <pkg> | パッケージを実行(npx のような動作) |
コマンドが見つからない場合は、pnpm i -g @antfu/ni でグローバルインストールしてください。
TypeScript(Strict Mode)
strict mode を有効にした TypeScript を常に使用します。
{
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"moduleResolution": "bundler",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true
}
}
ESM(ECMAScript Modules)
常に ESM モードで作業します。package.json に "type": "module" を設定します。
コード品質
ESLint(@antfu/eslint-config)
フォーマットと linting の両方に @antfu/eslint-config を使用します。これにより Prettier が不要になります。
// @ts-check コメント付きで eslint.config.js を作成します:
// @ts-check
import antfu from '@antfu/eslint-config'
export default antfu()
package.json にスクリプトを追加します:
{
"scripts": {
"lint": "eslint ."
}
}
linting エラーが発生した場合、nr lint --fix で修正してみてください。lint:fix スクリプトは追加しません。
Git Hooks(simple-git-hooks + lint-staged)
pre-commit linting に simple-git-hooks と lint-staged を使用します:
{
"simple-git-hooks": {
"pre-commit": "pnpm i --frozen-lockfile --ignore-scripts --offline && npx lint-staged"
},
"lint-staged": {
"*": "eslint --fix"
},
"scripts": {
"prepare": "npx simple-git-hooks"
}
}
ユニットテスト(Vitest)
ユニットテストに Vitest を使用します。
{
"scripts": {
"test": "vitest"
}
}
規約:
- テストファイルをソースファイルの隣に配置:
foo.ts→foo.test.ts(同じディレクトリ) - 高レベルのテストは各パッケージの
tests/ディレクトリに配置 testではなくdescribeとitAPI を使用- アサーションに
expectAPI を使用 - TypeScript null assertions には
assertのみを使用 - 複雑な出力アサーションには
toMatchSnapshotを使用 - 言語固有の出力には
toMatchFileSnapshotを明示的なファイルパスと拡張子で使用(それらのファイルを linting から除外)
プロジェクトセットアップ
パブリッシング(ライブラリプロジェクト)
ライブラリプロジェクトの場合、bumpp でトリガーされた GitHub Releases を通じてパブリッシュします:
{
"scripts": {
"release": "bumpp -r"
}
}
ドキュメンテーション(VitePress)
ドキュメンテーションに VitePress を使用します。ドキュメントを docs/ ディレクトリ配下に配置します。
docs/
├── .vitepress/
│ └── config.ts
├── index.md
└── guide/
└── getting-started.md
package.json にスクリプトを追加します:
{
"scripts": {
"docs:dev": "vitepress dev docs",
"docs:build": "vitepress build docs"
}
}
参考資料
グローバル選好設定
| トピック | 説明 | 参考資料 |
|---|---|---|
| unjs エコシステムを優先 | unjs エコシステムフレームワークとツーリングを優先、@skills/unjs に委譲 | core-unjs-preferences |
| arch-* 経由のアーキテクチャ | リポジトリの形状を標準的な arch-* スキルにマップし、arch-upkeep 経由でアップグレード | core-arch-upkeep-routing |
| taze で新鮮な依存関係 | taze を使用して依存関係を継続的に新鮮に保ち、制御されたアップグレードを実行 | core-deps-taze |
| Lint + typecheck をゲートとして | ローカルと CI で常に lint + typecheck で終了 | core-lint-typecheck |
プロジェクトセットアップ
| トピック | 説明 | 参考資料 |
|---|---|---|
| @antfu/eslint-config | フォーマットと linting 用の ESLint flat config | antfu-eslint-config |
| VS Code 拡張機能 | 開発推奨拡張機能 | vscode-extensions |
開発
| トピック | 説明 | 参考資料 |
|---|---|---|
| アプリ開発 | Vue/Vite/Nuxt/UnoCSS web アプリケーション向けの選好設定 | app-development |
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- hairyf
- リポジトリ
- hairyf/skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/hairyf/skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。