mcpField
S
safe-change

safe-change

github.com/rheinmir開発10264 回インストール2 週間前に更新
リポジトリ

safe-change について

safe-changeは、複数の呼び出し元が使う関数、クラス、モジュールを変更するためのコーディングスキルです。依存関係と現在の動作を確認し、最小限の変更、互換性確認、利用可能なテストの実行を進めます。

主な機能

  1. 01impact-checkで呼び出し元と依存先を把握
  2. 02変更前の観測可能な動作を記録
  3. 03タスクに必要なコードだけを変更
  4. 04すべての呼び出し元で互換性を確認
  5. 05既存テストがあれば実行

活用シーン

  1. 01共有関数のシグネチャを安全に変更
  2. 02複数の呼び出し元が使うモジュールを更新
  3. 03戻り値の型変更前に互換性を評価

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/rheinmir/setup --skill safe-change

インストール後、Claude Code で/safe-changeを入力して読み込まれたか確認します。

詳細

スキル:safe-change

WHAT

目的とコンテキスト
  • 目的: 複数の呼び出し元がある共有コード(関数/クラス/モジュール)を、既存の呼び出し元を壊さずに修正します。
  • 使用するタイミング: 複数箇所から呼び出される関数、クラス、モジュールを変更する場合。
  • 対象外: 隣接するコードをついでにリファクタリングしないこと、タスクの範囲外のテストを追加しないこと、impact-check の代わりに手作業で呼び出し元を探さないこと。
メンタルモデル

共有シンボル → impact-check(呼び出し元+依存先)→ 現在観察できる動作 → 最小限の変更 → 呼び出し元ごとに後方互換性を保つか、明示的に更新 → テスト(あれば)→「Changed X. Verified Y」→ verify-before-commit

入出力の契約
フィールド必須?意味
入力修正するシンボル/モジュール+変更要件はい複数の呼び出し元があるもの
入力モジュールのテストいいえあれば実行し、なければコミットメッセージに明記
出力最小限の変更+確認/更新済みの呼び出し元はいステップ1で見つかったすべての呼び出し元を検討済み
出力確認文「Changed X. Verified Y still works.」はいその後 verify-before-commit を呼び出す
出力wiki/sources/draft/DDMMYY-<ten>.mdはい(成果物が0件の場合を除く)出力レポート
ルールと機能
  • RULE-01(必須):後方互換性を保てない場合は、作業を続ける前にユーザーに伝えます。
  • RULE-02(必須):タスクで必要な箇所だけに触れます。ついでのリファクタリングは禁止です。
  • RULE-03(必須):テストがない場合は、その旨を記録して構いません。タスクの範囲外のテストは追加しません。
  • 機能:呼び出し元/依存先のグラフを照会する、タスクの範囲内でコードを読み取り・修正する、ローカルテストを実行する、Wiki の下書きを作成する。
失敗時の境界
  • 後方互換性を保てない → 確認:停止し、作業を続ける前にユーザーへ伝えます(RULE-01)。
  • 修正後にテストが失敗 → ブロック:verify-before-commit に進みません。
  • テストがない → 部分的な対応として許容:コミットメッセージに明記し、テストを自分で追加しません。

HOW

メインワークフロー
StepTypeInputsActionOutputs/exitFailure/next
W01deterministicシンボルスキル impact-check を実行呼び出し元+依存先の一覧—
W02judgment現在のコード観察可能な動作(戻り値、副作用)を記録動作のベースライン—
W03effect要件隣接するコードに触れず、最小限の変更を行う差分互換性を保てない → B01
W04judgmentW01 の呼び出し元呼び出し元ごとに、後方互換性を確認するか明示的に更新すべての呼び出し元を検討済み—
W05deterministicテストディレクトリテストを探し、あれば実行終了コード 0 または「no tests」の記録テスト失敗 → blocked、テストなし → B02
W06effect結果確認し、verify-before-commit を呼び出し、出力レポートを作成確認文+下書き—

各ステップの詳細(W01〜W06 の正とする情報源):

  1. impact-check スキルを実行し、すべての呼び出し元と依存先の一覧を取得します。
  2. 現在観察できる動作(戻り値、副作用)を記録します。
  3. 最小限の変更を行います。隣接するコードには触れません。
  4. ステップ1で見つかった呼び出し元ごとに、後方互換性を確認するか、呼び出し元を明示的に更新します。
  5. CHECK: ls <test-dir>/*<module>* 2>/dev/null | head -3 — テストがあれば RUN: <test-cmd>。なければコミットメッセージに明記します。
  6. 「Changed X. Verified Y still works.」と確認してから、verify-before-commit を呼び出します。
分岐
IDKindGuard行動スキップ/失敗再開先
B01recovery後方互換性を保てない停止し、作業を続ける前にユーザーへ伝えるユーザーが承認しない → cancelledユーザー承認後、W04
B02conditional_requiredモジュールのテストがないコミットメッセージに「no tests」と明記し、新しいテストは書かない—W06
検証と停止

次に進む条件:impact-check の一覧にあるすべての呼び出し元を検討済みであり、テストがある場合は終了コードが 0 であること。確認文と verify-before-commit で停止し、それ以上のリファクタリングは自分で行いません。

例
  • 成功例: 4 つの呼び出し元がある fetch_page() にオプションのパラメーター timeout=30 を追加 → impact-check で 4 つの呼び出し元を列挙し、いずれもパラメーターを渡していないため互換性あり → テストモジュールが成功 → 「fetch_page のシグネチャを変更しました。4 つの呼び出し元が引き続き動作することを確認しました。」 → コミット前に検証。
  • 境界/失敗例: get_user() の戻り値の型を dict から object に変更し、2 つの呼び出し元が user["id"] を使用 → 互換性を維持できない → 中止してユーザーに報告(B01)。承認を得る前に呼び出し元を修正しない。
納品 — 出力レポート

メインのスキルタスクがすべて完了したら、Wiki に提案の下書きを作成します。

手順

1. ファイル名を作成します:

  • 形式:DDMMYY-<ten>.md
  • DDMMYY = 今日の日付(例:2026 年 6 月 2 日の場合は 020626)
  • <ten> = 実施内容を要約する kebab-case の 2〜4 語(例:landing-page-coteccons、brand-kit-fintech、ingest-auth-spec)

2. llmwiki/wiki/sources/draft/DDMMYY-<ten>.md を作成します:

---
type: draft
title: "DDMMYY-<ten>"
status: proposed
tags: [<skill-name>, output-report]
timestamp: YYYY-MM-DD
---

# DDMMYY-<ten>
**Type:** draft
**Status:** proposed
**Tags:** <skill-name>, output-report
**Proposed:** YYYY-MM-DD

## What
<One sentence — what this skill invocation produced or decided>

## Output
<Key artefacts, files created/modified, or decisions made>

## Files
| File | Action |
|------|--------|
| `path/to/file` | created / modified |

## Notes
- Invoked via: `/<skill-name>` skill

## Origin
- **Draft:** `wiki/sources/draft/DDMMYY-<ten>.md`
- **Commit:** _(filled by verify-before-commit)_
- **Date promoted:** _(filled by verify-before-commit)_

3. Wiki のインデックスとログを更新します:

  • llmwiki/wiki/index.md — 1 行追加:| [DDMMYY-<ten>](sources/draft/DDMMYY-<ten>.md) | draft | YYYY-MM-DD |
  • llmwiki/wiki/log.md — 追加:## YYYY-MM-DD — <skill-name> — <ten>

スキルによって成果物も決定事項も一切生じない場合に限り、スキップします(例:/caveman-stats のような表示のみのモード)。

コメント