diff --git a/README.md b/README.md index f71d517..6ba0743 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ Codex と Cursor を併用する Python プロジェクト向けのテンプレ ## プロダクト方針と進捗管理 - プロダクト方針の正本は `docs/product/` に置く。 -- 各タスク設計は `関連ゴールID` / `関連マイルストーンID` を明記し、日々の実装を中長期目標へ接続する。 +- 各タスク設計は `関連ゴールID` / `関連マイルストーンID` を明記し、日々の実装をユーザー到達状態へ接続する。 - テンプレート利用開始時は、`python-project-bootstrap` の初期対話で `docs/product/*.md` をユーザーと擦り合わせて埋める。 `docs/product/` の役割: @@ -78,6 +78,25 @@ python3 scripts/sync_ai_context.py python3 scripts/sync_ai_context.py --check ``` +## 役割分担(誰が何をするか) + +| 区分 | ユーザー | エージェント | +| --- | --- | --- | +| 意思決定 | Vision、優先順位、受け入れ可否を決める | 判断材料を整理し、選択肢を提示する | +| 実作業 | 回答・承認・最終判断を行う | コマンド実行、ファイル編集、検証、差分整理を行う | +| リリース導線 | `commit` / `push` / `PR` 実行を依頼する | 依頼された Git 操作を実行し、結果を報告する | + +## 新規立ち上げフロー(実行者つき) + +| Step | ユーザーがやること | エージェントがやること | 成果物 | +| --- | --- | --- | --- | +| 1 | テンプレートから新規リポジトリを作成し clone する | 該当なし | ローカル作業ディレクトリ | +| 2 | 「初期化を進めて」と依頼する | `sync_ai_context.py --check` と bootstrap を実行する | 初期ファイル一式 | +| 3 | `docs/product` 擦り合わせ質問に回答する | `product-docs-alignment` に沿って 1〜3 問ずつ進行し、回答を反映する | `docs/product/*.md` 初期確定 | +| 4 | 開発タスクを依頼する | `docs/task-designs` に設計書を作成し、承認待ちにする | タスク設計書 | +| 5 | 設計内容を承認する | 実装・検証・差分説明を行う | 実装差分 | +| 6 | `commit & push` / `PR作成` を依頼する | Git 操作を実行し、URL/結果を共有する | PR | + ## 新しいプロジェクトの立ち上げ手順 1. テンプレートから新規リポジトリを作成し、ローカルへ clone する。 diff --git a/docs/ai/canonical/playbooks/python-project-bootstrap.md b/docs/ai/canonical/playbooks/python-project-bootstrap.md index 5e76b1b..5ac6fe2 100644 --- a/docs/ai/canonical/playbooks/python-project-bootstrap.md +++ b/docs/ai/canonical/playbooks/python-project-bootstrap.md @@ -33,7 +33,14 @@ description: 新しい Python プロジェクトの初期セットアップを - 未確定項目は既定値を勝手に固定せず、ユーザー確認を優先する。 - 既定値を使う場合は「既定値を採用した」と明示してから確定する。 -3. プロダクト方針(docs/product)を対話で初期確定する。 +3. 初期構成を生成する。 +- `scripts/playbooks/python-project-bootstrap/bootstrap_python_project.py` を実行して、ディレクトリと初期ドキュメントを生成する。 +- 例: + - `python3 scripts/playbooks/python-project-bootstrap/bootstrap_python_project.py --target --project-name --package-name --description ""` +- 必要に応じて `--task-design-dir docs/task-designs`(既定)や `--force` を使う。 +- 生成後に手順正本を `/docs/ai/canonical/playbooks/` に配置してコミットし、以後の実行基盤を repo ローカルへ固定する。 + +4. プロダクト方針(docs/product)を対話で初期確定する。 - `docs/ai/playbook-assets/python-project-bootstrap/references/product-docs-alignment.md` を使い、1〜3問ずつ擦り合わせる。 - 最低限、次を埋める。 - `docs/product/vision.md`: 対象ユーザー、解く課題、成功状態 @@ -42,13 +49,6 @@ description: 新しい Python プロジェクトの初期セットアップを - `docs/product/progress.md`: やるべきこと一覧ベースの現在地 - 不確定項目が残る場合は、`仮置き` と明記して次の確認タイミングを残す。 -4. 初期構成を生成する。 -- `scripts/playbooks/python-project-bootstrap/bootstrap_python_project.py` を実行して、ディレクトリと初期ドキュメントを生成する。 -- 例: - - `python3 scripts/playbooks/python-project-bootstrap/bootstrap_python_project.py --target --project-name --package-name --description ""` -- 必要に応じて `--task-design-dir docs/task-designs`(既定)や `--force` を使う。 -- 生成後に手順正本を `/docs/ai/canonical/playbooks/` に配置してコミットし、以後の実行基盤を repo ローカルへ固定する。 - 5. 生成内容をレビューする。 - `docs/ai/playbook-assets/python-project-bootstrap/references/project-structure.md` を基準に、`adapters/application/domain/ports` の責務分離を確認する。 - `docs/rules/solid/README.md` と `docs/rules/code_architecture/README.md` の導線が AGENTS.md から参照できることを確認する。 diff --git a/docs/ai/playbooks/python-project-bootstrap.md b/docs/ai/playbooks/python-project-bootstrap.md index a8c76d3..590e971 100644 --- a/docs/ai/playbooks/python-project-bootstrap.md +++ b/docs/ai/playbooks/python-project-bootstrap.md @@ -36,7 +36,14 @@ description: 新しい Python プロジェクトの初期セットアップを - 未確定項目は既定値を勝手に固定せず、ユーザー確認を優先する。 - 既定値を使う場合は「既定値を採用した」と明示してから確定する。 -3. プロダクト方針(docs/product)を対話で初期確定する。 +3. 初期構成を生成する。 +- `scripts/playbooks/python-project-bootstrap/bootstrap_python_project.py` を実行して、ディレクトリと初期ドキュメントを生成する。 +- 例: + - `python3 scripts/playbooks/python-project-bootstrap/bootstrap_python_project.py --target --project-name --package-name --description ""` +- 必要に応じて `--task-design-dir docs/task-designs`(既定)や `--force` を使う。 +- 生成後に手順正本を `/docs/ai/canonical/playbooks/` に配置してコミットし、以後の実行基盤を repo ローカルへ固定する。 + +4. プロダクト方針(docs/product)を対話で初期確定する。 - `docs/ai/playbook-assets/python-project-bootstrap/references/product-docs-alignment.md` を使い、1〜3問ずつ擦り合わせる。 - 最低限、次を埋める。 - `docs/product/vision.md`: 対象ユーザー、解く課題、成功状態 @@ -45,13 +52,6 @@ description: 新しい Python プロジェクトの初期セットアップを - `docs/product/progress.md`: やるべきこと一覧ベースの現在地 - 不確定項目が残る場合は、`仮置き` と明記して次の確認タイミングを残す。 -4. 初期構成を生成する。 -- `scripts/playbooks/python-project-bootstrap/bootstrap_python_project.py` を実行して、ディレクトリと初期ドキュメントを生成する。 -- 例: - - `python3 scripts/playbooks/python-project-bootstrap/bootstrap_python_project.py --target --project-name --package-name --description ""` -- 必要に応じて `--task-design-dir docs/task-designs`(既定)や `--force` を使う。 -- 生成後に手順正本を `/docs/ai/canonical/playbooks/` に配置してコミットし、以後の実行基盤を repo ローカルへ固定する。 - 5. 生成内容をレビューする。 - `docs/ai/playbook-assets/python-project-bootstrap/references/project-structure.md` を基準に、`adapters/application/domain/ports` の責務分離を確認する。 - `docs/rules/solid/README.md` と `docs/rules/code_architecture/README.md` の導線が AGENTS.md から参照できることを確認する。 diff --git a/scripts/playbooks/python-project-bootstrap/bootstrap_python_project.py b/scripts/playbooks/python-project-bootstrap/bootstrap_python_project.py index bfbe3ce..805e40e 100755 --- a/scripts/playbooks/python-project-bootstrap/bootstrap_python_project.py +++ b/scripts/playbooks/python-project-bootstrap/bootstrap_python_project.py @@ -27,6 +27,10 @@ / "references" / "_endpoint_template.md" ) +PRODUCT_VISION_TEMPLATE_PATH = REPO_ROOT / "docs" / "product" / "vision.md" +PRODUCT_GOALS_TEMPLATE_PATH = REPO_ROOT / "docs" / "product" / "goals.md" +PRODUCT_MILESTONES_TEMPLATE_PATH = REPO_ROOT / "docs" / "product" / "milestones.md" +PRODUCT_PROGRESS_TEMPLATE_PATH = REPO_ROOT / "docs" / "product" / "progress.md" def load_template(path: Path, fallback: str) -> str: @@ -354,117 +358,38 @@ def build_hexagonal_architecture_doc(package_name: str) -> str: def build_product_vision_template() -> str: """プロダクトビジョンの初期テンプレートを返す。""" - return """# プロダクトビジョン + fallback = """# プロダクトビジョン 最終更新: - -## 1. Vision Statement - -<このプロダクトが最終的に実現したい状態を1〜2文で記述する。> - -## 2. 対象ユーザー - -- <最優先ユーザー1> -- <最優先ユーザー2> - -## 3. 解決する課題 - -- <課題1> -- <課題2> - -## 4. 提供価値 - -- <価値1> -- <価値2> - -## 5. 成功状態 - -- <どの状態になれば「価値提供できた」と判断するか> - -## 6. Vision の再設定ルール - -- <どの条件で Vision を見直すか> - -## 7. 関連ドキュメント - -- ユーザー到達状態ゴール: `docs/product/goals.md` -- 到達ステップ: `docs/product/milestones.md` -- 現在地スコアボード: `docs/product/progress.md` """ + return load_template(PRODUCT_VISION_TEMPLATE_PATH, fallback) def build_product_goals_template() -> str: """ユーザー到達状態ゴールの初期テンプレートを返す。""" - return """# ユーザー到達状態ゴール + fallback = """# ユーザー到達状態ゴール 最終更新: - -## ゴール一覧 - -| Goal ID | ユーザーが到達したい状態 | 到達判定(Definition of Done) | 状態 | -| --- | --- | --- | --- | -| G-01 | <到達状態1> | <判定条件1> | Planned | -| G-02 | <到達状態2> | <判定条件2> | Planned | -| G-03 | <到達状態3> | <判定条件3> | Planned | - -## 運用ルール - -- ゴールは 3〜5 個に絞る。 -- 各ゴールは必ず「ユーザーが到達したい状態」で書く。 -- 各ゴールに `到達判定(Definition of Done)` を 1 つ以上持たせる。 """ + return load_template(PRODUCT_GOALS_TEMPLATE_PATH, fallback) def build_product_milestones_template() -> str: """到達ステップの初期テンプレートを返す。""" - return """# 到達ステップ + fallback = """# 到達ステップ 最終更新: - -## ステップ一覧 - -| Milestone ID | 対応 Goal ID | 到達ステップ | 完了条件 | 状態 | -| --- | --- | --- | --- | --- | -| M-01 | G-01 | <ステップ1> | <完了条件1> | Planned | -| M-02 | G-02 | <ステップ2> | <完了条件2> | Planned | -| M-03 | G-03 | <ステップ3> | <完了条件3> | Planned | - -## 運用ルール - -- マイルストーンは時期ではなく「到達ステップ」として管理する。 -- 各マイルストーンは必ず Goal ID に紐づける。 -- 完了したマイルストーンは削除せず、状態を `Done` に更新して履歴を残す。 """ + return load_template(PRODUCT_MILESTONES_TEMPLATE_PATH, fallback) def build_product_progress_template() -> str: """進捗スコアボードの初期テンプレートを返す。""" - return """# 進捗スコアボード + fallback = """# 進捗スコアボード 最終更新: - -## 更新ルール - -- 更新頻度: 状態変化があったタイミングで更新する。 -- 更新者: 該当 Goal に紐づくタスク設計を更新した担当者。 -- 記載単位: Goal ID 単位。 -- 進捗表示: `%` は使わず、「やるべきこと一覧」「完了済み」「未完了」「現在地」で記録する。 - -## Goal別進捗 - -### G-01: <ゴール名> - -**やるべきこと一覧** - -| Item ID | やるべきこと | 状態 | 根拠 | -| --- | --- | --- | --- | -| G01-I01 | <やるべきこと1> | Planned | <関連ファイル/リンク> | -| G01-I02 | <やるべきこと2> | Planned | <関連ファイル/リンク> | - -- 完了済み: -- 未完了: -- 現在地: <現状を1文で記述> """ + return load_template(PRODUCT_PROGRESS_TEMPLATE_PATH, fallback) def build_task_readme(task_design_dir: str) -> str: