diff --git a/.claude/commands/set-mode.md b/.claude/commands/set-mode.md new file mode 100644 index 0000000..8ac83b2 --- /dev/null +++ b/.claude/commands/set-mode.md @@ -0,0 +1,171 @@ +--- +name: set-mode +model: inherit +description: "開発モード(solo / team)を切り替える.チーム層ファイル・settings.json・CLAUDE.md・.claude/project-mode を一括で整合させる." +argument-hint: "" +--- + +あなたは開発モード切替の担当者です. +プロジェクトの開発モードを **solo(個人開発)↔ team(チーム開発)** で切り替え,モードに紐づくファイル一式を過不足なく整合させてください. + +`/sync-template` は「テンプレートの版を追従する」道具であり,モード遷移(ファイルの追加・削除,CLAUDE.md/settings.json の書き換え)は行いません.本コマンドがその遷移を担います. + +実行環境: bash(Git Bash または Unix シェル)が必要.`mktemp`, `rm -rf`, `cp`, シェル変数展開を使用する. + +テンプレート URL: `https://github.com/rintoHasegawa/programming-template.git` + +## チーム層ファイル (Team-layer Files) + +モードに応じて配置/削除する対象.`/sync-template` の「モード依存ファイル」と同一のリストに保つこと. + +``` +docs/01_GUIDE/GUIDE_06_チーム開発ルール.md +docs/01_GUIDE/GUIDE_07_Issues・Projects運用ガイド.md +.claude/commands/task-create.md +.claude/commands/task-start.md +.claude/commands/task-handoff.md +.claude/hooks/check_sync.sh +``` + +## ステップ 1: 事前確認 (Pre-check) + +1. `git status` でワーキングツリーがクリーンか確認する.未コミットの変更がある場合は「⚠ コミットされていない変更があります.先にコミットまたは stash してから再実行してください.」と伝えて中断する. +2. `$ARGUMENTS` を確認する.`solo` または `team` のいずれかであること.未指定・不正な値なら「切替先を `solo` または `team` で指定してください(例: `/set-mode team`)」と伝えて終了する. +3. 現在のモードを取得する(`.claude/project-mode` が無ければ `solo` 扱い): + ```bash + if [ -f .claude/project-mode ]; then CURRENT=$(tr -d '[:space:]' < .claude/project-mode); else CURRENT="solo"; fi + TARGET="$ARGUMENTS" # solo | team + ``` +4. `CURRENT == TARGET` の場合は「既に `$TARGET` モードです.変更はありません.」と伝えて終了する. + +## ステップ 2: ブランチ作成 (Branch) + +モード切替は共有設定(`CLAUDE.md` のルール部・`.claude/`)の変更を含むため,GUIDE_06「共有設定の扱い」に従い専用ブランチで行う. + +```bash +git checkout -b chore/set-mode-$TARGET +``` + +既に同名ブランチがあれば削除して作り直す.**本コマンドはコミットしない**(CLAUDE.md のルールに従い,取り込みは後で `/commit` で行う). + +## ステップ 3-A: solo → team(TARGET が team のとき) + +### 3-A.1 テンプレートから team 層ファイルを取得・配置 + +`/sync-template` の版差分では過去に追加済みの team 層ファイルを配置できないため,本コマンドはテンプレートを直接 clone して確実に配置する: + +```bash +TEMPLATE_URL="https://github.com/rintoHasegawa/programming-template.git" +TEMP_DIR=$(mktemp -d) +git clone --depth 1 "$TEMPLATE_URL" "$TEMP_DIR" + +# team 層ファイルをコピー(既存があっても最新版で上書き) +for f in \ + "docs/01_GUIDE/GUIDE_06_チーム開発ルール.md" \ + "docs/01_GUIDE/GUIDE_07_Issues・Projects運用ガイド.md" \ + ".claude/commands/task-create.md" \ + ".claude/commands/task-start.md" \ + ".claude/commands/task-handoff.md" \ + ".claude/hooks/check_sync.sh" ; do + mkdir -p "$(dirname "$f")" + cp "$TEMP_DIR/$f" "$f" +done +rm -rf "$TEMP_DIR" +``` + +### 3-A.2 settings.json に SessionStart(check_sync) を配線 + +`.claude/settings.json` を Read し,既存の `PreToolUse`(`restrict_repo_access.py`)を保持したまま,`SessionStart` フックを追加する(既に配線済みなら何もしない): + +```json +"SessionStart": [ + { + "hooks": [ + { "type": "command", "command": "bash .claude/hooks/check_sync.sh", "timeout": 10 } + ] + } +] +``` + +Edit 後に `git diff .claude/settings.json` で結果を確認する. + +### 3-A.3 CLAUDE.md を team 化 + +`CLAUDE.md` を Read し,`/setup` の Phase 7(team 化)および GUIDE_06 に合わせて以下を反映する(既に反映済みの項目は触らない): + +- **「開発進捗」節**を,進捗欄(最新 1 行)ではなく **Issues ポインタ**に置き換える(例:「進捗・タスクは GitHub Issues と git 履歴で追う(GUIDE_06).現在のタスクは `gh issue list` で確認する.`CLAUDE.md` には進捗を書かない.」). +- **「必須ルール(コード実装時)」に「チーム開発(GUIDE_06 準拠)」小節を追加**する(直列運用・Issue ベースのタスク管理・`/task-create`/`/task-start`/`/task-handoff` の案内・条件付きセルフマージ・共有設定変更は専用 PR+他メンバー 1 名 Approve 必須). +- **「Git 運用」小節**に,セッション開始時の `[sync-check]` 警告を必ず認識する旨の 1 行を追加する. +- **「ドキュメント」→「01_GUIDE」一覧**に `GUIDE_06`・`GUIDE_07` の行を追加する. + +Edit 後に `git diff CLAUDE.md` で結果を確認する. + +### 3-A.4 その他 + +- `.gitignore` に `.claude/settings.local.json` が無ければ追記する(個人設定用.GUIDE_06). +- `echo team > .claude/project-mode` でモードを記録する. + +## ステップ 3-B: team → solo(TARGET が solo のとき) + +clone は不要(ローカルの削除・書き換えのみ).**破壊的操作を含むため,実行前に対象ファイルの一覧と CLAUDE.md 差分の要約をユーザーに提示し,同意を得てから実行する**. + +### 3-B.1 team 層ファイルを削除 + +```bash +rm -f \ + "docs/01_GUIDE/GUIDE_06_チーム開発ルール.md" \ + "docs/01_GUIDE/GUIDE_07_Issues・Projects運用ガイド.md" \ + ".claude/commands/task-create.md" \ + ".claude/commands/task-start.md" \ + ".claude/commands/task-handoff.md" \ + ".claude/hooks/check_sync.sh" +``` + +### 3-B.2 settings.json から SessionStart(check_sync) を除去 + +`.claude/settings.json` を Read し,`check_sync.sh` を呼ぶ `SessionStart` フックのみを除去する.`PreToolUse`(`restrict_repo_access.py`)は保持する.他に個別追加された `SessionStart` フックがあれば残す(`check_sync.sh` の配線だけを外す).Edit 後に `git diff .claude/settings.json` で確認する. + +### 3-B.3 CLAUDE.md を solo 化 + +`CLAUDE.md` を Read し,team 化で加えた箇所を元の solo 既定へ戻す: + +- **「開発進捗」節**を solo 既定の骨組みに戻す.team 化で Issues ポインタになっているため,進捗欄(最新 1 行)+案内コメントの形へ置き換える: + ```markdown + ## 開発進捗 + + 最新: <直近の状況を 1 行.不明なら「(git 履歴 / 旧 Issue を参照)」> + ※ 本欄は**最新ステップ 1 行のみ上書き更新**.詳細な進捗履歴は docs/PROGRESS.md に追記する.運用ルールは GUIDE_05 参照. + ``` + 「最新」行に入れる現状はユーザーに確認する(team 期間の進捗は Issues / git 履歴にあるため,ここへ移し替える必要はない). +- **「チーム開発(GUIDE_06 準拠)」小節を削除**する. +- **「Git 運用」小節**の `[sync-check]` 警告の行を削除する. +- **「ドキュメント」→「01_GUIDE」一覧**から `GUIDE_06`・`GUIDE_07` の行を削除する(GUIDE_08 以降のプロジェクト固有ドキュメントがあれば残す). + +Edit 後に `git diff CLAUDE.md` で確認する. + +### 3-B.4 その他 + +- `echo solo > .claude/project-mode` でモードを記録する. +- `docs/PROGRESS.md` が無い場合は,solo 運用のため骨組みを用意するか確認する(テンプレート由来のファイルなので通常は存在する). + +## ステップ 4: 結果報告 (Report) + +以下を報告する: + +「**開発モードを `{CURRENT}` → `{TARGET}` に切り替えました.** + +- ブランチ: `chore/set-mode-{TARGET}` +- team 層ファイル: {配置した / 削除した} 一覧 +- `.claude/settings.json`: {SessionStart(check_sync) を追加 / 除去 / 変更なし} +- `CLAUDE.md`: {team 化 / solo 化} を反映 +- `.claude/project-mode`: `{TARGET}` + +内容を確認のうえ `/commit push` で取り込んでください. +{team に切り替えた場合: 「チーム運用の管理者初期設定(GitHub repo・CI 等)は GUIDE_06 を参照してください.共有設定の変更のため,他メンバー 1 名の Approve を得てからマージしてください(GUIDE_06).」}」 + +## 注意事項 (Notes) + +- 本コマンドは**コミットしない**.変更は `chore/set-mode-*` ブランチに未コミットで乗るので,`/commit` で取り込む. +- team ↔ solo の切替は共有設定の変更にあたる(GUIDE_06「共有設定の扱い」).team プロジェクトでは専用 PR+他メンバー 1 名 Approve を経てマージする. +- team 層ファイルのリストは `/sync-template` の「モード依存ファイル」と一致させること.どちらかを増減したら両方を更新する. +- solo→team で取得する team 層ファイルはテンプレート HEAD 版.版の細かな追従は以後の `/sync-template` に任せる(`template-sync-sha` は本コマンドでは変更しない). diff --git a/.claude/commands/setup.md b/.claude/commands/setup.md index ee36dd7..493f4b9 100644 --- a/.claude/commands/setup.md +++ b/.claude/commands/setup.md @@ -39,7 +39,7 @@ - **solo(個人開発)**: 1 人で開発する.進捗は `CLAUDE.md` の進捗欄+ `docs/PROGRESS.md` で追う. - **team(チーム開発)**: 複数人が Claude Code で開発する.進捗・タスクは GitHub Issues と git 履歴で追い,直列運用・条件付きセルフマージ等のチームルール(GUIDE_06)を適用する. -どちらにしますか?(後から変更もできます)」 +どちらにしますか?(後から `/set-mode ` で切り替えられます)」 確定したら以下を行う: diff --git a/.claude/commands/sync-template.md b/.claude/commands/sync-template.md index a8b9035..1e4d5d0 100644 --- a/.claude/commands/sync-template.md +++ b/.claude/commands/sync-template.md @@ -384,7 +384,7 @@ `.claude/project-mode` が存在せず `solo` 扱いにした場合は,末尾に次を添える: -「※ `.claude/project-mode` が未設定のため solo として同期しました.チーム開発なら `.claude/project-mode` に `team` と記入して再同期してください.」 +「※ `.claude/project-mode` が未設定のため solo として同期しました.チーム開発にする場合は `/set-mode team` を実行してください(`.claude/project-mode` を手で書き換えるだけでは team 層は配置されません).」 ## 注意事項 @@ -392,7 +392,7 @@ - コード修正はユーザーの確認なしに実行しない - マージ必須ファイル(`.gitignore`, `CLAUDE.md`, `docs/PROGRESS.md`, `.gitattributes`)は必ずステップ 5.4 の手順でマージする.盲目的な `cp` で上書きしない(フレームワーク固有の除外ルールやプロジェクト固有セクションが失われる) - 同期対象外ファイル(`README.md`)はテンプレート紹介用のためプロジェクトには反映しない.テンプレート側で追加・変更・削除があってもプロジェクトの該当ファイルは触らない -- チーム層ファイル(`GUIDE_06`/`GUIDE_07`/`task-*`/`check_sync.sh`)は `.claude/project-mode` が `team` のプロジェクトにのみ同期する.`solo`(または未設定)のプロジェクトには配置・更新・削除いずれもしない.team 開発に切り替える場合は `.claude/project-mode` を `team` に書き換えてから再同期すればチーム層が配置される(`/setup` を再実行して team を選び直してもよい) +- チーム層ファイル(`GUIDE_06`/`GUIDE_07`/`task-*`/`check_sync.sh`)は `.claude/project-mode` が `team` のプロジェクトにのみ同期する.`solo`(または未設定)のプロジェクトには配置・更新・削除いずれもしない.`/sync-template` は「版の追従」のみを行い,**モードの切り替えはしない**.solo↔team の切替は `/set-mode ` を使う(team 層ファイルの配置/削除・`settings.json` 配線・`CLAUDE.md` の team 化/solo 化・`project-mode` 更新を一括で行う).`.claude/project-mode` を手で書き換えるだけでは切り替わらない - `.claude/settings.json` はマージ必須ファイル.team の SessionStart(check_sync) 配線を保持したままテンプレートの hook 変更を統合する.盲目的な `cp` で上書きしない - 通常コピー対象でもプロジェクト固有の変更が上書きされうる場合は,`git diff` で確認してユーザーに報告する - テンプレートが管理するのは `.claude/` 配下のうち `agents/`,`commands/`,`hooks/`,`settings.json`,`template-sync-sha` のみ.`.claude/plans/` や `.claude/commit-context.md` 等のプロジェクト固有ファイルはテンプレートに含まれないため同期対象外 diff --git a/README.md b/README.md index 219101e..ffc91c9 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ その後 Claude Code を起動し,`/setup ` でプロジェクト立ち上げを開始する.`/setup` の冒頭で **solo / team のモードを選択**する(選択結果は `.claude/project-mode` に記録され,以降の `/sync-template` がモードに応じてチーム層ファイルを出し分ける).以降,テンプレートの更新を取り込むときは `/sync-template` を実行する. -> 個人で始めたプロジェクトを後からチーム開発に切り替える場合は,`.claude/project-mode` を `team` に書き換えて `/sync-template` を実行すれば,チーム層ファイル(GUIDE_06/07・`task-*`・`check_sync.sh`)が配置される.`/setup` を再実行して team を選び直してもよい. +> 途中でモードを切り替える場合は **`/set-mode `** を実行する.team 層ファイル(GUIDE_06/07・`task-*`・`check_sync.sh`)の配置/削除,`settings.json` の hook 配線,`CLAUDE.md` の team 化/solo 化,`.claude/project-mode` の更新を一括で整合させる(`.claude/project-mode` を手で書き換えるだけでは切り替わらない). ## 主なスラッシュコマンド @@ -40,6 +40,7 @@ - `/implement <タスク>` — 実装パイプライン(コーディング → テスト → リファクタリング) - `/commit` / `/commit push` — コミット作成(`push` でプッシュと PR 作成まで) - `/sync-template` — テンプレートの最新変更を取り込む +- `/set-mode ` — 開発モードを切り替える(team 層ファイル・settings.json・CLAUDE.md・project-mode を一括整合) - `/task-create` / `/task-start` / `/task-handoff` — **team モードのみ**.Issue ベースのタスク作成・着手・引継ぎ ## ドキュメント