verify について
verify は Consumer リポジトリ向けの検証スキルで、共有の既定設定とリポジトリ単位の上書きからチェック段階を定義します。フックと CI が同じ統合設定を使い、継承、予算、ティア、対象パスに対応します。
主な機能
- 01段階ごとの検証ステップ設定
- 02共有既定値とリポジトリ設定の統合
- 03段階の継承とステップの置換・削除
- 04ティアと対象パスによるステップの省略
- 05チェック予算の設定と監査の実行
活用シーン
- 01ローカルのプッシュフックと CI チェックの整合
- 02段階別のテストとビルドの割り当て
- 03リポジトリ固有の検証ステップの追加・変更
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ timschoch/ skilly --skill verifyインストール後、Claude Code で/verifyを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/verify.jsonscripts/audit.mjsblock-destructive-git.shblock-invalid-branch-push.shblock-unverified-push.shcheck-branch-name.mjscheck-commit-msg.mjscheck-push-branch.mjsdefault-branch.mjsmerge-config.mjsrun-changed-tests.mjsverify.mjs詳細
検証
references/verify.json にデフォルトのステップが定義されています。Sync により、すべての Consumer で最新の状態に保たれます。.skilly/verify.json には、リポジトリで変更する内容だけを記述します。フックと CI はマージ済み設定のステージを呼び出すため、ローカルのゲートとパイプラインで、何を成功とするかに食い違いが生じません。
使い方
node .agents/skills/verify/scripts/verify.mjs <stage> # run the stage
node .agents/skills/verify/scripts/verify.mjs <stage> --steps # resolved steps as JSON, runs nothing
node .agents/skills/verify/scripts/verify.mjs --config # merged config as JSON, runs nothing
Consumer 内のどこからでも実行できます。終了コードは、成功時は 0、設定または使用法のエラー時は 2、それ以外の場合は失敗したステップのコードです。
設定
両方のファイルの形式は次のとおりです。
{
"budgetTicket": "https://github.com/owner/repo/issues/1",
"stages": {
"commit": { "budgetSeconds": 10, "steps": [{ "name": "lint-staged", "run": "npx lint-staged", "why": "the reason this step exists" }] },
"push": { "extends": "commit", "budgetSeconds": 120, "steps": [] },
"ci": { "extends": "push", "budgetSeconds": 600, "steps": [] },
"nightly": { "tier": "product", "budgetSeconds": 1800, "steps": [{ "name": "e2e", "run": "npm run e2e", "target": "e2e" }] }
}
}
extends は累積されます。push は、まずすべての commit ステップを実行します。ステージで継承したステップをスキップするには、設定でそのステップを指定します。
| フィールド | 対象 | 効果 |
|---|---|---|
"replaces": "unit (changed)" | ステップ | このステップの実行時に、指定したステップを除外します。unit が変更されたテストを実行するため、各テストは一度だけ実行されます |
"without": ["unit", "e2e smoke"] | ステージ | 指定した継承済みのステップを除外します |
ステージ
| ステージ | 実行内容 | 呼び出し元 |
|---|---|---|
commit | デフォルトでは何も実行しません | pre-commit が lint-staged を直接呼び出します |
push | ブランチ名、命名、型チェック、unit (changed) | pre-push フック |
ci | push、lint、全 unit、ビルド、監査、e2e smoke | PR 上の CI。PR で pr を実行するリリース PR 上の CI |
pr | 全 unit と e2e smoke を除いた ci | リリース PR と nightly があるプロダクトリポジトリの PR 上の CI |
nightly | 全 unit、e2e full、依存関係のドリフト、セキュリティスキャン | nightly ワークフロー、プロダクト階層 |
pr には、このカバレッジが必要です。main への各マージは、リリース PR と nightly で全スイートを通過します。setup-repo の ci.yml テンプレートは、両方が存在する場合にのみ pr を選択します。
変更されたテスト
unit (changed) は scripts/run-changed-tests.mjs を実行します。つまり、--changed <base> を指定したテストコマンドを実行します。ただし、差分に fullSuiteTriggers のパスが含まれる場合は、全スイートを実行します。Vitest がたどるのはインポートのみで、ロックファイルやマイグレーションをインポートするテストはありません。
{ "fullSuiteTriggers": ["drizzle/"] }
| トリガー | 一致条件 |
|---|---|
drizzle/ | git ルートから見た、そのフォルダー内の各ファイル |
package.json | 任意の深さにある、そのファイル名 |
vitest.config.* | * は 1 つのパスセグメント内の任意の文字列 |
src/schema.sql | そのパス |
.skilly/verify.json のリストはデフォルトに追加されます。"-package.json" は 1 つの項目を除外します。
予算は警告を出しますが、失敗にはしません。遅さを理由に失敗するゲートは、ゲートを回避することを促し、その回避策は遅さが解消した後も残ります。budgetTicket は、予算を超えたステージを分割する際の担当先を示します。
オーバーライド
.skilly/verify.json はデフォルト設定にマージされます(scripts/merge-config.mjs)。ステップはステージごとに name で照合されます。
| リポジトリのファイル | 効果 |
|---|---|
{ "name": "lint", "run": "pnpm lint" } | デフォルトの lint ステップを変更し、その他のフィールドはそのまま保持します |
"-lint" | デフォルトの lint ステップを除外します |
{ "name": "docs", "run": "…" } | デフォルトの後にステップを追加します |
ステージに対する "budgetSeconds": 60 | デフォルトを置き換えます |
unit をオーバーライドする場合、unit が unit (changed) を置き換えるため、毎回全スイートを実行する必要があります。条件に応じてのみスイートを実行するオーバーライドでは、"replaces": null を設定してください。
このファイルは省略可能です。--config または <stage> --steps で結果を確認してください。
階層
.skilly/config.json の tier はデフォルトで sandbox で、順序は sandbox < tool < product です。ステップの tier は、そのステップを実行するためにリポジトリに必要な最低階層です。それより下の階層では、ステップはスキップされます。ステージの tier は、ステージ全体に対して同じルールを適用します。それより下の階層では何も実行されず、終了コードは 0 です。階層が定めるのはカバレッジの範囲であり、基準ではありません。
対象
ステップの target は、リポジトリのルートからの相対パスです。対象が存在しない場合、ステップはスキップされます。これにより、すべてのリポジトリに e2e/ や Dockerfile があるとは限らなくても、1 つのステージリストで対応できます。
監査
audit ステップ(scripts/audit.mjs)は、重大度が高またはクリティカルのアドバイザリがあると失敗します。yarn.lock が存在する場合は yarn audit(yarn 1)を実行し、存在しない場合は npm audit を実行します。修正バージョンがないアドバイザリは、.skilly/verify.json のステップの accept リストに追加します。
{ "stages": { "ci": { "steps": [{ "name": "audit", "accept": [{ "id": "GHSA-vfj7-8cjw-p6xm", "why": "braces, no fix, dev only" }] }] } } }
エントリには id と why の両方が必要です。どちらかが欠けていると、何も許容されません。GitHub が監査で一致した範囲に修正バージョンを掲載した時点、または監査でアドバイザリが検出されなくなった時点で、ステップは失敗します。その時点でエントリを削除してください。このステップがファイルを編集することはないため、ローカルゲートと CI で同じ結果になります。
フックスクリプト
ゲートとガードはここで管理されるため、各 Sync PR で更新されます。/setup-repo(setup-project バンドル)がこれらを設定します。リポジトリにコピーしないでください。
| スクリプト | 実行元 | ブロックするもの |
|---|---|---|
| check-commit-msg.mjs | commit-msg | Conventional Commits に準拠しないコミットヘッダー |
| check-push-branch.mjs | pre-push | trunk への直接プッシュ |
| check-branch-name.mjs | branch name ステップ | <type>/<description> という名前ではないブランチ |
| block-destructive-git.sh | Claude Code PreToolUse | reset --hard、clean -f、branch -D、オプションのない push --force |
| block-invalid-branch-push.sh | Claude Code PreToolUse | git フックがインストールされていない場合も含め、不適切なブランチ名からのエージェントによるプッシュ |
| block-unverified-push.sh | Claude Code PreToolUse | push ステージを省略するエージェントによるプッシュ |
チェックの追加
チェックは1つのステップとして追加し、フックやワークフローに行を追加しないでください。このリポジトリだけに必要なチェックは .skilly/verify.json に追加します。すべての Consumer に必要なチェックは、ハブの bundles/workflow/skills/verify/references/verify.json に追加します。why を指定してください。ステップが失敗した瞬間に表示されるため、読み手が理由を探しに行く可能性が最も低いタイミングで伝えられます。